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


94

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

我很想使用GPGPU进行图像处理,粒子和快速几何运算。

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

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

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


1
考虑到在cuda编程中使用指针的程度,我可以想象用Java编程GPU会很困难。我不知道在设备编程中使用Java是否会有很多好处,因为您不太可能实现将Java与C ++区别开来的完整Java功能/库
Anycorn'4

2
我看过一些使用GLSL和CUDA的Java演示,所以这确实是可能的。
Frederik 2010年

1
您是否检查过jcuda.org和jocl.org?
bakkal 2010年

1
我了解它们,但是我无法判断质量。您对他们有经验吗?
Frederik 2010年

4
@Nils:所以这就是为什么他想要推动GPU上的所有数字处理……无论如何,即使是普通的C或x86 asm也很难与GPU等大型数据并行处理器竞争。
斯金格

Answers:


62

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


哦,我为JNLP感到非常兴奋,但显然它不喜欢我的macbook。跨平台的内容太多了。
卡尔

5
@Karl哦,抱歉,我打破了JNLP(JAR最近更名)!现在已解决,希望您再试一次...(以及跨平台方面:在所有平台上均已被破坏;
zOlive 2010年

3
Java 7安全性中最近的严格限制导致Particle Demo Web Start失败,并发生异常。
托尔比约恩Ravn的安徒生

@zOlive到谷歌代码的最新JavaCl链接不再可用。
tryman '19

34

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

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


仍然aparapi保持吗?
杰迪先生

@MrJedi:我认为是这样,对github的最新提交只有几天的历史:github.com/aparapi/aparapi
Aydin K.

这是“有些维护”;)我是维护者。
barneypitt

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/中找到。


2
如果您的平台支持JNA(jna.dev.java.net),我将使用它来调用本机代码,因为与编写JNI库相比,它的工作量要少得多。
mdma,2010年

11

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

与CUDA相比,OpenCL的主要缺点(至少对我而言)是缺少可用的库(Thrust,CUDPP等)。但是,CUDA可以很容易地移植到OpenCL,并且通过学习这些库的工作原理(算法,策略等)实际上非常好。


7

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

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

从项目页面:

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



1

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.