http://blog.csdn.net/wcj0626/article/details/26272019

先到高通的qdn下载adreno GPU SDK,里面有OpenCL的例子。
https://developer.qualcomm.com/software/adreno-gpu-sdk

例子在以下目录:
AdrenoSDK\Development\Samples\OpenCL

1、从高通官网下载Adreon SDK(需要注册为会员)

2、解压以后,把文件夹Development/Inc/内的CL文件夹拷贝到:Android-ndk-r9d/platforms/android-19/arch-arm/usr/include/(请自行选择拷贝到哪个版本下)

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

4、新建安卓工程,NDK开发。不知道NDK怎么弄,请移步这里

5、Java代码:

  1. public class MainActivity extends ActionBarActivity {
  2. static
  3. {
  4. System.loadLibrary("ocl");
  5. }
  6. public native String  testopencl();
  7. public native String getPlatformName();
  8. public native String getDeviceName();
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. TextView testView2=(TextView)findViewById(R.id.textView2);
  14. TextView testView4=(TextView)findViewById(R.id.textView4);
  15. TextView testView6=(TextView)findViewById(R.id.textView6);
  16. testView6.setText(testopencl());
  17. testView2.setText(getPlatformName());
  18. testView4.setText(getDeviceName());
  19. }
  20. }

6、NDK代码:ocl.cpp文件

  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. cl_uint num_device;
  11. cl_uint num_platform;
  12. cl_platform_id *platform;
  13. cl_device_id *devices;
  14. cl_int err;
  15. cl_context context;
  16. cl_command_queue cmdQueue;
  17. cl_mem buffer,sum_buffer;
  18. cl_program program ;
  19. cl_kernel kernel;
  20. const char* src[] = {
  21. "  __kernel void redution(  \n"
  22. "  __global int *data,     \n"
  23. "  __global int *output,   \n"
  24. "  __local int *data_local   \n"
  25. "  )  \n"
  26. " {   \n"
  27. "  int gid=get_group_id(0);   \n"
  28. "  int tid=get_global_id(0);    \n"
  29. "  int size=get_local_size(0);   \n"
  30. "  int id=get_local_id(0);     \n"
  31. "  data_local[id]=data[tid];   \n"
  32. "  barrier(CLK_LOCAL_MEM_FENCE);   \n"
  33. "  for(int i=size/2;i>0;i>>=1){    \n"
  34. "      if(id<i){   \n"
  35. "          data_local[id]+=data_local[id+i];   \n"
  36. "      }   \n"
  37. "      barrier(CLK_LOCAL_MEM_FENCE);   \n"
  38. "  }    \n"
  39. "  if(id==0){    \n"
  40. "      output[gid]=data_local[0];   \n"
  41. "  }    \n"
  42. " }   \n"
  43. };
  44. int num_block;
  45. int  test()
  46. {
  47. int* in,*out;
  48. num_block=N/NUM_THREAD;
  49. in=(int*)malloc(sizeof(int)*N);
  50. out=(int*)malloc(sizeof(int)*num_block);
  51. for(int i=0;i<N;i++){
  52. in[i]=1;
  53. }
  54. Init_OpenCL();
  55. Context_cmd();
  56. Create_Buffer(in);
  57. Create_program();
  58. Set_arg();
  59. Execution();
  60. CopyOutResult(out);
  61. int sum=0;
  62. for(int i=0;i<num_block;i++){
  63. sum+=out[i];
  64. }
  65. return sum;
  66. }
  67. JNIEXPORT jstring JNICALL Java_com_example_ocl_MainActivity_testopencl (JNIEnv * env, jobject thisobject)
  68. {
  69. char result[10];
  70. sprintf(result,"%d\n",test());
  71. return env->NewStringUTF(result);
  72. }
  73. JNIEXPORT jstring JNICALL Java_com_example_ocl_MainActivity_getPlatformName(JNIEnv *env , jobject thisobject)
  74. {
  75. char buffer[1024];
  76. clGetPlatformInfo(platform[0],CL_PLATFORM_NAME,sizeof(buffer),buffer,NULL);
  77. return env->NewStringUTF(buffer);
  78. }
  79. JNIEXPORT jstring JNICALL Java_com_example_ocl_MainActivity_getDeviceName(JNIEnv *env , jobject thisobject)
  80. {
  81. char buffer[1024];
  82. clGetDeviceInfo(devices[0],CL_DEVICE_NAME,sizeof(buffer),buffer,NULL);
  83. return env->NewStringUTF(buffer);
  84. }
  85. void Init_OpenCL()
  86. {
  87. size_t nameLen1;
  88. char platformName[1024];
  89. err = clGetPlatformIDs(0, 0, &num_platform);
  90. platform=(cl_platform_id*)malloc(sizeof(cl_platform_id)*num_platform);
  91. err = clGetPlatformIDs(num_platform, platform, NULL);
  92. err=clGetDeviceIDs(platform[0],CL_DEVICE_TYPE_GPU,0,NULL,&num_device);
  93. devices=(cl_device_id*)malloc(sizeof(cl_device_id)*num_device);
  94. err=clGetDeviceIDs(platform[0],CL_DEVICE_TYPE_GPU,num_device,devices,NULL);
  95. }
  96. void Context_cmd()
  97. {
  98. context=clCreateContext(NULL,num_device,devices,NULL,NULL,&err);
  99. cmdQueue=clCreateCommandQueue(context,devices[0],0,&err);
  100. }
  101. void Create_Buffer(int *data)
  102. {
  103. buffer=clCreateBuffer(context,CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR,sizeof(int)*N,data,&err);
  104. sum_buffer=clCreateBuffer(context,CL_MEM_WRITE_ONLY,sizeof(int)*num_block,0,&err);
  105. }
  106. void Create_program()
  107. {
  108. program=clCreateProgramWithSource(context, LEN(src), src, NULL, NULL);
  109. err=clBuildProgram(program,num_device,devices,NULL,NULL,NULL);
  110. kernel = clCreateKernel(program, "redution", NULL);
  111. }
  112. void Set_arg()
  113. {
  114. err=clSetKernelArg(kernel,0,sizeof(cl_mem),&buffer);
  115. err=clSetKernelArg(kernel,1,sizeof(cl_mem),&sum_buffer);
  116. err=clSetKernelArg(kernel,2,sizeof(int)*NUM_THREAD,NULL);
  117. }
  118. void Execution()
  119. {
  120. const size_t globalWorkSize[1]={N};
  121. const size_t localWorkSize[1]={NUM_THREAD};
  122. err=clEnqueueNDRangeKernel(cmdQueue,kernel,1,NULL,globalWorkSize,localWorkSize,0,NULL,NULL);
  123. clFinish(cmdQueue);
  124. }
  125. void CopyOutResult(int*out)
  126. {
  127. err=clEnqueueReadBuffer(cmdQueue,sum_buffer,CL_TRUE,0,sizeof(int)*num_block,out,0,NULL,NULL);
  128. }

