对于平台独立性(桌面、云、移动......),当速度很重要时,使用 OpenCL 进行 GPGPU 开发会很棒。我知道 Google 将 RenderScript 作为替代方案,但它似乎只适用于 Android,而且不太可能包含在 iOS 中。
因此,我寻求一种在 Android 应用程序中执行 OpenCL 代码的解决方案。
对于平台独立性(桌面、云、移动......),当速度很重要时,使用 OpenCL 进行 GPGPU 开发会很棒。我知道 Google 将 RenderScript 作为替代方案,但它似乎只适用于 Android,而且不太可能包含在 iOS 中。
因此,我寻求一种在 Android 应用程序中执行 OpenCL 代码的解决方案。
我所知道的唯一支持 OpenCL 的 Android 设备是基于 Mali T600 系列芯片的设备(此处的文章)。他们有一个OpenCL SDK。显然它也是 OpenCL 1.1 完整配置文件。
Nexus 10就是使用这种芯片的设备。三星 Exynos 5 双 SoC 使用 Mali T604,因此任何使用它的东西都可以与 Mali T600 OpenCL SDK 一起使用(我自己还没有尝试过)。
OpenCL 博客的作者正在尝试对此进行尝试,因此可能值得关注他的系列文章。
但是,Android 上的 OpenCL 支持是全新的(截至 2013 年 2 月 16 日),因此,虽然非常适合实验,但在有更多支持之前可能值得谨慎(谁说 OpenCL 1.1 的初始支持有多么错误)
虽然距离最初的问题已经过去了一段时间,但我认为这仍然是很多开发人员的问题。
答案有两个方面。首先,很遗憾,Google 并未正式支持 OpenCL。
其次,幸运的是,许多芯片供应商都提供了他们的库来支持 OpenCL。就目前而言,大多数旗舰和中端智能手机(使用 Qualcomm Adreno GPU、ARM Mali GPU 或 Imagination PowerVR GPU)都包含 OpenCL 库。
要在 Android 上使用 OpenCL,有几个步骤:
主要芯片厂商的 OpenCL 库可以在设备中找到: 以下是 OpenCL 库的位置:
高通肾上腺素:
/system/vendor/lib/libOpenCL.so
or /system/lib/libOpenCL.so (older devices)
ARM 马里:
/system/vendor/lib/egl/libGLES_mali.so
or /system/lib/egl/libGLES_mali.so
电源VR:
/system/vendor/lib/libPVROCL.so
使用 C 或 C++ 编写 OpenCL 程序
创建 NDK 项目以编译您的 C/C++ 代码,并在设备上将它们作为可执行文件进行测试。
为您的 NDK 程序功能创建 JNI 接口。
创建Android项目,使用JAVA代码中的JNI函数调用OpenCL涉及的native函数。
索尼教程是一个很好的参考资料。该教程中介绍的技术可以应用于任何 Qualcomm Adreno GPU。只需极少的修改,该代码和 makefile 也可以在其他支持 OpenCL 的设备(例如 Mali 和 PowerVR)上运行。
希望这可以帮助。
在 Sony developer world 上查看 Android OpenCL 演示,包含源代码的完整项目,其中图像的双边过滤在 OpenCL 中完成,并与单线程 C 实现进行比较。也可以在文章中找到一些有关索尼设备等方面的支持类型的信息。
文章:
文章来源:
免责声明:我是索尼移动的顾问
2018 年,您可以使用 openCL 和 Android Studio 开发 Android 应用程序。
为了在 Android Studio 中使用 openCL,您需要做几件事。
/<your_project>/app/src/main/jniLibs/<architecture>/
(您必须自己创建该文件夹)。配置您的模块(应用程序)build.gradle
文件。
android{
...
default_config{
externalNativeBuild{
cmake {
// Filter based on your device architecture
abiFilters 'armeabi-v7a'
}
}
...
}
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
...
}
您应该改用 RenderScript Compute:http: //developer.android.com/guide/topics/renderscript/compute.html
使用 OpenCL 不是很安全,因为库(或功能)可能在目标设备上不可用。老实说,我什至不知道是否有任何 Android 设备真正支持它。如果设备上的 GPU 无法执行您想要运行的任何程序,RenderScript 将回退到 CPU 计算。
但是,如果您仍然想使用 OpenCL,这里有一些可以帮助您的东西 http://www.pgroup.com/lit/articles/insider/v4n2a3.htm
您可能需要/需要特定于设备的 SDK(如 nVidia Tegra SDK)才能进行适当的控制。
所有 Qualcomm Adreno 300 系列都支持 OpenCL 1.1 嵌入式配置文件。要使用 OpenCL,您需要开发 NDK 代码,因为谷歌在 Java 层不支持 OpenCL。如果您知道如何开发 NDK 代码,那么编写 OpenCL 代码非常简单。您需要有可用的 libOpenCL.so,它可以从支持 OpenCL 的设备中获取,例如使用 Snapdragon 的 HTC one、Moto X 和三星 Note/Galaxy 版本。
Khronos 发布了 OpenCL 2.0,包括对 Android 的官方支持: https ://www.khronos.org/news/press/khronos-releases-opencl-2.0
只需查看包含 OpenCL 内核的开源 arm 计算库 (ACL): https ://developer.arm.com/technologies/compute-library
它有一个文档站点: https ://arm-software.github.io/ComputeLibrary/latest/
和一个 github 站点: https ://github.com/ARM-software/ComputeLibrary
还要寻找 Qualcomm SNPE SDK(它使用 OpenCL:https ://developer.qualcomm.com/forum/qdn-forums/software/snapdragon-neural-processing-engine-sdk/34526 ):https://developer.qualcomm。 com/docs/snpe/overview.html
https://www.youtube.com/watch?v=h3T1ekJ_iXM
您还可以查看适用于移动应用的 TensorFlow Lite:https ://www.tensorflow.org/lite/
也许将来它会以 ACL 的方式支持 OpenCL(现在是 Android 8.1 NNAPI 解决方案 - https://www.slideshare.net/kstan2/open-source-nn-frameworks-on-cellphones):
https://github.com/tensorflow/tensorflow/issues/18324
Tensorflow Lite GPU 加速 - 它适用于所有操作系统版本还是仅适用于 8.1?
http://jevois.org/qa/index.php?qa=2057&qa_1=can-tensorflow-lite-use-the-gpu
用 Kotlin 编程的一个很好的例子在这里: https ://github.com/eddywm/KTFLITE
对于同时使用 NNAPI 或 OpenGL 的 caffe2,未来对 OpenCL 有一些希望: https ://github.com/laMia482/caffe2_android