高通平台下安卓opencl小例子
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代码:
- public class MainActivity extends ActionBarActivity {
- static
- {
- System.loadLibrary("ocl");
- }
- public native String testopencl();
- public native String getPlatformName();
- public native String getDeviceName();
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- TextView testView2=(TextView)findViewById(R.id.textView2);
- TextView testView4=(TextView)findViewById(R.id.textView4);
- TextView testView6=(TextView)findViewById(R.id.textView6);
- testView6.setText(testopencl());
- testView2.setText(getPlatformName());
- testView4.setText(getDeviceName());
- }
- }
6、NDK代码:ocl.cpp文件
- #include <jni.h>
- #include <CL/cl.h>
- #include<malloc.h>
- #include<stdio.h>
- #include<stdlib.h>
- #include"com_example_ocl_MainActivity.h"
- #define LEN(arr) sizeof(arr) / sizeof(arr[0])
- #define N 1024
- #define NUM_THREAD 128
- cl_uint num_device;
- cl_uint num_platform;
- cl_platform_id *platform;
- cl_device_id *devices;
- cl_int err;
- cl_context context;
- cl_command_queue cmdQueue;
- cl_mem buffer,sum_buffer;
- cl_program program ;
- cl_kernel kernel;
- const char* src[] = {
- " __kernel void redution( \n"
- " __global int *data, \n"
- " __global int *output, \n"
- " __local int *data_local \n"
- " ) \n"
- " { \n"
- " int gid=get_group_id(0); \n"
- " int tid=get_global_id(0); \n"
- " int size=get_local_size(0); \n"
- " int id=get_local_id(0); \n"
- " data_local[id]=data[tid]; \n"
- " barrier(CLK_LOCAL_MEM_FENCE); \n"
- " for(int i=size/2;i>0;i>>=1){ \n"
- " if(id<i){ \n"
- " data_local[id]+=data_local[id+i]; \n"
- " } \n"
- " barrier(CLK_LOCAL_MEM_FENCE); \n"
- " } \n"
- " if(id==0){ \n"
- " output[gid]=data_local[0]; \n"
- " } \n"
- " } \n"
- };
- int num_block;
- int test()
- {
- int* in,*out;
- num_block=N/NUM_THREAD;
- in=(int*)malloc(sizeof(int)*N);
- out=(int*)malloc(sizeof(int)*num_block);
- for(int i=0;i<N;i++){
- in[i]=1;
- }
- Init_OpenCL();
- Context_cmd();
- Create_Buffer(in);
- Create_program();
- Set_arg();
- Execution();
- CopyOutResult(out);
- int sum=0;
- for(int i=0;i<num_block;i++){
- sum+=out[i];
- }
- return sum;
- }
- JNIEXPORT jstring JNICALL Java_com_example_ocl_MainActivity_testopencl (JNIEnv * env, jobject thisobject)
- {
- char result[10];
- sprintf(result,"%d\n",test());
- return env->NewStringUTF(result);
- }
- JNIEXPORT jstring JNICALL Java_com_example_ocl_MainActivity_getPlatformName(JNIEnv *env , jobject thisobject)
- {
- char buffer[1024];
- clGetPlatformInfo(platform[0],CL_PLATFORM_NAME,sizeof(buffer),buffer,NULL);
- return env->NewStringUTF(buffer);
- }
- JNIEXPORT jstring JNICALL Java_com_example_ocl_MainActivity_getDeviceName(JNIEnv *env , jobject thisobject)
- {
- char buffer[1024];
- clGetDeviceInfo(devices[0],CL_DEVICE_NAME,sizeof(buffer),buffer,NULL);
- return env->NewStringUTF(buffer);
- }
- void Init_OpenCL()
- {
- size_t nameLen1;
- char platformName[1024];
- err = clGetPlatformIDs(0, 0, &num_platform);
- platform=(cl_platform_id*)malloc(sizeof(cl_platform_id)*num_platform);
- err = clGetPlatformIDs(num_platform, platform, NULL);
- err=clGetDeviceIDs(platform[0],CL_DEVICE_TYPE_GPU,0,NULL,&num_device);
- devices=(cl_device_id*)malloc(sizeof(cl_device_id)*num_device);
- err=clGetDeviceIDs(platform[0],CL_DEVICE_TYPE_GPU,num_device,devices,NULL);
- }
- void Context_cmd()
- {
- context=clCreateContext(NULL,num_device,devices,NULL,NULL,&err);
- cmdQueue=clCreateCommandQueue(context,devices[0],0,&err);
- }
- void Create_Buffer(int *data)
- {
- buffer=clCreateBuffer(context,CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR,sizeof(int)*N,data,&err);
- sum_buffer=clCreateBuffer(context,CL_MEM_WRITE_ONLY,sizeof(int)*num_block,0,&err);
- }
- void Create_program()
- {
- program=clCreateProgramWithSource(context, LEN(src), src, NULL, NULL);
- err=clBuildProgram(program,num_device,devices,NULL,NULL,NULL);
- kernel = clCreateKernel(program, "redution", NULL);
- }
- void Set_arg()
- {
- err=clSetKernelArg(kernel,0,sizeof(cl_mem),&buffer);
- err=clSetKernelArg(kernel,1,sizeof(cl_mem),&sum_buffer);
- err=clSetKernelArg(kernel,2,sizeof(int)*NUM_THREAD,NULL);
- }
- void Execution()
- {
- const size_t globalWorkSize[1]={N};
- const size_t localWorkSize[1]={NUM_THREAD};
- err=clEnqueueNDRangeKernel(cmdQueue,kernel,1,NULL,globalWorkSize,localWorkSize,0,NULL,NULL);
- clFinish(cmdQueue);
- }
- void CopyOutResult(int*out)
- {
- err=clEnqueueReadBuffer(cmdQueue,sum_buffer,CL_TRUE,0,sizeof(int)*num_block,out,0,NULL,NULL);
- }
7、Android.mk代码:
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_MODULE := ocl
- LOCAL_SRC_FILES := ocl.cpp
- LOCAL_LDFLAGS += -llog -lOpenCL
- include $(BUILD_SHARED_LIBRARY)
8、执行结果:
搞定!!!
高通平台下安卓opencl小例子的更多相关文章
- 专访高磊:安卓APK安全加固的引领者
高磊,爱加密CEO,安卓巴士版主之一,曾编写河南省某地市交通信息化规划十二五规划,以及参与省厅级资源共享平台设计等.之前的工作经理积累了丰富的设计规划经验,此外还具有J2EE和 Android开发经验 ...
- 一:AndEngine的小例子
首先导入架包,下载:http://download.csdn.net/detail/duancanmeng/4060082 lib文件夹中 像我们写android程序entends Activity一 ...
- 疯狂delphi - 朱建强 (一些小例子很实用,也是我所关心的几个问题)
疯狂delphi - 朱建强 (一些小例子很实用,也是我所关心的几个问题) Android实例-获取安卓手机WIFI信息(XE8+小米2)http://www.cnblogs.com/FKdelphi ...
- Android高通平台调试Camera驱动全纪录
项目比较紧,3周内把一个带有外置ISP,MIPI数据通信,800万像素的camera从无驱动到实现客户全部需求. 1日 搭平台,建环境,编译内核,烧写代码. 我是一直在Window下搭个虚拟机登服务器 ...
- uiautomator——简单的将自动化测试与截图对比相结合使用的小例子!
1.在使用uiautomator进行自动化测试过程当中,执行某些动作之后,要进行判断是否已执行的动作成功时,需要添加检查点来判断,因此添加判断点除了使用id.text.view等方式进行之外,存在一种 ...
- jetty 介绍以及小例子
Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境.Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布.开发人员可以将 ...
- 详细解读Android中的搜索框(一)—— 简单小例子
这次开的是一个讲解SearchView的栏目,第一篇主要是给一个小例子,让大家对这个搜索视图有一个了解,之后再分布细化来说. 目标: 我们先来定个目标,我们通过搜索框来输入要搜索的联系人名字,输入的时 ...
- vuex2.0+两个小例子
首先vuex概念比较多,一定要搞懂里面的概念,可以参考官网Vuex2.0概念,我写此文的目的是希望能对前端爱好者提供个参考,加深对vuex2.0各核心概念的理解. 废话少说,直接上干货.这是官网上的一 ...
- 前端小例子 基础js css html练习
前情提要: 学前端也有一阵了,个人感觉前端还是重要的. html 学习教程 https://www.cnblogs.com/baili-luoyun/p/10466040.html css 教程 js ...
随机推荐
- 剑指offer(13)-栈的压入、弹出序列 九度1366
题目来自剑指offer系列 九度 1366:http://ac.jobdu.com/problem.php?pid=1367 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列 ...
- 在Nginx 配置防止单IP 攻击频次的控制 和 大流量攻击
nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数. HttpLimitReqModul用来限制连单位时间内连接数的模块, ...
- Eclipse UML插件
Green UML http://green.sourceforge.net/ AmaterasUML http://amateras.sourceforge.jp/cgi-bin/fswiki_en ...
- java进阶-多线程学习笔记
多线程学习笔记 1.什么是线程 操作系统中 打开一个程序就是一个进程 一个进程可以创建多个线程 现在系统中 系统调度的最小单元是线程 2.多线程有什么用? 发挥多核CPU的优势 如果使用多线程 将计算 ...
- 54、Android 粒子效果之雨(下雨的效果)
核心内容: 1.绘制下雨场景的个体.雨点(直线) 2.让直线动起来 3.处理边界问题 4.构造雨点对象 5.雨点大小设置 6.速度设置和角度设置等 7.添加多个雨点 8.抽离可以在 XML 中影响的属 ...
- java中的字符集和编码
前言 上次对计算机中的“字符集”和“编码”分别进行了总结,并指出二者之间的区别,不要搞混了,不清楚的再回到上一章看一下.今天再总结下java中是如何使用字符集(主要是Unicode字符集,其他常用字符 ...
- c#的小技巧
很多.net的使用小技巧,总是要自己记下来的,给自己. 一:时间格式话中H和h的区别 DateTime.ToString("yyyy-MM-dd HH:mm:ss");//转化成2 ...
- 【谷歌浏览器】在任意页面运行JS
1.使用谷歌浏览器的调试功能: 在任何页面上运行代码片段 · Chrome 开发者工具中文文档 注:比较简单,直接,不过只能本地执行,只能自己使用.且需自行保存JS文件: 2.使用油猴插件: Tamp ...
- 【JS】JS中对于this的理解
一.对this的产生原因分析和了解 第一:this指的是函数运行时所在的环境(即调用的对象). 第二:JavaScript 语言之所以有this的设计,跟内存里面的数据结构有关系(内存存储详细理解参考 ...
- Spoken English Practice(If you fail to do as I say, I will take you suffer.)
绿色:连读: 红色:略读: 蓝色:浊化: 橙色:弱读 下划线_为浊化 口语蜕变(2017/6/29) ...