96

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

我很想将 GPGPU 用于图像处理、粒子和快速几何运算。

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

  • OpenCL 是否可以在 Windows/Mac 上的 Java 中使用?
  • 与 OpenCL/CUDA 接口的库方法是什么?
  • 直接使用 JNA 是一种选择吗?
  • 我是不是忘记了什么?

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

4

8 回答 8

62

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的作者 :-))

于 2010-07-22T08:47:20.983 回答
35

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

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

于 2011-10-06T16:36:42.380 回答
12

那么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/

于 2010-04-15T12:32:14.027 回答
11

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

OpenCL 在 CUDA 上的主要缺点(至少对我而言)是缺乏可用的库(Thrust、CUDPP 等)。然而,CUDA 可以很容易地移植到 OpenCL,并且通过查看这些库的工作方式(算法、策略等)实际上非常好,因为您可以从中学到很多东西。

于 2010-05-06T14:35:54.633 回答
7

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

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

从项目页面:

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

于 2012-08-15T10:25:25.520 回答
2

我还可以推荐jogamp.org 的 JOCL,适用于 Linux、Mac 和 Windows。例如,CONRAD大量使用 OpenCL 和 JOCL。

于 2014-12-18T20:31:10.433 回答
1

如果你想做一些图像处理或几何运算,你可能需要一个支持 gpu 的线性代数库(例如 CUDA)。我建议你 ND4J 女巫是构建 DeepLearning4J 的具有 CUDA GPU 支持的线性代数。这样您就不必直接处理 CUDA 并且必须在 c 中编写低级代码。另外,如果您想使用 DL4J 对图像进行更多处理,您将可以访问特定的图像处理操作,例如卷积。

于 2019-06-21T14:14:18.940 回答
0

你可以看看 CUDA4J API

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

于 2015-11-11T01:32:28.790 回答