【问题标题】:Is it possible to create a Hybrid GPU accelerated application in Java that utilize CUDA & OpenCL?是否可以使用 CUDA 和 OpenCL 在 Java 中创建混合 GPU 加速应用程序?
【发布时间】:2014-05-30 23:07:03
【问题描述】:

根据我的经验,使用CUDA 编写的应用程序在相同的 NVidia 硬件上运行时比使用OpenCL 编写的应用程序运行得更快。

如何在不失去OpenCL 的跨平台功能的情况下利用此功能?

我怀疑有可能创建一个“故障回复”系统,如果没有可用的 NVidia 设备和/或没有请求内核的CUDA 版本,那么系统将故障回复为使用OpenCL 版本.或者,大型任务可以在 NVidia 和非 NVidia 硬件之间进行负载平衡。理想情况下,这样的应用程序需要是跨平台的,并且还可以在没有 NVidia 硬件的机器上运行。

据我所知,这归结为能够将CUDA 支持用作动态库 (dll/.so)。我已经在使用JOCL 访问OpenCL,但我不知道如何绑定到使用CUDA 生成的内核,因为我能找到的所有示例都是独立应用程序。

是否有此类系统的任何开源示例?

是否存在任何技术限制导致无法开发此类混合应用程序?

【问题讨论】:

  • Java 没有什么不可能的 :)
  • 您始终可以使用 JNI 并将 Java 绑定到 C 代码
  • @Martin Perry,谢谢。我没有使用过 JNI,但这看起来确实很有可能。它还可以解决我访问 AMD-ADL 库的其他问题,因为我正在将 SWIG 视为该问题的解决方案,但我没有看到将 SWIG 用于 cuda 项目的任何真正可能性。

标签: java cuda cross-platform opencl


【解决方案1】:

回答问题:

开发是可能的,你可以做到没有任何问题 使用 cmets 中注释的工具。 (例如,JCUDA 和 JOCL) 快速的谷歌搜索将为您带来许多免费的包装器,用于将 CUDA 和 OpenCL 转换为 Java。

至于故障保护,CUDA_ERROR_INVALID_DEVICE 将在 在 JCUDA 中的非 CUDA 系统中初始化 CUDA。 JOCL 在初始化阶段会给出类似的错误。然后你可以简单地选择一个没有失败的或者最适合你的。 (或者在最后一种情况下,CPU 代码仅在 Java 中)

但是,我无法理解您的问题的背景。因为我找不到任何 OpenCL 对 CUDA 速度较慢的情况。至少,不是在标准的最新版本中。我个人的使用表明,即使在某些情况下,OpenCL 也更快(+-5%)。当然,你需要正确地实现这两者,否则,其中一个将因错误的部署而受到严重惩罚。

您最好选择只使用这两个选项中的一个,或者 CUDA(如果您发现它更简单,并且可以为您提供良好的性能而不会让人头疼)或 OpenCL(为了灵活性)。两者都使用,同时维护,并为每种情况正确选择有用的,以及必须处理故障安全代码,将使您的项目变得非常困难。

【讨论】:

    【解决方案2】:

    也许还可以看看OpenCL,理论上它应该更跨平台,并且还允许在不同的处理器上透明地运行(阅读:可用的 GPU 和/或 CPU)。

    【讨论】:

    • 我在这里遗漏了什么吗,这如何回答这个问题?我已经知道 OpenCL 支持 NVidea 卡,问题是 NVidea 卡的 Cuda 比 OpenCL 更快,因此能够在支持的情况下使用 Cuda 并且故障回复到 OpenCL 是一个更可取的解决方案。
    • 我想说的是OpenCL提供了更好的兼容性:如果有NVidia硬件,你的代码可以在上面运行;如果有 AMD 硬件,你的代码可以在上面运行;如果两者都不存在,它仍然可以在任何可用的 CPU 上原封不动地运行您的代码,并且它也应该可用于 GPU 和 CPU 之间的“负载平衡”。因此,这将占用您实施后备机制的大部分工作。理想情况下,您只需编写一段 OpenCL 代码,即可在任何可用硬件上运行。
    猜你喜欢
    • 2018-12-05
    • 2019-08-17
    • 2020-01-07
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多