【发布时间】: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