参考文献

[1]http://blog.csdn.net/wcj0626/article/details/38061223?c=ac6f159fad7177ce723a5358e13a336c

[2]http://bbs.csdn.net/topics/390738559

在android 设备上运行opencl ,步骤如下:

第一步、确认

这是最关键一步,首先是检查你的设备是否支持opencl (如果不支持,是无法运行的);

第二步、找到opencl库

在你的设备中找到支持opencl 的库(这个库通常位于/vendor/lib/libOpenCL.so );

第三步、建立动态库

把第二步中找到的库,pull出来,作为作为编译程序的动态库

第四步、引用 opencl 头文件

在android 工程中正常编写opencl 程序,引用opencl 头文件。

备注:android 编译的时候直接链接上面的库,在 Java端编译的时候用System.load()来载入该 opencl 库。

第五步、按照普通NDK程序运行

下面针对NokiaN1平板上的GPU编程进行简介。NokiaN1平板的GPU型号为PowerVRG6430,支持OpenCL1.2。

步骤一、连接手机到电脑,在终端运行:adb pull/system/vendor/lib/libPVROCL.so,此时会把手机里的libOpenCL.so拷贝到电脑当前文件夹下,把该文件拷贝到:android-ndk-r9d/platforms/android-14/arch-x86/usr/lib/(请自行选择拷贝到哪个版本下)

步骤二、下载OpenCL头文件

https://github.com/KhronosGroup/OpenCL-Headers/

步骤三、新建安卓工程,NDK开发。将头文件放到jni/CL文件夹下。

java代码:

1.  public class MainActivity extends ActionBarActivity {

2.

3.      static

4.     {

5.          System.loadLibrary("ocl");

6.     }

7.      public native String  testopencl();

8.     public native String getPlatformName();

9.      public native String getDeviceName();

10.    @Override

11.     protected void onCreate(Bundle savedInstanceState) {

12.        super.onCreate(savedInstanceState);

13.         setContentView(R.layout.activity_main);

14.

15.       TextView testView2=(TextView)findViewById(R.id.textView2);

16.      TextView testView4=(TextView)findViewById(R.id.textView4);

17.       TextView testView6=(TextView)findViewById(R.id.textView6);

18.      testView6.setText(testopencl());

19.       testView2.setText(getPlatformName());

20.       testView4.setText(getDeviceName());

21.

22.    }

23.

24.

25.

26.}

NDK代码:

1.  #include <jni.h>

2. #include <CL/cl.h>

3.  #include<malloc.h>

4. #include<stdio.h>

5.  #include<stdlib.h>

6. #include"com_example_ocl_MainActivity.h"

7.  #define LEN(arr) sizeof(arr) / sizeof(arr[0])

8. #define N 1024

9.  #define NUM_THREAD 128

10.

11. cl_uint num_device;

12.cl_uint num_platform;

13. cl_platform_id *platform;

14.cl_device_id *devices;

15. cl_int err;

16.cl_context context;

17.  cl_command_queue cmdQueue;

18. cl_mem buffer,sum_buffer;

19.  cl_program program ;

20. cl_kernel kernel;

21.  const char* src[] = {

22.         "  __kernel void redution(  \n"

23.          "  __global int *data,     \n"

24.         "  __global int *output,   \n"

25.          "  __local int *data_local   \n"

26.         "  )  \n"

27.         " {   \n"

28.         "  int gid=get_group_id(0);   \n"

29.          "  int tid=get_global_id(0);    \n"

30.         "  int size=get_local_size(0);   \n"

31.          "  int id=get_local_id(0);     \n"

32.         "  data_local[id]=data[tid];   \n"

33.          "  barrier(CLK_LOCAL_MEM_FENCE);   \n"

34.         "  for(int i=size/2;i>0;i>>=1){    \n"

35.          "      if(id<i){   \n"

36.         "          data_local[id]+=data_local[id+i];   \n"

37.          "      }   \n"

38.         "      barrier(CLK_LOCAL_MEM_FENCE);   \n"

39.          "  }    \n"

40.         "  if(id==0){    \n"

41.          "      output[gid]=data_local[0];   \n"

42.         "  }    \n"

43.         " }   \n"

44.

45.  };

46.int num_block;

47.

48.

49. int  test()

50.{

51.     int* in,*out;

52.     num_block=N/NUM_THREAD;

53.     in=(int*)malloc(sizeof(int)*N);

54.    out=(int*)malloc(sizeof(int)*num_block);

55.     for(int i=0;i<N;i++){

56.        in[i]=1;

57.     }

58.    Init_OpenCL();

59.     Context_cmd();

60.    Create_Buffer(in);

61.     Create_program();

62.    Set_arg();

63.     Execution();

64.    CopyOutResult(out);

65.     int sum=0;

66.    for(int i=0;i<num_block;i++){

67.         sum+=out[i];

68.    }

69.     return sum;

70.}

71.

72. JNIEXPORT jstring JNICALL Java_com_example_ocl_MainActivity_testopencl (JNIEnv * env, jobject thisobject)

73. {

74.    char result[10];

75.     sprintf(result,"%d\n",test());

76.     return env->NewStringUTF(result);

77. }

78. JNIEXPORT jstring JNICALL Java_com_example_ocl_MainActivity_getPlatformName(JNIEnv *env , jobject thisobject)

79.  {

80.         char buffer[1024];

81.          clGetPlatformInfo(platform[0],CL_PLATFORM_NAME,sizeof(buffer),buffer,NULL);

82.        return env->NewStringUTF(buffer);

83.  }

84. JNIEXPORT jstring JNICALL Java_com_example_ocl_MainActivity_getDeviceName(JNIEnv *env , jobject thisobject)

85.  {

86.

87.      char buffer[1024];

88.     clGetDeviceInfo(devices[0],CL_DEVICE_NAME,sizeof(buffer),buffer,NULL);

89.     return env->NewStringUTF(buffer);

90. }

91.

92. void Init_OpenCL()

93.  {

94.     size_t nameLen1;

95.      char platformName[1024];

96.

97.      err = clGetPlatformIDs(0, 0, &num_platform);

98.     platform=(cl_platform_id*)malloc(sizeof(cl_platform_id)*num_platform);

99.      err = clGetPlatformIDs(num_platform, platform, NULL);

100.

101.      err=clGetDeviceIDs(platform[0],CL_DEVICE_TYPE_GPU,0,NULL,&num_device);

102.     devices=(cl_device_id*)malloc(sizeof(cl_device_id)*num_device);

103.      err=clGetDeviceIDs(platform[0],CL_DEVICE_TYPE_GPU,num_device,devices,NULL);

104.

105.  }

106.

107.  void Context_cmd()

108. {

109.      context=clCreateContext(NULL,num_device,devices,NULL,NULL,&err);

110.     cmdQueue=clCreateCommandQueue(context,devices[0],0,&err);

111.  }

112.

113.  void Create_Buffer(int *data)

114. {

115.

116.     buffer=clCreateBuffer(context,CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR,sizeof(int)*N,data,&err);

117.      sum_buffer=clCreateBuffer(context,CL_MEM_WRITE_ONLY,sizeof(int)*num_block,0,&err);

118. }

119.

120. void Create_program()

121.  {

122.     program=clCreateProgramWithSource(context, LEN(src), src, NULL, NULL);

123.      err=clBuildProgram(program,num_device,devices,NULL,NULL,NULL);

124.     kernel = clCreateKernel(program, "redution", NULL);

125.  }

126.

127. void Set_arg()

128.{

129.     err=clSetKernelArg(kernel,0,sizeof(cl_mem),&buffer);

130.    err=clSetKernelArg(kernel,1,sizeof(cl_mem),&sum_buffer);

131.     err=clSetKernelArg(kernel,2,sizeof(int)*NUM_THREAD,NULL);

132.}

133.

134.void Execution()

135. {

136.    const size_t globalWorkSize[1]={N};

137.         const size_t localWorkSize[1]={NUM_THREAD};

138.      err=clEnqueueNDRangeKernel(cmdQueue,kernel,1,NULL,globalWorkSize,localWorkSize,0,NULL,NULL);

139.       clFinish(cmdQueue);

140.}

141.

142.void CopyOutResult(int*out)

143. {

144.    err=clEnqueueReadBuffer(cmdQueue,sum_buffer,CL_TRUE,0,sizeof(int)*num_block,out,0,NULL,NULL);

145. }

Android.mk

1.  LOCAL_PATH := $(call my-dir)

2.

3.  include $(CLEAR_VARS)

4. LOCAL_MODULE    := ocl

5.  LOCAL_SRC_FILES := ocl.cpp

6. LOCAL_LDFLAGS += -llog  -lOpenCL

7.  include $(BUILD_SHARED_LIBRARY)

Application.mk

1.  APP_CPPFLAGS := -frtti -fexceptions

2.  APP_STL := stlport_static

3.  APP_ABI := x86

4.  APP_PLATFORM := android-14

执行结果

工程文件下载地址:

http://download.csdn.net/detail/sinat_27685435/9460498