7、Android.mk代码:

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE    := ocl
  4. LOCAL_SRC_FILES := ocl.cpp
  5. LOCAL_LDFLAGS += -llog  -lOpenCL
  6. include $(BUILD_SHARED_LIBRARY)

8、执行结果:

搞定!!!

高通平台下安卓opencl小例子的更多相关文章

  1. 专访高磊:安卓APK安全加固的引领者

    高磊,爱加密CEO,安卓巴士版主之一,曾编写河南省某地市交通信息化规划十二五规划,以及参与省厅级资源共享平台设计等.之前的工作经理积累了丰富的设计规划经验,此外还具有J2EE和 Android开发经验 ...

  2. 一:AndEngine的小例子

    首先导入架包,下载:http://download.csdn.net/detail/duancanmeng/4060082 lib文件夹中 像我们写android程序entends Activity一 ...

  3. 疯狂delphi - 朱建强 (一些小例子很实用,也是我所关心的几个问题)

    疯狂delphi - 朱建强 (一些小例子很实用,也是我所关心的几个问题) Android实例-获取安卓手机WIFI信息(XE8+小米2)http://www.cnblogs.com/FKdelphi ...

  4. Android高通平台调试Camera驱动全纪录

    项目比较紧,3周内把一个带有外置ISP,MIPI数据通信,800万像素的camera从无驱动到实现客户全部需求. 1日 搭平台,建环境,编译内核,烧写代码. 我是一直在Window下搭个虚拟机登服务器 ...

  5. uiautomator——简单的将自动化测试与截图对比相结合使用的小例子!

    1.在使用uiautomator进行自动化测试过程当中,执行某些动作之后,要进行判断是否已执行的动作成功时,需要添加检查点来判断,因此添加判断点除了使用id.text.view等方式进行之外,存在一种 ...

  6. jetty 介绍以及小例子

    Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境.Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布.开发人员可以将 ...

  7. 详细解读Android中的搜索框(一)—— 简单小例子

    这次开的是一个讲解SearchView的栏目,第一篇主要是给一个小例子,让大家对这个搜索视图有一个了解,之后再分布细化来说. 目标: 我们先来定个目标,我们通过搜索框来输入要搜索的联系人名字,输入的时 ...

  8. vuex2.0+两个小例子

    首先vuex概念比较多,一定要搞懂里面的概念,可以参考官网Vuex2.0概念,我写此文的目的是希望能对前端爱好者提供个参考,加深对vuex2.0各核心概念的理解. 废话少说,直接上干货.这是官网上的一 ...

  9. 前端小例子 基础js css html练习

    前情提要: 学前端也有一阵了,个人感觉前端还是重要的. html 学习教程 https://www.cnblogs.com/baili-luoyun/p/10466040.html css 教程 js ...

