【问题标题】:Best approach for GPGPU/CUDA/OpenCL in Java?Java 中 GPGPU/CUDA/OpenCL 的最佳方法?
【发布时间】:2011-02-07 16:12:51
【问题描述】:

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

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

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

  • OpenCL 是否可以在 Windows/Mac 上通过 Java 使用?
  • 与 OpenCL/CUDA 接口的库方法有哪些?
  • 是否可以直接使用 JNA?
  • 我是不是忘记了什么?

感谢任何现实世界的经验/例子/战争故事。

【问题讨论】:

  • 考虑到我在 cuda 编程中使用了多少指针,我想用 Java 编程 GPU 会很困难。我不知道在设备编程中使用 Java 是否有很多好处,因为您不太可能实现将 Java 与 C++ 区分开来的完整 Java 功能/库
  • 我看过一些令人印象深刻的 Java 演示,它们使用了 GLSL 和可能的 CUDA,所以这当然是可能的。
  • 你检查过 jcuda.org 和 jocl.org 了吗?
  • 我知道他们,但我无法判断质量。你有他们的经验吗?
  • @Nils: 所以这就是为什么他想把所有的数字都推到 GPU 上......无论如何,即使是普通的 C 或 x86 asm 也很难与海量数据并行处理器竞争,比如GPU。

标签: java cuda gpgpu opencl


【解决方案1】:

AFAIK,JavaCL / OpenCL4Java 是目前唯一可在所有平台上使用的 OpenCL 绑定(包括 MacOS X、FreeBSD、Linux、Windows、Solaris,全部采用 Intel 32、64 位和 ppc 变体,这要归功于它使用JNA)。

它的演示至少在 Mac 和 Windows 上可以从 Java Web Start 正常运行(为避免在 Linux 上随机崩溃,请参阅 this wiki page,例如 Particles Demo

它还附带一些实用程序(GPGPU 随机数生成、基本并行归约、线性代数)和 Scala DSL

最后,它是最旧的可用绑定(自 2009 年 6 月以来)和it has an active user community

(免责声明:我是JavaCL的作者:-))

【讨论】:

  • 哦,我对 JNLP 感到非常兴奋,但显然它不喜欢我的 macbook。跨平台就这么多。
  • @Karl 哦,对不起,我破坏了 JNLP(JAR 最近更名了)!现在已经修复了,希望你能再试一次......(并且跨平台:它在所有平台上一直被破坏;-))
  • 最近 Java 7 安全性的加强导致 Particle Demo Web Start 失败并出现异常。
  • @zOlive 最后一个指向 google 代码的 JavaCl 链接不再可用。
【解决方案2】:

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

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

【讨论】:

  • aparapi 还维护吗?
  • @MrJedi:我想是的,github 上的最新提交只有几天前:github.com/aparapi/aparapi
  • 它“有点维护”;)我是维护者。
【解决方案3】:

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/

【讨论】:

  • 如果您的平台支持 JNA (jna.dev.java.net),我会使用它来调用本机代码,因为它比编写 JNI 库要省力得多。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    我知道已经很晚了,但请看一下:https://github.com/pcpratts/rootbeer1

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

    来自项目页面:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          你可以看看 CUDA4J API

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

          【讨论】:

            猜你喜欢
            • 2011-04-17
            • 2019-08-03
            • 2017-05-10
            • 2012-06-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-21
            相关资源
            最近更新 更多