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

时间:2010-04-13 21:53:55

标签: java cuda gpgpu opencl

图形处理单元(GPGPU)上的通用计算是一种非常有吸引力的概念,可以利用GPU的强大功能进行任何类型的计算。

我喜欢使用GPGPU进行图像处理,粒子和快速几何操作。

目前,这个领域的两个竞争者似乎是CUDA和OpenCL。我想知道:

  • OpenCL在Windows / Mac上是否可以从Java使用?
  • 与OpenCL / CUDA接口的库有哪些方法?
  • 直接使用JNA吗?
  • 我忘记了什么吗?

感谢任何现实世界的经验/例子/战争故事。

8 个答案:

答案 0 :(得分:58)

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

它至少在Mac和Windows上实现了从Java Web Start运行良好的演示(为了避免Linux上的随机崩溃,请参阅this wiki page,例如Particles Demo

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

最后,它是最古老的绑定(自2009年6月起)和it has an active user community

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

答案 1 :(得分:33)

您也可以考虑Aparapi。它允许您使用Java编写代码,并尝试在运行时将字节码转换为OpenCL。

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

答案 2 :(得分:11)

好的CUDA是对C的修改,要编写CUDA内核,你必须用C编写代码,然后使用nvidia的CUDA编译器编译成可执行的形式。然后可以使用JNI将生成的本机代码与Java链接。从技术上讲,你无法从Java编写内核代码。有JCUDA http://www.jcuda.de/jcuda/JCuda.html,它为你提供cuda的一般内存/设备管理api和一些用CUDA和JNI包装的Java方法(FFT,一些线性代数方法等等)。

另一方面,OpenCL只是一个API。 OpenCL内核是传递给API的普通字符串,因此使用Java中的OpenCL,您应该能够指定自己的内核。可以在http://www.jocl.org/找到适用于java的OpenCL绑定。

答案 3 :(得分:11)

我一直在使用JOCL,我很满意。

OpenCL优于CUDA(至少对我来说)的主要缺点是缺乏可用的库(Thrust,CUDPP等)。但是,CUDA可以很容易地移植到OpenCL,并且通过查看这些库的工作原理(算法,策略等)实际上非常好,因为你学到了很多东西。

答案 4 :(得分:7)

我知道现在已经很晚了,但请看一下:https://github.com/pcpratts/rootbeer1

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

从项目页面:

Rootbeer比CUDA或OpenCL Java语言绑定更先进。使用绑定,开发人员必须将对象的复杂图形序列化为基本类型的数组。使用Rootbeer,这是自动完成的。此外,对于语言绑定,开发人员必须在CUDA或OpenCL中编写GPU内核。使用Rootbeer完成Java字节码的静态分析(使用Soot),并自动生成CUDA代码。

答案 5 :(得分:2)

我还可以推荐JOCL by jogamp.org,适用于Linux,Mac和Windows。例如,CONRAD将大量OpenCL与JOCL结合使用。

答案 6 :(得分:1)

如果要进行某些图像处理或几何运算,则可能需要具有gpu支持的线性代数库(例如CUDA)。我建议您使用ND4J巫婆,它是基于CUDA GPU支持的线性代数,DeepLearning4J建立在该代数上。这样一来,您不必直接处理CUDA,而不必使用c中的低级代码。另外,如果您想使用DL4J对图像进行更多处理,则可以访问特定的图像处理操作,例如卷积。

答案 7 :(得分:0)

您可以查看CUDA4J API

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