高通平台下安卓opencl小例子

2023-11-19

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、执行结果:


搞定!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Firebase 管理 SDK Android

    在 Android 中初始化 Firebase Admin SDK 的代码 Override protected void onCreate Bundle savedInstanceState super onCreate savedIns
  • Android 通知进度条冻结

    这是我正在使用的代码 http pastebin com 3bMCKURu http pastebin com 3bMCKURu 问题是 一段时间后 文件变得更重 通知栏下拉速度变慢 最后它就冻结了 你的通知太频繁了 这就是它冻结的原因 让
  • Android SoundPool 堆限制

    我正在使用 SoundPool 加载多个声音剪辑并播放它们 据我所知 它的功能 100 正确 但在 load 调用期间 我的日志中充斥着以下内容 06 09 11 30 26 110 ERROR AudioCache 23363 Heap
  • 接近语法错误(代码1)插入Android SQLite

    我正在创建一个通讯录应用程序 用户可以在其中输入姓名 电子邮件地址和号码 我希望将此数据保存在数据库中 但我似乎无法使插入方法起作用 我收到的错误是 android database sqlite SQLiteException near
  • 无法在自定义 AOSP 上安装 Google Play 中的某些应用程序:项目不可用。理由:9

    我在尝试从 Google Play 安装某些应用程序时收到以下错误 LibraryUtils isAvailable not available restriction 9 DocUtils getAvailabilityRestricti
  • 设置从 Facebook 登录获取用户电子邮件 ID 的权限

    我在用着Facebook 3 0 SDK对于安卓 我必须实施Facebook登录 我正在访问用户的基本信息 例如姓名 用户 ID 但我也想访问用户的电子邮件 我浏览了很多博客和论坛 但不知道该怎么做 我正在使用我自己的 android 按钮
  • 已经使用 AsyncTask doInBackground 但新数据未显示

    我使用 AsyncTask 创建一个聊天室来接收消息 因此它总是检查即将到来的消息并将其显示给客户端 但代码似乎无法按我希望的方式工作 在客户端只显示所有旧数据 新数据不显示 因为当我尝试从服务器发送消息时 新数据没有显示在客户端中 我对这
  • TextView 之间有分隔线

    我正在尝试在 android studio 中创建以下布局 因为我对 android 东西还很陌生 所以我第一次尝试使用 LinearLayout 并认为这可能无法实现 现在我正在尝试使用RelativeLayout 我已经用颜色创建了这个
  • 在我的Android中,当其他应用程序想要录制音频时如何停止录音?

    在我的应用程序中 服务通过 AudioRecord 持续录制音频 当我的应用程序运行时 其他与音频记录相关的应用程序 例如 Google 搜索 无法工作 如何知道何时有其他应用想要录制音频 以便我可以停止录制以释放资源 答案是MediaRe
  • 应用程序未安装在 Android 模拟器上

    我正在 android Geocoder 中开发一个应用程序 当我运行该应用程序时 它会显示 2011 01 11 11 08 13 GeoTourProject 自动目标模式 使用现有模拟器 emulator 5554 运行兼容的 AVD
  • CookieManager.getInstance().removeAllCookie();不删除所有cookie

    我在应用程序的 onCreate 中调用 CookieManager getInstance removeAllCookie 我遇到了一个奇怪的问题 我看到 GET 请求中传递了意外的 cookie 值 事实上 cookie 值是一个非常非
  • Flutter 深度链接

    据Flutter官方介绍深层链接页面 https flutter dev docs development ui navigation deep linking 我们不需要任何插件或本机 Android iOS 代码来处理深层链接 但它并没
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 在 Android 上按下电源按钮时,如何防止先调用 onDestroy() 再调用 onCreate()

    我正在记录每个 onCreate 和 onDestroy 调用 我发现 一旦我单击 Android 上的电源按钮 以及模拟器上的电源按钮 我的活动中就会拨打电话 gt onDestroy gt onCreate 这会杀死我的游戏 然后立即从
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 在webview android中加载本地html文件

    我正在尝试在 android 的 webview 中加载 html 文件的内容 但是 它给了我 网页不可用错误 如果我尝试使用谷歌或雅虎等网站 它们就会起作用 html文件位于src gt main gt assests gt index
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想
  • 如何删除因 Google Fitness API 7.5.0 添加的权限

    将我的 play services fitness api 从 7 0 0 更新到 7 5 0 后 我注意到当我将新版本上传到 PlayStore 时 它 告诉我正在添加一个新权限和 2 个新功能 我没有这样做 有没有搞错 在做了一些研究来
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项