安卓下使用OpenCL进行PowerVR GPU编程相关推荐

  1. GPU编程--OpenCL基本概念

    本篇结构: 背景 OpenCL是什么 框架组成 基本概念 编写OpenCL程序的基本步骤 参考博文 一.背景 在过去利用GPU对图像渲染进行加速的技术非常成熟,因为GPU是典型的单指令多数据(SIMD ...

  2. CUDA下的GPU编程入门--第一个CUDA程序

    CUDA是NVIDIA公司开发的一个用于GPU编程的开源框架,用于将GPU用于更广泛的数学计算,充当cpu的功能,所以只能在nvidia的GPU下实现,如果你的GPU不是nvidia的,赶紧去换一个吧 ...

  3. GPU 编程 CPU 异同点_GPU(图形处理器) ARCHITECTURE的变迁史

    GPU(图形处理器) ARCHITECTURE的变迁史 心动网络​XD.com Written by JP.lee The lead of technical art divisions at 心动 ...

  4. 在PowerVR GPU上试用新Vulkan图形处理API

    由 创新网小编 于 星期五, 2015-04-03 10:58 发表 Vulkan™是Khronos Group研发的新一代高性能图像处理和计算API.Vulkan没出来以前,人们都称它为glNext ...

  5. GPU编程--CPU和GPU的设计区别

    本篇结构 前言 概论 CPU简介 GPU简介 并行计算 CPU/GPU对比 适于GPU计算的场景 GPU开发环境 参考博文 一.前言 因为工作需要,需要从github上找一个CUDA的DBSCAN聚类 ...

  6. 《多核与GPU编程:工具、方法及实践》----1.3 现代计算机概览

    本节书摘来自华章出版社<多核与GPU编程:工具.方法及实践>一书中的第1章,第1.3节, 作 者 Multicore and GPU Programming: An Integrated ...

  7. python的gpu编程_cuda-Python GPU编程

    cuda-Python GPU编程 我目前正在使用python开发一个项目,我想利用GPU进行一些计算. 乍一看,似乎有许多可用的工具. 乍一看,我觉得我错过了一些东西. Copperhead看起来很 ...

  8. 基于c++ amp的gpu编程

    目录 摘要: 1 简介 2 性能改进 2.1 异构平台 2.2 gpu架构 2.3 通过平行的性能改进 3 gpu编程架构 3.1 opencl 3.2 cdua 3.3 c++ amp 4 一个c+ ...

  9. 【C++学习】GPU编程的简单学习

    GPU是什么 显卡的处理器称为图形处理器(GPU),它是显卡的"心脏",与CPU类似,只不过GPU是专为执行复杂的数学和几何计算而设计的,这些计算是图形渲染所必需的.某些最快速的G ...

  10. GPU编程和流式多处理器(二)

    GPU编程和流式多处理器(二) 2. 整数支持 SM具有32位整数运算的完整补充. • 加法运算符的可选否定加法 • 乘法与乘法加法 • 整数除法 • 逻辑运算 • 条件码操作 • to/from浮点 ...

最新文章

  1. ansible笔记(11):初识ansible playbook(二)
  2. 理解并解决IE的内存泄漏方式[翻译2]
  3. WinForm打印之页边距
  4. 潮流玩具行业趋势与洞察白皮书
  5. phpexcel的使用方法详细介绍
  6. 携程将推“3+2”工作模式:每周到岗3天,在家2天,你羡慕吗?
  7. 编写高质量代码的50条黄金守则-Day 03(首选is或as而不是强制类型转换)
  8. D - 区间覆盖问题
  9. [我总结]8月第二周总结
  10. 先有本地代码,后有远程仓库
  11. Lady Gaga Feat. Colby O'Donis - Just Dance
  12. 《深入浅出通信原理》知识总结
  13. Horizon client 连接桌面后显示:USB已禁用/USB重定向功能已禁用
  14. 支持javascript的ppt软件_把PPT放入浏览器中——12款用于演示的JS库
  15. 2021年江苏镇江公务员考试报考指南
  16. socketDemo套接字
  17. GO函数内部程序执行顺序
  18. 程序员如何写好简历 一份优秀的程序员简历是什么样的?
  19. DAO数据访问对象(Data Access Object)
  20. 小白零基础教学:用自助BI工具搭建领导驾驶舱

热门文章

  1. 这片“农场”被他们承包了|第一届中国农业人工智能创新创业大赛初赛回顾
  2. 2022年中式面点师(初级)考试题库及模拟考试
  3. <C++>文件操作基础详解,快来写出你的第一个文件吧
  4. 1038: 绝对值最大 C语言
  5. 灭霸级——如何选择最适合你的Linux发行版
  6. NUC980 NuWriter无法烧录固件
  7. 51单片机 独立按键k1控制数码管移位 k2控制数值加
  8. 小布语音下载安装_oppo语音助手小布小冰安装包app
  9. python如何控制运行时间_Python控制函数运行时间
  10. 最适合编程的笔记本电脑是什么?