图形处理单元(GPGPU)上的通用计算是一种非常有吸引力的概念,可以利用GPU的强大功能进行任何类型的计算.
我喜欢使用GPGPU进行图像处理,粒子和快速几何操作.
现在看来,这个领域的两个竞争者似乎是CUDA和OpenCL.我想知道:
OpenCL在Windows/Mac上是否可以从Java使用?
有哪些库与OpenCL/CUDA接口?
是否直接使用JNA?
我忘记了什么吗?
任何真实世界的经验/例子/战争故事都值得赞赏.
AFAIK,JavaCL/OpenCL4Java是目前所有平台上唯一可用的OpenCL绑定(包括MacOS X,FreeBSD,Linux,Windows,Solaris,全部采用Intel 32,64位和ppc变体,这要归功于它使用JNA).
它至少在Mac和Windows上实现了从Java Web Start运行良好的演示(为避免Linux上的随机崩溃,请参阅此Wiki页面,例如此Particles Demo.
它还带有一些实用程序(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,您应该能够指定自己的内核.可以在http://www.jocl.org/找到适用于Java的OpenCL绑定.
我一直在使用JOCL,我很高兴.
OpenCL相对于CUDA的主要缺点(至少对我而言)是缺少可用的库(Thrust,CUDPP等).然而,CUDA可以很容易地移植到OpenCL,并且通过查看这些库如何工作(算法,策略等)实际上是非常好的,因为你学到了很多东西.
我知道现在已经很晚了,看看这个:https://github.com/pcpratts/rootbeer1
我没有使用它,但似乎比其他解决方案更容易使用.
从项目页面:
Rootbeer比CUDA或OpenCL Java语言绑定更先进.使用绑定,开发人员必须将对象的复杂图形序列化为基本类型的数组.使用Rootbeer,这是自动完成的.此外,对于语言绑定,开发人员必须在CUDA或OpenCL中编写GPU内核.使用Rootbeer,可以完成Java Bytecode的静态分析(使用Soot),并自动生成CUDA代码.