OpenCL发行版

Yrl*_*lec 6 installation cross-platform distribution simd opencl

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

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

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

更新 测试不同的OpenCL驱动程序后,这是我迄今为止的经验:

  • 英特尔:当JavaCL试图调用它时崩溃了JVM.重启后它没有崩溃JVM,但它也没有返回任何可用的设备(我使用的是Intel I7-CPU).当我离线编译OpenCL代码时,它似乎能够进行一些自动向量化,因此英特尔的编译器似乎相当不错.

  • Nvidia:拒绝安装他们的WHQL驱动程序,因为它声称我没有Nvidia卡(该计算机有一台Geforce GT 330M).当我在另一台计算机上尝试它时,我设法获得了创建内核的所有方法,但在第一次执行时它崩溃了驱动程序(屏幕闪烁了一段时间,Windows 7说它必须重新启动驱动程序).第二次执行引起了死亡的蓝屏.

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

TL; DR没有一个驱动程序似乎已准备好用于商业用途.我可能更擅长使用编译为使用SSE指令的C代码创建JNI模块.

Vin*_*ing 4

首先尝试了解主机和设备: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 和英特尔可以。另外,针对多个设备(例如 2 个 GPU 和一个 CPU)也有点困难。