图形处理单元(GPGPU)上的通用计算是一个非常吸引人的概念,可以利用GPU的能力进行任何类型的计算。
我很想使用GPGPU进行图像处理,粒子和快速几何运算。
现在,似乎这个领域的两个竞争者是CUDA和OpenCL。我想知道:
- Windows / Mac上的Java是否可以使用OpenCL?
- 与OpenCL / CUDA接口的库方法是什么?
- 直接使用JNA是一种选择吗?
- 我忘记了什么吗?
任何现实世界的经验/示例/战争故事都值得赞赏。
图形处理单元(GPGPU)上的通用计算是一个非常吸引人的概念,可以利用GPU的能力进行任何类型的计算。
我很想使用GPGPU进行图像处理,粒子和快速几何运算。
现在,似乎这个领域的两个竞争者是CUDA和OpenCL。我想知道:
任何现实世界的经验/示例/战争故事都值得赞赏。
Answers:
AFAIK,JavaCL / OpenCL4Java是目前在所有平台(包括MacOS X,FreeBSD,Linux,Windows,Solaris,所有Intel 32、64位和ppc变体)中可用的唯一OpenCL绑定,这要归功于它使用JNA)。
它具有至少可以在Mac和Windows上从Java Web Start正常运行的演示(为避免在Linux上随机崩溃,请参阅此Wiki页面,例如此粒子演示)。
它还带有一些实用程序(GPGPU随机数生成,基本并行约简,线性代数)和Scala DSL。
最后,它是最早的绑定(自2009年6月以来),并且拥有活跃的用户社区。
(免责声明:我是JavaCL的作者:-))
您也可以考虑Aparapi。它允许您用Java编写代码,并尝试在运行时将字节码转换为OpenCL。
全面披露。我是Aparapi开发人员。
好吧,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,您应该能够指定自己的内核。Java的OpenCL绑定可在http://www.jocl.org/中找到。
我知道已经晚了,但是看看这个:https : //github.com/pcpratts/rootbeer1
我没有使用它,但似乎比其他解决方案更容易使用。
从项目页面:
Rootbeer比CUDA或OpenCL Java语言绑定更高级。使用绑定,开发人员必须将对象的复杂图序列化为原始类型的数组。使用Rootbeer,这是自动完成的。同样,使用语言绑定,开发人员必须使用CUDA或OpenCL编写GPU内核。使用Rootbeer(使用Soot)对Java字节码进行了静态分析,并自动生成了CUDA代码。
我还可以通过jogamp.org推荐JOCL,可在Linux,Mac和Windows上运行。例如,CONRAD将大量的OpenCL与JOCL结合使用。
如果要进行某些图像处理或几何运算,则可能需要具有gpu支持的线性代数库(例如CUDA)。我建议您使用ND4J巫婆,它是基于CUDA GPU的线性代数,DeepLearning4J构建在该代数上。这样一来,您不必直接处理CUDA,而不必使用c中的低级代码。另外,如果您想使用DL4J对图像进行更多处理,则可以访问特定的图像处理操作,例如卷积。
您可以看一下CUDA4J API