著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:蓝山sd
链接:http://www.zhihu.com/question/20958771/answer/44916992
来源:知乎
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:蓝山sd
链接:http://www.zhihu.com/question/20958771/answer/44916992
来源:知乎
1. OpenCL
在桌面系统和大规模并行计算领域被普遍使用的一种底层API。最近一段时间,主流的芯片厂商的旗舰或准旗舰芯片都开始支持OpenCL1.1或者1.2标准,包括高通,三星, 联发科,Rockchip等厂商的芯片,都可以找到OpenCL的支持。
2. CUDA
目前只有NVIDIA自己出的基于Tegra K1芯片的设备(NVIDIA Shield)支持CUDA,所以支持的面比较窄。
3. RenderScript (RS)
Google力推的异构编程,宗旨是由平台帮你选择运行的处理器,也就是说你是不知道你的程序跑在CPU还是GPU上的,这是由系统的驱动来决定的。想法是美好的,可现实是开发者并不买RS的帐, 大家觉得RS的性能不可控,灵活性太差,其文档之缺乏也被人诟病;此外,芯片厂商对于RS的优化都还普遍处于比较低阶的水平,这些都导致了RS在实际应用中很少被用到。
由于OpenCL的普及程度,以下部分只针对OpenCL展开。
目前支持OpenCL的设备和芯片
1. 支持OpenCL的GPU
需要掌握的知识:
1. 简单的GPU基本知识
2. OpenCL并行程序设计
3. Android NDK知识
4. Android JNI接口的编写
5. 简单的Android程序开发知识
开发的步骤(篇幅所限,这里只是步骤的精简版本,只阐述操作,不进行解释):
1. 编写OpenCL的C/C++程序实现GPU的核心计算代码
2. 用Android NDK编译之前写的C/C++代码。这一阶段可以在纯C/C++环境下工作,可以编写main函数测试实现的功能,用NDK将代码编译为可执行的代码(BUILD_EXECUTABLE), 然后用ADB将可执行程序推送到设备上运行。运行可执行程序要求设备具有root权限,如果没有root权限,可以通过Native Program Launcher ( AndroidNativeLauncher · GitHub,可能需要翻墙) 这一工具在设备上执行二进制代码。
3. 上一阶段测试结束,功能基本正常。开始编写JNI接口。
4. 开始编写Android应用程序,使用JNI封装native函数。编译C/C++代码成动态链接库。
5. 在Android程序里,以静态方式加载上一步编译的动态链接库。
6. 在需要的地方(比如点击按钮事件),调用相应的native函数,即可实现相应的功能。
以上步骤可能看着有些抽象,不用担心,跟着下面几个教程走一边,你就会明白每一步在做什么。
推荐几个教程:
1. Sony Mobile的OpenCL教程(英文): Boost the performance of your Android app with OpenCL
2. Intel的Android上的OpenCL教程(中英文版都有): 安卓* - 教程:基于 Android* 操作系统的 OpenCL™ 入门
3. CSDN的一篇博文: Android平台利用OpenCL框架实现并行开发初试
这几个教程都是有非常详细的说明,并且附有源代码,非常适合入门。
在桌面系统和大规模并行计算领域被普遍使用的一种底层API。最近一段时间,主流的芯片厂商的旗舰或准旗舰芯片都开始支持OpenCL1.1或者1.2标准,包括高通,三星, 联发科,Rockchip等厂商的芯片,都可以找到OpenCL的支持。
2. CUDA
目前只有NVIDIA自己出的基于Tegra K1芯片的设备(NVIDIA Shield)支持CUDA,所以支持的面比较窄。
3. RenderScript (RS)
Google力推的异构编程,宗旨是由平台帮你选择运行的处理器,也就是说你是不知道你的程序跑在CPU还是GPU上的,这是由系统的驱动来决定的。想法是美好的,可现实是开发者并不买RS的帐, 大家觉得RS的性能不可控,灵活性太差,其文档之缺乏也被人诟病;此外,芯片厂商对于RS的优化都还普遍处于比较低阶的水平,这些都导致了RS在实际应用中很少被用到。
由于OpenCL的普及程度,以下部分只针对OpenCL展开。
目前支持OpenCL的设备和芯片
1. 支持OpenCL的GPU
- 高通几乎全系的GPU, 包括但不限于以下GPU (Adreno 305, 320, 330, 405, 420, 430, 530 ...)
- ARM Mali的6系和7系GPU, 比如T628, T760
- 2014年以来较新的Imagination PowerVR GPU,比如G6430
- 高通8064, 8974(骁龙800,801), 8084(骁龙805), 8994(骁龙810)等
- 三星 Exynos猎户座 5420, 5433 (内置ARM Mali GPU)
- 联发科 MT6752 (内置ARM Mali T760 GPU)
- 瑞芯微 RK3288 (内置ARM Mali GPU)
- 三星 Galaxy S4, S5, S6, Note 3, Note 4
- LG G2, G3, G4
- HTC One M7, M8, M9
- 小米使用高通芯片的手机和平板
- 魅族M1 Note
- 台积电P90HD
- 等等等等。。。。
- Google Play OpenCL-Z - Google Play 上的 Android 应用
- 豌豆荚:「OpenCL-Z」安卓版免费下载
需要掌握的知识:
1. 简单的GPU基本知识
2. OpenCL并行程序设计
3. Android NDK知识
4. Android JNI接口的编写
5. 简单的Android程序开发知识
开发的步骤(篇幅所限,这里只是步骤的精简版本,只阐述操作,不进行解释):
1. 编写OpenCL的C/C++程序实现GPU的核心计算代码
2. 用Android NDK编译之前写的C/C++代码。这一阶段可以在纯C/C++环境下工作,可以编写main函数测试实现的功能,用NDK将代码编译为可执行的代码(BUILD_EXECUTABLE), 然后用ADB将可执行程序推送到设备上运行。运行可执行程序要求设备具有root权限,如果没有root权限,可以通过Native Program Launcher ( AndroidNativeLauncher · GitHub,可能需要翻墙) 这一工具在设备上执行二进制代码。
3. 上一阶段测试结束,功能基本正常。开始编写JNI接口。
4. 开始编写Android应用程序,使用JNI封装native函数。编译C/C++代码成动态链接库。
5. 在Android程序里,以静态方式加载上一步编译的动态链接库。
6. 在需要的地方(比如点击按钮事件),调用相应的native函数,即可实现相应的功能。
以上步骤可能看着有些抽象,不用担心,跟着下面几个教程走一边,你就会明白每一步在做什么。
推荐几个教程:
1. Sony Mobile的OpenCL教程(英文): Boost the performance of your Android app with OpenCL
2. Intel的Android上的OpenCL教程(中英文版都有): 安卓* - 教程:基于 Android* 操作系统的 OpenCL™ 入门
3. CSDN的一篇博文: Android平台利用OpenCL框架实现并行开发初试
这几个教程都是有非常详细的说明,并且附有源代码,非常适合入门。