安卓下使用OpenCL进行PowerVR GPU编程
参考文献
[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编程相关推荐
- GPU编程--OpenCL基本概念
本篇结构: 背景 OpenCL是什么 框架组成 基本概念 编写OpenCL程序的基本步骤 参考博文 一.背景 在过去利用GPU对图像渲染进行加速的技术非常成熟,因为GPU是典型的单指令多数据(SIMD ...
- CUDA下的GPU编程入门--第一个CUDA程序
CUDA是NVIDIA公司开发的一个用于GPU编程的开源框架,用于将GPU用于更广泛的数学计算,充当cpu的功能,所以只能在nvidia的GPU下实现,如果你的GPU不是nvidia的,赶紧去换一个吧 ...
- GPU 编程 CPU 异同点_GPU(图形处理器) ARCHITECTURE的变迁史
GPU(图形处理器) ARCHITECTURE的变迁史 心动网络XD.com Written by JP.lee The lead of technical art divisions at 心动 ...
- 在PowerVR GPU上试用新Vulkan图形处理API
由 创新网小编 于 星期五, 2015-04-03 10:58 发表 Vulkan™是Khronos Group研发的新一代高性能图像处理和计算API.Vulkan没出来以前,人们都称它为glNext ...
- GPU编程--CPU和GPU的设计区别
本篇结构 前言 概论 CPU简介 GPU简介 并行计算 CPU/GPU对比 适于GPU计算的场景 GPU开发环境 参考博文 一.前言 因为工作需要,需要从github上找一个CUDA的DBSCAN聚类 ...
- 《多核与GPU编程:工具、方法及实践》----1.3 现代计算机概览
本节书摘来自华章出版社<多核与GPU编程:工具.方法及实践>一书中的第1章,第1.3节, 作 者 Multicore and GPU Programming: An Integrated ...
- python的gpu编程_cuda-Python GPU编程
cuda-Python GPU编程 我目前正在使用python开发一个项目,我想利用GPU进行一些计算. 乍一看,似乎有许多可用的工具. 乍一看,我觉得我错过了一些东西. Copperhead看起来很 ...
- 基于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+ ...
- 【C++学习】GPU编程的简单学习
GPU是什么 显卡的处理器称为图形处理器(GPU),它是显卡的"心脏",与CPU类似,只不过GPU是专为执行复杂的数学和几何计算而设计的,这些计算是图形渲染所必需的.某些最快速的G ...
- GPU编程和流式多处理器(二)
GPU编程和流式多处理器(二) 2. 整数支持 SM具有32位整数运算的完整补充. • 加法运算符的可选否定加法 • 乘法与乘法加法 • 整数除法 • 逻辑运算 • 条件码操作 • to/from浮点 ...
最新文章
- ansible笔记(11):初识ansible playbook(二)
- 理解并解决IE的内存泄漏方式[翻译2]
- WinForm打印之页边距
- 潮流玩具行业趋势与洞察白皮书
- phpexcel的使用方法详细介绍
- 携程将推“3+2”工作模式:每周到岗3天,在家2天,你羡慕吗?
- 编写高质量代码的50条黄金守则-Day 03(首选is或as而不是强制类型转换)
- D - 区间覆盖问题
- [我总结]8月第二周总结
- 先有本地代码,后有远程仓库
- Lady Gaga Feat. Colby O'Donis - Just Dance
- 《深入浅出通信原理》知识总结
- Horizon client 连接桌面后显示:USB已禁用/USB重定向功能已禁用
- 支持javascript的ppt软件_把PPT放入浏览器中——12款用于演示的JS库
- 2021年江苏镇江公务员考试报考指南
- socketDemo套接字
- GO函数内部程序执行顺序
- 程序员如何写好简历 一份优秀的程序员简历是什么样的?
- DAO数据访问对象(Data Access Object)
- 小白零基础教学:用自助BI工具搭建领导驾驶舱
热门文章
- 这片“农场”被他们承包了|第一届中国农业人工智能创新创业大赛初赛回顾
- 2022年中式面点师(初级)考试题库及模拟考试
- <C++>文件操作基础详解,快来写出你的第一个文件吧
- 1038: 绝对值最大 C语言
- 灭霸级——如何选择最适合你的Linux发行版
- NUC980 NuWriter无法烧录固件
- 51单片机 独立按键k1控制数码管移位 k2控制数值加
- 小布语音下载安装_oppo语音助手小布小冰安装包app
- python如何控制运行时间_Python控制函数运行时间
- 最适合编程的笔记本电脑是什么?