随机推荐

  • centos启动停留在started GNOME display manager

    Centos启动卡死进不去界面 停留在started GNOME display manager 在安装Centos7 9系统成功后 需要安装显卡驱动 显卡驱动有一个驱动程序自带这图形化界面 安装该驱动程序后 系统一直处于started G
  • Python连接MySQL数据库

    一 准备模块 python连接SQL数据库首先需要用到 pymysql 模块 这里使用pip install指令来安装步骤如下 1 在安装的python的路径下找到Scripts文件夹并打开 在路径上面写成 cmd 后回车 2 进入这个界面
  • springboot配置自定义数据源(Druid德鲁伊)的步骤。

    今天和大家分享下在Springboot中配置自定义数据源Druid的两种方法及步骤 方法一 1 在pom xml配置依赖 注释里面的内容 2 配置自己的数据源设置 我是在yaml文件中配置的 顺便提醒一下 在配置yaml文件的时候缩进问题一
  • 【引用】四元组与旋转矩阵

    引用 四元组与旋转矩阵 2011 09 22 17 13 39 分类 DirectX资料 举报 字号 订阅 下载LOFTER客户端 本文转载自ericyang1231 四元组与旋转矩阵 在3D程序中 通常用quaternion来计算3D物体
  • iOS开发之状态栏statusBar颜色变化

    在网上搜索了很久 我也试了很多种情况 下面我为每种情况排布一下优先级 刚开始的时候我没有写播放器 使用的是腾讯的SDK 发现我之前设置的状态栏变化不在发生变化啦 所以在这里做一个小结 Xcode默认的颜色是黑色 记录优化代码的点滴 第一种
  • C++---背包模型---装箱问题(每日一道算法2023.3.9)

    注意事项 本题是 动态规划 01背包 的扩展题 dp和优化思路不多赘述 题目 有一个箱子容量为 V 同时有 n 个物品 每个物品有一个体积 正整数 要求 n 个物品中 任取若干个装入箱内 使箱子的剩余空间为最小 输入格式 第一行是一个整数
  • int $0x80系统调用的idea

    1 基础知识 用户态和内核态 一般现代CPU都有几种不同的指令执行级别 Linux总共划分为4个指令执行级别 内核运行在0级别上 1 2级别默认不运行 用户程序运行在3级别上 在内核指令执行级别上 代码可以执行特权指令 访问任意的物理地址
  • 微信小程序组件 - 部门机构人员岗位树组件

  • 国产版Airtag防丢器

    Airtag是什么 AirTag是苹果公司设计的一款定位神奇 它通过一款纽扣电池进行供电 即可实现长达1 2年的关键物品的定位 查找的功能 按照苹果公司自己的话说 您 丢三落四这门绝技 要 失 传 了 AirTag 可帮你轻松追踪并查找各种
  • 华为手机怎样才算激活了_华为P30 Pro手机壳不要闹,简约个性才是王道

    提起手机壳相信大家都不会陌生 在曾经 很多人对于手机壳的印象还只是停留于保护阶段 但是伴随着人们生活水屏的不断提升 手机壳设计师们为了迎合年轻消费者的需求 在外观上做出了升级 风格款式多样 材质分门别类 如今市场上的手机壳可谓是琳琅满目 不
  • 【大数据】Hive: 获取字段数据类型

    2018 12 01 文章目录 前言 方法 前言 某项目涉及将Hive中的textFile表转换成parquet表 由于parquet表不支持date类型 需要判断字段是否是date 并cast成timestamp 方法 采用DESCRIB
  • redis缓存机构-持久化详解(二)

    redis缓存机构 持久化详解 1 redis对于生产环境的灾难恢复的意义 在于故障恢复 2 redis的持久化 RDB AOF 区别 特点是什么 适合什么场景 1 RDB持久化机制 对redis中的数据执行周期性的持久化 数据快照 RDB
  • luaj使用 方法签名规则 Cocos2dxLuaJavaBridge

    function AndroidHandler getParamJson local args nil local ok ret luaj callStaticMethod className getParamJson args Ljava
  • P1609 最小回文数 题解

    本题位数较大 所以只能使用字符串读入 因为是回文数 所以我们只考虑前半部分的情况就能确定一个回文数 如一个型为 x y z overline xyz xy
  • 在安装了vcpkg,并编译了osgEarth后,osgEarth工程中所有依赖项vs2019会自动默认生成最新,解决办法

    前言 问题描述 在安装了vcpkg 并编译了osgEarth后 osgEarth工程中所有依赖项 1 hdf dll 2 hdf5 dll 3 hdf5 cpp dll 4 hdf5 hl dll 5 hdf5 hl cpp dll 6 l
  • sql sever文件导入mysql服务器,怎样将外部数据库文件导入MySQL

    怎样将外部数据库文件导入MySQL 内容精选 换一换 数据导入 章节适用于MRS 3 x及后续版本 Loader是实现MRS与外部数据源如关系型数据库 SFTP服务器 FTP服务器之间交换数据和文件的ETL工具 支持将数据或文件从关系型数据
  • Dubbo快速入门

    文章目录 一 初识Dubbo 1 Dubbo是什么 2 Dubbo现状 3 Dubbo的故事 主要历程 二 RPC介绍 三 Dubbo工作原理 四 案例实操 项目编写 1 项目创建 2 服务提供者 producer 的开发 3 服务消费方
  • RISC-V嵌入式开发准备篇2:嵌入式开发的特点介绍

    原文出处 https mp weixin qq com s ljYZwMj3JaPN29dTAXA3bQ 随着国内第一本RISC V中文书籍 手把手教你设计CPU RISC V处理器篇 正式上市 越来越多的爱好者开始使用开源的蜂鸟E203
  • EOS智能合约安全开发终极指南

    EOS智能合约安全终极指南 当世界上最大的ICO EOS于2018年6月推出时 加密社区变得持怀疑态度 并且由于软件错误而被冻结了2天 但快进4个月 EOS今天占了以太网今天所做交易的两倍以上 通过免费和更快速交易的承诺 EOS最顶级的Da
  • 高通平台下安卓opencl小例子

    1 从高通官网下载Adreon SDK 需要注册为会员 2 解压以后 把文件夹Development Inc 内的CL文件夹拷贝到 android ndk r9d platforms android 19 arch arm usr incl