随机推荐

  1. 【VBA】制作散点图及打标签VBA

    1.散点图的制作必须只选择xy轴对应的数据,不能选中标签. 2.调整xy轴交叉点,改为四个象限. 3.通过菜单移动散点图到新表. 4.运行宏,打上文本标签. VBA如下 Sub AttachLabel ...

  2. 我如何让echarts实现了分组(原创插件echarts.group代码分享)

    前言 echarts是百度出品的一款很棒的前端图表控件,被评为“百度少有的良心产品”.可以实现散点图.折线图.柱状图.地图.饼图.雷达图.K线图等等几十种常用.不常用的图表,效果酷炫. 示例地址:ht ...

  3. Java中匿名内部类

    匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象 ...

  4. 《ASP.NET1200例》C#在网页上编写动态时钟

    包含Timer类的命名空间有3个 Timer Class (System.Threading)‎ Timer Class (System.Windows.Forms)‎ 一般用于窗体程序 Timer  ...

  5. Poj1426

    Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25721   Accepted: 106 ...

  6. 【BZOJ4379】[POI2015]Modernizacja autostrady 树形DP

    [BZOJ4379][POI2015]Modernizacja autostrady Description 给定一棵无根树,边权都是1,请去掉一条边并加上一条新边,定义直径为最远的两个点的距离,请输 ...

  7. 160810、Java Object类

    Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ...

  8. PAT 1016 Phone Bills(模拟)

    1016. Phone Bills (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A long-di ...

  9. Powershell Get Domain Group的几种方法

    Group常见属性介绍: 一.Get-ADGroup获取群组(如下例循环获取群组的发送权限) #群组的发送权限info $groups=Get-ADGroup -filter * -SearchSco ...

  10. mysql insert中用case

    insert into urls(company,counterType,mdUrl,tradeUrl) values('test', CASE 'test'WHEN 'CTP' THEN 1WHEN ...