Java中GPGPU/CUDA/OpenCL的最佳实现方法是什么?

96

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

我希望使用GPGPU进行图像处理、粒子和快速几何运算。

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

  • 在Windows/Mac上,Java是否已经可以使用OpenCL?
  • 与OpenCL/CUDA接口的库有哪些方式?
  • 直接使用JNA是否可行?
  • 我有遗漏的地方吗?

任何实际经验/示例/战斗经历都将不胜感激。


1
我认为在Java中编程GPU会很困难,考虑到我在cuda编程中使用指针的频率。我不知道在设备编程中使用Java是否有太多好处,因为你不太可能拥有完整的Java特性/库,这些特性使Java与C++有所区别。 - Anycorn
2
我看过一些使用GLSL和可能是CUDA的令人印象深刻的Java演示,所以这肯定是可能的。 - Frederik
1
你有查看过 jcuda.org 和 jocl.org 吗? - bakkal
1
我知道它们,但我无法评判它们的质量。你有过使用它们的经验吗? - Frederik
4
@Nils:这就是他想要将所有数字计算都推到GPU上的原因...无论如何,即使是普通的C语言或x86汇编也难以与像GPU这样的大规模数据并行处理器竞争。 - elmattic
显示剩余5条评论
8个回答

64
据我所知,JavaCL / OpenCL4Java 是目前唯一可在所有平台上使用的OpenCL绑定(包括MacOS X、FreeBSD、Linux、Windows、Solaris,均支持Intel 32位、64位和ppc变体,这要归功于其使用JNA)。
它有一些演示程序,在至少Mac和Windows上可以正常运行(为了避免在Linux上出现随机崩溃,请参见此wiki页面,例如这个Particles Demo)。
它还带有一些实用工具(GPGPU随机数生成、基本并行约简、线性代数)和一个Scala DSL
最后,它是最早可用的绑定(自2009年6月起),并且拥有活跃的用户社区
(免责声明:我是JavaCL的作者 :-))

哦,我对JNLP非常兴奋,但显然它不喜欢我的MacBook。跨平台的想法破灭了。 - Karl
5
抱歉,我弄坏了JNLP(由于JAR文件最近更改了名称)!现在已经修复了,希望你会再次尝试...而且这个问题是跨平台的:在所有平台上都有同样的问题。 - zOlive
3
最近Java 7安全性方面的加强导致粒子演示Web Start出现异常无法运行。 - Thorbjørn Ravn Andersen
@zOlive 最后一个JavaCl到Google Code的链接已经无法访问了。 - tryman

35

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

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


Aparapi 还在维护吗? - Mr Jedi
@MrJedi:我也这么认为,最新的提交在 GitHub 上只有几天的时间:https://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(http://jna.dev.java.net),我会使用它来调用本地代码,因为相比编写JNI库,这需要更少的工作量。 - mdma

11

我一直在使用JOCL,并且对它非常满意。

OpenCL相对于CUDA的主要劣势(至少对我而言)是缺乏可用的库(如Thrust、CUDPP等)。但是,CUDA可以很容易地移植到OpenCL,并通过查看这些库的工作方式(算法、策略等),你实际上可以学到很多东西。


7

我知道现在已经很晚了,但请看一下这个链接:https://github.com/pcpratts/rootbeer1

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

从项目页面来看:

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


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

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接