图形处理单元 ( GPGPU )上的通用计算是一个非常有吸引力的概念,可以利用 GPU 的能力进行任何类型的计算。
我很想将 GPGPU 用于图像处理、粒子和快速几何运算。
目前,该领域的两个竞争者似乎是 CUDA 和 OpenCL。我想知道:
- OpenCL 是否可以在 Windows/Mac 上的 Java 中使用?
- 与 OpenCL/CUDA 接口的库方法是什么?
- 直接使用 JNA 是一种选择吗?
- 我是不是忘记了什么?
任何现实世界的经验/例子/战争故事都值得赞赏。
图形处理单元 ( GPGPU )上的通用计算是一个非常有吸引力的概念,可以利用 GPU 的能力进行任何类型的计算。
我很想将 GPGPU 用于图像处理、粒子和快速几何运算。
目前,该领域的两个竞争者似乎是 CUDA 和 OpenCL。我想知道:
任何现实世界的经验/例子/战争故事都值得赞赏。
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,您应该能够指定自己的内核。Java 的 OpenCL 绑定可以在这里找到http://www.jocl.org/。
我一直在使用 JOCL,对此我非常满意。
OpenCL 在 CUDA 上的主要缺点(至少对我而言)是缺乏可用的库(Thrust、CUDPP 等)。然而,CUDA 可以很容易地移植到 OpenCL,并且通过查看这些库的工作方式(算法、策略等)实际上非常好,因为您可以从中学到很多东西。
我知道已经很晚了,但看看这个:https ://github.com/pcpratts/rootbeer1
我没有使用过它,但似乎比其他解决方案更容易使用。
从项目页面:
Rootbeer 比 CUDA 或 OpenCL Java 语言绑定更先进。使用绑定,开发人员必须将复杂的对象图序列化为原始类型数组。使用 Rootbeer,这是自动完成的。同样使用语言绑定,开发人员必须在 CUDA 或 OpenCL 中编写 GPU 内核。使用 Rootbeer 对 Java 字节码进行静态分析(使用 Soot)并自动生成 CUDA 代码。
我还可以推荐jogamp.org 的 JOCL,适用于 Linux、Mac 和 Windows。例如,CONRAD大量使用 OpenCL 和 JOCL。
如果你想做一些图像处理或几何运算,你可能需要一个支持 gpu 的线性代数库(例如 CUDA)。我建议你 ND4J 女巫是构建 DeepLearning4J 的具有 CUDA GPU 支持的线性代数。这样您就不必直接处理 CUDA 并且必须在 c 中编写低级代码。另外,如果您想使用 DL4J 对图像进行更多处理,您将可以访问特定的图像处理操作,例如卷积。
你可以看看 CUDA4J API