我正在学习OpenCL编程,并注意到一些奇怪的东西。
即,当我在我的机器(Macbook Pro)上列出所有启用OpenCL的设备时,我会得到以下列表:
第一个是我的CPU,第二个是英特尔的板载图形解决方案,第三个是我的专用显卡。
研究表明,英特尔已将其硬件OpenCL兼容,以便我可以利用板载图形单元的强大功能。那将是Iris Pro。
考虑到这一点,CPU与OpenCL兼容的目的是什么?仅仅为了方便,内核可以在CPU上运行,因为备份不应该找到其他卡,或者当运行代码作为OpenCL内核而不是常规(C,良好线程)程序时,是否存在任何速度优势CPU?
答案 0 :(得分:9)
基本上,英特尔OpenCL编译器为某些类型的内核执行水平自动向量化。这意味着使用SSE4,您可以在单个核心中并行运行8个线程,类似于Nvidia GPU在单个32宽simd单元中运行32个线程。
这种方法有两个主要好处:如果在2年内它们将SSE矢量宽度增加到16,会发生什么?然后,当您在该CPU上运行时,您将立即获得16个线程的自动向量化。无需重新编译代码。第二个好处是,与在ASM或C中编写并使编译器生成高效代码相比,编写一个易于自动向量化的OpenCL内核要容易得多。
答案 1 :(得分:4)
我已经考虑了一段时间了。您可以在不使用OpenCL的情况下获得OpenCL的大部分优势,而且不会在C ++中遇到太多困难。要做到这一点,你需要:
使用CPU调度程序确定可用的硬件,并根据硬件选择最佳代码路径。这提供了OpenCL的一个优点。
这为您提供了OpenCL在CPU上的大部分优势,而没有任何缺点。您永远不必担心供应商停止支持驱动程序。 Nvidia对OpenCL的支持很少 - 包括几年前可能永远无法解决的错误(我浪费了太多时间)。 Intel仅提供适用于Windows的Iris Pro OpenCL驱动程序。使用我建议的方法的内核可以使用所有C ++功能,包括模板,而不是OpenCL的限制和扩展版本的C(虽然我喜欢扩展)。您可以确保您的代码以您想要的方式执行,并且不会随意使用某些设备驱动程序。
我建议的方法的一个缺点是你不能只安装新的驱动程序并让它针对新硬件进行优化。但是,VCL已经支持AVX512,因此它已经为尚未安装的硬件构建,并且几年内不会被取代。在任何情况下,为了充分利用您的硬件,您几乎肯定必须在OpenCL中为该硬件重写内核 - 新驱动程序只能帮助这么多。
有关SIMD数学库的更多信息。您可以使用英特尔昂贵的闭源SVML(这是英特尔OpenCL驱动程序在安装英特尔OpenCL驱动程序后搜索svml时使用的 - 不要将SDK与驱动程序混淆)。或者您可以使用AMD的免费但封闭的源LIBM。但是,这些都不适用于竞争对手的处理器。 Agner Fog的VCL在两个处理器上运行良好,是开源的,免费的。
答案 2 :(得分:4)
随着OpenCL实现的成熟,可以在各种设备上为您的内核实现良好的性能可移植性。我的研究小组最近的一些工作表明,在某些情况下,OpenCL代码在CPU和GPU上实现了类似的硬件峰值性能。在CPU上,OpenCL内核通过Intel的OpenCL CPU实现非常有效地自动矢量化。在GPU上,为Nvidia(他们的OpenCL仍然运行得非常出色)和AMD的HPC和桌面设备生成了高效的代码。
如果你想开发你的OpenCL代码以便开发GPU,那么你经常通过在CPU上运行相同的代码来免费获得快速的多核+ SIMD版本。
我的小组最近发表了两篇详细介绍性能可移植性结果的论文,我们通过OpenCL实现了四个不同的实际应用程序,请参阅:
“关于多核计算机体系结构上结构化网格代码的性能可移植性”,S.N。 McIntosh-Smith,M.Boulton,D。Curran和J.R. Price。国际学习中心,莱比锡,2014年6月。DOI:10.1007 / 978-3-319-07518-1_4
“多核处理器中的高性能计算机虚拟药物筛选”,S。McIntosh-Smith,J。Price,R.B。Sessions,A.A。 Ibarra,IJHPCA 2014. DOI:10.1177 / 1094342014528252