2012-01-25 39 views
24

对于平台独立性(桌面,云,移动,......),当速度很重要时,使用OpenCL进行GPGPU开发将是非常好的选择。我知道Google推动RenderScript作为替代方案,但它似乎只适用于Android,并且不太可能包含在iOS中。如何在Android上使用OpenCL?

因此,我寻求一种解决方案来执行Android应用程序中的OpenCL代码。

+0

我想知道在英特尔将微软的AMP适配到OpenCL&llvm/Clang的这个故事之后,在这里可能会有更新吗?http://www.phoronix.com/scan.php?page=news_item&px = MTIyOTk与最近在Android NDK工具链中包含的llvm/Clang相结合:http://clang-developers.42468.n3.nabble.com/Clang-now-included-in-Android-NDK-r8c-td4028206 .html只是现在看这个,还没有尝试过,我会在未来的帖子中试验并提供我的结果的消息。 – Jackalope

回答

12

我知道支持OpenCL的唯一Android设备是基于Mali T600系列芯片的设备(文章here)。他们有一个OpenCL SDK。显然它也是OpenCL 1.1的完整配置文件。

Nexus 10是使用这种芯片的设备。三星Exynos 5双SoC使用的是Mali T604,所以任何使用这种软件的东西都可以与Mali T600 OpenCL SDK一起使用(我自己也没有尝试过)。

OpenCL博客的作者正在尝试have a go with this,因此可能值得关注他的系列文章。但是,Android上的OpenCL支持是全新的(截至2013年2月16日),尽管对于实验很有帮助,但在获得更多支持之前,它可能值得保持谨慎(谁说OpenCL的初始支持有多么奇怪1.1)

+2

Adreno 320及更高版本拥有OpenCL,例如Nexus 4支持它 –

+2

但我相信4.3的Google设备都不会公开它。 – chrisvarnz

+0

纠正我,如果我错了,但AFAIK,它是绝对不可能在最新版本的Android上使用OpenCL,它不会改变。 Google正在推动Android上的Rendescript来完成这类任务。 – Teovald

4

您应该使用的renderScript计算代替: 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)。

+3

这并不回答问题。如果问题是我如何访问GPU ... –

+2

@TimChild问题是如何使用GPGPU的OpenCL,我回答。 – silverclaw

+5

你没有 - 当OP明确提到他对RenderScript缺乏兴趣时,你说不要使用它。我相信@prunge的回答更准确。另外,PGCL是一种商业产品。 – Ani

2

所有高通公司的Adreno 300个连续支撑的OpenCL 1.1嵌入的配置文件。要使用OpenCL,您需要开发NDK代码,因为OpenCL在Java层不受谷歌支持。如果您知道如何开发NDK代码,那么编写OpenCL代码非常简单。您需要安装libOpenCL.so,可以从支持OpenCL的设备(例如HTC one,Moto X和使用Snapdragon的Samsung Note/Galaxy版本)获取libOpenCL.so。

5

在Sony开发人员世界中签出一个Android OpenCL演示,完整的源代码项目,其中双向过滤图像在OpenCL中完成,并与单线程C实现进行比较。文章中还提供了有关索尼设备中预期的支持类型的一些信息。

文章:

Boost the performance of your Android app with OpenCL

来源的文章:

Source to OpenCl Android project

免责声明:我在索尼移动

+0

OpenCL是不适用于所有Android设备,误导开发者认为这是一个合理的API用于开发/分发是错误的。如果您需要进一步澄清,请随时与我联系。 –

+1

我从来没有说过相反的东西(它可以在所有设备上使用),相反,在索尼设备支持它的文章中清楚地陈述了这一点,其他几个答案提供了一些见解, 。 – Magnus

8

顾问虽然自原题时间已经过去了被问到,我认为这仍然是很多开发者的问题。

答案有两个方面。 首先,不幸的是,Google不正式支持OpenCL。第二,幸运的是,许多芯片供应商提供他们的库来支持OpenCL。就目前而言,大多数旗舰级和中级智能手机(包括Qualcomm Adreno GPU,ARM Mali GPU或Imagination PowerVR GPU)均包含OpenCL库。

要在Android上使用OpenCL的,有以下几个步骤:

  1. 检查是否有设备上的OpenCL库。这可以通过使用OpenCL-Z Android来完成。这是检查Android设备上OpenCL可用性的好工具,它还提供原始计算性能指标,这可能非常有用。

OpenCL的库的主要芯片供应商可以在设备中找到: 以下是OpenCL的库的位置:

高通公司的Adreno:

/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 

的PowerVR:

/system/vendor/lib/libPVROCL.so 
  • 收件用C或C++

  • 创建NDK项目编译C/C++代码的OpenCL的程序,并测试它们的设备为可执行上。

  • 为您的NDK程序功能创建JNI接口。

  • 创建Android项目,使用JAVA代码中的JNI函数调用涉及OpenCL的本机函数。

  • 索尼教程是一个很好的参考来源。该教程中介绍的技术可以应用于任何Qualcomm Adreno GPU。只需很少的修改,该代码和makefile就可以在其他具有OpenCL功能的设备(如Mali和PowerVR)上运行。

    希望这会有所帮助。

    +0

    只需要说一声谢谢OpenCL-Z的参考资料......在那里OpenGLES-OpenCL interop的信息很少!我很感激! – 2016-05-22 22:43:23

    +0

    嗯,我认为原因是很少有人曾经使用过gl-cl互操作功能。特别是我们在更新的OpenGL中使用了GL计算着色器,我们将在应用程序中看到gl-cl interop的机会会更少。 –

    +0

    顺便说一句,如果我没记错的话,在旧的三星Exynos芯片中,Mali GPU(T-628)支持OpenCL 1.1,但是,一些GL-CL interop API甚至没有实现!我知道,因为我有一些包含GL-CL缓冲区互操作的代码,所以在执行这些API时代码崩溃了。然后我检查了libGLES_mali.so,发现这些API甚至没有实现。 –