我目前正在为非常异类的一组计算机开发一个OpenCL应用程序(使用JavaCL进行具体说明)。为了最大限度地提高性能,我想要使用GPU,否则我想回到CPU并使用SIMD指令。我的计划是使用向量类型实现OpenCL代码,因为我的理解是,这允许CPU对向导进行向量化并使用SIMD指令。OpenCL发行版
但是我的问题是关于使用哪种OpenCL实现。例如。如果电脑有Nvidia GPU,我认为最好使用Nvidia的库,但如果没有GPU可用,我想使用Intel的库来使用SIMD指令。
我该如何做到这一点?这是自动处理还是必须包含所有库和实现一些逻辑来选择正确的?感觉这是一个比我面临的问题更多的人。
更新 测试不同的OpenCL的驱动程序后,这是我的经验,到目前为止:
英特尔:坠毁JVM时JavaCL试图调用它。重新启动后,它不会使JVM崩溃,但它也不会返回任何可用的设备(我正在使用Intel I7-CPU)。当我离线编译 OpenCL代码时,它似乎可以执行一些 自动向量化,所以Intel的编译器看起来相当不错。
Nvidia的:拒绝安装他们通过WHQL驱动程序,因为它声称我没有Nvidia的卡(即计算机有一块GeForce GT 330M)。当我试图在不同的计算机上尝试它时,我设法创建了一个内核,但在第一次执行时崩溃了驱动程序 (屏幕闪烁了一段时间,Windows 7说它必须重新启动驱动程序 ) 。第二次执行导致蓝屏 死亡。
AMD/ATI:拒绝安装32位SDK(我尝试过,因为我将使用32位JVM),但64位SDK运行良好。这是我设法执行代码的唯一 驱动程序(在重启 之后,因为在编译时它首先给出了一个隐含的错误消息)。 但是,它似乎无法做任何隐式矢量化 ,并且由于我没有任何ATI GPU,因此与Java实现相比,我没有得到任何性能 增加。如果我使用矢量类型,我可能会看到一些改进。
TL; DR无司机似乎准备用于商业用途。我可能更好的创建JNI模块与编译为使用SSE指令的C代码。