Installation OpenCL分布

Installation OpenCL分布,installation,cross-platform,distribution,opencl,simd,Installation,Cross Platform,Distribution,Opencl,Simd,我目前正在为一组非常异构的计算机开发一个OpenCL应用程序(具体使用JavaCL)。为了最大限度地提高性能,如果GPU可用,我想使用它,否则我想回到CPU,使用SIMD指令。我的计划是使用向量类型实现OpenCL代码,因为我的理解是这允许CPU将指令向量化并使用SIMD指令 然而,我的问题是关于使用哪种OpenCL实现。例如,如果计算机有Nvidia GPU,我认为最好使用Nvidia的库,但如果没有可用的GPU,我希望使用Intel的库来使用SIMD指令 我如何做到这一点?这是自动处理的还是

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

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

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

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

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

  • Nvidia:拒绝安装他们的WHQL驱动程序,因为它声称我没有Nvidia卡(那台计算机有Geforce GT 330M)。什么时候 我在另一台电脑上试过,我一路都能找到 创建一个内核,但在第一次执行时它使驱动程序崩溃 (屏幕闪烁了一段时间,Windows7说它必须 重新启动驱动程序)。第二次处决造成了一场惨败 死亡

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


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

首先尝试了解主机和设备:

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


知道NVidia不通过其驱动程序支持CPU;只有AMD和英特尔这样做。同时,针对多个设备(比如2个GPU和一个CPU)的开发也有点困难。

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

我建议您迭代CLGetPlatformID,并查询每个设备的设备数量(CLGetDeviceID)和设备类型; 选择两种类型的平台。 然后用u'r代码构建一个映射,映射每种类型的支持它的平台列表,并以某种方式排序。 最后,只需获取列表中对应于CL_DEVICE_TYPE_CPU的第一项和对应于CL_DEVICE_TYPE_GPU的第一项。 如果两个返回的结果相等(platform\u cpu==platform\u gpu),则选择其中一个并将其用于两个


如果有一个平台同时支持这两种功能,那么您将像以前一样获得匹配项,因为您有订单列表。如果你喜欢,你也可以在单一平台上进行负载平衡,就像英特尔一样。

很抱歉来晚了,但是关于英特尔在JavaCL下的实施行为,我恐怕你已经被JavaCL错误咬到了:

修正

干杯