Java中GPGPU / CUDA / OpenCL的最佳方法?

graphics处理单元( GPGPU )上的通用计算是利用GPU的function进行任何计算的一个非常有吸引力的概念。

我很乐意使用GPGPU进行image processing,粒子和快速几何操作。

现在看来,这个领域的两位竞争者是CUDA和OpenCL。 我想知道:

  • Windows / Mac上的OpenCL是否可用于Java?
  • 什么是与OpenCL / CUDA接口的库方法?
  • 是直接使用JNA的一个选项?
  • 我忘了什么吗?

任何现实世界的经验/例子/战争故事,赞赏。

AFAIK, JavaCL / OpenCL4Java是目前在所有平台上可用的唯一OpenCL绑定(包括MacOS X,FreeBSD,Linux,Windows,Solaris,全部采用Intel 32,64位和ppc变体,这要感谢JNA的使用)。

它至less在Mac和Windows上有Java Web Start实际上运行良好的演示(为了避免Linux上的随机崩溃,请参阅这个wiki页面 ,例如这个Particles Demo 。

它还附带了一些实用程序(GPGPU随机数生成,基本并行缩减,线性代数)和一个Scala DSL 。

最后,它是可用的最老的绑定(自2009年6月起), 它有一个活跃的用户社区 。

(免责声明:我是JavaCL的作者:-))

你也可以考虑Aparapi http://aparapi.googlecode.com 。 它允许您用Java编写代码,并尝试在运行时将字节码转换为OpenCL。

全面披露。 我是Aparapi开发人员。

那么CUDA是C的修改,编写CUDA内核你必须用C编写代码,然后用nvidia的CUDA编译器编译成可执行forms。 生成的本地代码可以使用JNI与Jav​​a链接。 所以在技术上你不能从Java编写内核代码。 有JCUDA http://www.jcuda.de/jcuda/JCuda.html ,它为您提供一般内存/设备pipe理的cuda的apis,以及一些在CUDA和JNI中实现的Java方法(FFT,一些线性代数方法..等等)。

另一方面,OpenCL只是一个API。 OpenCL内核是传递给API的纯string,所以使用OpenCL从Java你应该能够指定你自己的内核。 用于java的OpenCL绑定可以在这里findhttp://www.jocl.org/ 。

我一直在使用JOCL,对此我感到非常满意。

OpenCL超过CUDA的主要缺点是缺乏可用的库(Thrust,CUDPP等)。 然而,CUDA可以很容易地移植到OpenCL,通过查看这些库的工作方式(algorithm,策略等),实际上非常好,因为您可以学到很多东西。

我知道这是晚了,但看看这个: https : //github.com/pcpratts/rootbeer1

我没有使用它,但似乎比其他解决scheme更容易使用。

从项目页面:

Rootbeer比CUDA或OpenCL Java语言绑定更高级。 通过绑定,开发人员必须将对象的复杂graphics序列化为原始types的数组。 使用Rootbeer,这是自动完成的。 还有语言绑定,开发者必须将GPU内核写入CUDA或OpenCL。 使用Rootbeer对Java字节码进行静态分析(使用Soot),并自动生成CUDA代码。

我也可以通过jogamp.org推荐JOCL ,适用于Linux,Mac和Windows。 例如, CONRAD和JOCL结合使用了OpenCL。

你可以看看CUDA4J API

http://sett.com/gpgpu/the-cuda4j-api

在Google的最后一个成就之后,我认为tensorflow是GPU上最好的计算方法,而不是OpenCL。 Tensorflow支持使用相同API的OpenCL和CUDA计算。