【问题标题】:OpenCL distributionOpenCL 分发
【发布时间】:2023-12-23 05:07:01
【问题描述】:

我目前正在为一组非常异构的计算机开发 OpenCL 应用程序(具体使用 JavaCL)。为了最大限度地提高性能,如果 GPU 可用,我想使用它,否则我想回退到 CPU 并使用 SIMD 指令。我的计划是使用向量类型实现 OpenCL 代码,因为我的理解是这允许 CPU 对指令进行向量化并使用 SIMD 指令。

然而,我的问题是关于使用哪个 OpenCL 实现。例如。如果计算机有 Nvidia GPU,我认为最好使用 Nvidia 的库,但如果没有可用的 GPU,我想使用 Intel 的库来使用 SIMD 指令。

我如何实现这一目标?这是自动处理的还是我必须包含所有库并实现一些逻辑来选择正确的库?感觉这是一个比我面临的问题更多的人。

更新 在测试了不同的 OpenCL 驱动程序之后,这是我目前的经验:

  • Intel:当 JavaCL 尝试调用 JVM 时崩溃。重新启动后,它没有使 JVM 崩溃,但也没有返回任何可用的 设备(我使用的是 Intel I7-CPU)。当我编译 OpenCL-code离线它似乎能够做一些 自动矢量化,因此英特尔的编译器看起来相当不错。

  • Nvidia:拒绝安装他们的 WHQL 驱动程序,因为它声称我没有 Nvidia 卡(那台计算机有 Geforce GT 330M)。什么时候 我在另一台计算机上尝试过,我设法一直到 创建一个内核,但在第一次执行时它使驱动程序崩溃 (屏幕闪烁了一会儿,Windows 7 说它必须 重新启动驱动程序)。第二次执行导致蓝屏 死亡。

  • AMD/ATI:拒绝安装 32 位 SDK(我尝试过,因为我将使用 32 位 JVM)但 64 位 SDK 运行良好。这是唯一的 我设法执行代码的驱动程序(重新启动后 因为起初它在编译时给出了一个神秘的错误消息)。 但是它似乎无法进行任何隐式矢量化 因为我没有任何 ATI GPU 我没有得到任何性能 与 Java 实现相比增加。如果我使用向量类型,我 不过可能会看到一些改进。

TL;DR 似乎没有一个驱动程序可以用于商业用途。我可能会更好地使用编译为使用 SSE 指令的 C 代码创建 JNI 模块。

【问题讨论】:

    标签: installation cross-platform distribution opencl simd


    【解决方案1】:

    首先尝试了解主机和设备:http://www.streamcomputing.eu/blog/2011-07-14/basic-concept-hosts-and-devices/

    基本上,您可以完全按照您的描述进行操作:检查某个驱动程序是否可用,如果没有,请尝试下一个。你首先选择什么完全取决于你自己的喜好。我会选择我测试过我的内核最好的设备。在 JavaCL 中,您可以使用 JavaCL.createBestContext 和 CLPlatform.getBestDevice 选择最快的设备,在此处查看主机代码:http://ochafik.com/blog/?p=501

    知道 NVidia 不通过其驱动程序支持 CPU;只有 AMD 和 Intel 有。还针对多个设备(比如 2 个 GPU 和一个 CPU)有点困难。

    【讨论】:

      【解决方案2】:

      没有提供您想要的 API。但是,您可以执行以下操作:

      我建议您遍历 clGetPlatformIDs 并查询设备数量 (clGetDeviceIDs) 以及每个设备的设备类型; 并选择具有这两种类型的平台。 然后在你的代码中构建一个映射,为每种类型映射支持它的平台列表,以某种方式排序。 最后,只需获取 CL_DEVICE_TYPE_CPU 对应的列表中的第一项和 CL_DEVICE_TYPE_GPU 对应的第一项。 如果两个返回的结果相等(platform_cpu == platform_gpu),则选择其中一个并将其用于两者。

      如果有一个平台支持两者,你会像以前一样得到匹配,因为你有订单列表。那么你也可以在单一平台上做负载均衡,就像英特尔一样。

      【讨论】:

        【解决方案3】:

        抱歉迟到了,但是关于英特尔在 JavaCL 下的实现行为,恐怕你已经被 JavaCL 的 bug 咬了:

        https://github.com/ochafik/nativelibs4java/issues/297

        固定在JavaCL 1.0.0-RC2

        干杯

        【讨论】: