2011-10-13 32 views
6

我目前正在为非常异类的一组计算机开发一个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代码。

回答

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)会更难一些。

2

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

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

如果有一个平台支持这两个平台,您将得到匹配,因为你有订单清单。那么你也可以在单一平台上进行负载平衡,比如英特尔所拥有的平台。