代码之家  ›  专栏  ›  技术社区  ›  0x90

在aCPU上运行OpenCL代码有什么好处?[已关闭]

  •  7
  • 0x90  · 技术社区  · 11 年前

    我正在学习OpenCL编程,并注意到一些奇怪的事情。

    也就是说,当我列出机器(Macbook Pro)上所有启用OpenCL的设备时,我会得到以下列表:

    • Intel(R)Core(TM)i7-4850HQ CPU@2.30GHz
    • 虹膜专业版
    • GeForce GT 750M

    第一个是我的CPU,第二个是Intel的板载图形解决方案,第三个是我专用的图形卡。

    研究表明,英特尔已经使他们的硬件OpenCL兼容,这样我就可以利用板载图形单元的功能。那就是Iris Pro。

    考虑到这一点,CPU与OpenCL兼容的目的是什么?如果找不到其他卡,那么内核可以作为备份在CPU上运行,这仅仅是为了方便吗?或者,当作为OpenCL内核运行代码而不是在CPU上执行常规(C,线程良好)程序时,是否有任何速度优势?

    3 回复  |  直到 11 年前
        1
  •  10
  •   sharpneli    11 年前

    看见 https://software.intel.com/sites/default/files/m/d/4/1/d/8/Writing_Optimal_OpenCL_28tm_29_Code_with_Intel_28R_29_OpenCL_SDK.pdf 了解基本信息。

    基本上,英特尔OpenCL编译器对某些类型的内核执行水平自动矢量化。这意味着,使用SSE4,您可以在单个内核中并行运行8个线程,其方式与Nvidia GPU在单个32宽simd单元中运行32个线程的方式类似。

    这种方法有两个主要好处:如果在2年内将SSE矢量宽度增加到16,会发生什么?然后,当您在该CPU上运行时,您将立即获得16个线程的自动矢量化。无需重新编译代码。第二个好处是,与用ASM或C编写OpenCL内核并让编译器生成高效代码相比,编写易于自动矢量化的OpenCL内核要容易得多。

        2
  •  4
  •   simonmcs    11 年前

    随着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。ISC,莱比锡,2014年6月。DOI:10.1007/978-3-319-07518-14

    “多核处理器上的高性能电子虚拟药物筛选”,S.McIntosh Smith,J.Price,R.B.Sessions,A.A.Ibarra,IJHPCA 2014。DOI:10.1177/1094342014528252

        3
  •  4
  •   Z boson    11 年前

    我已经考虑了一段时间。您可以在不使用OpenCL和C++中没有太多困难的情况下获得OpenCL对CPU的大部分优势。为此,您需要:

    1. 多线程的东西-我使用OpenMP
    2. SIMD库-我使用Agner Fog的 Vector Library Class (VCL) 其中包括SSE2-AVX512。
    3. SIMD数学库。我再次使用愤怒雾的VCL。
    4. CPU调度程序。Agner Fog的VCL有一个例子可以做到这一点。

    使用CPU调度器可以确定可用的硬件,并根据硬件选择最佳代码路径。这提供了OpenCL的优点之一。

    这为您提供了OpenCL在CPU上的大部分优点,而没有其所有缺点。您永远不用担心供应商停止支持驱动程序。英伟达对OpenCL的支持很少,包括它可能永远无法修复的几年前的bug(我浪费了太多时间)。英特尔只有适用于Windows的Iris Pro OpenCL驱动程序。使用我建议的方法的内核可以使用所有C++特性,包括模板,而不是OpenCL的受限和扩展版本的C(尽管我确实喜欢这些扩展)。您可以确保您的代码以这种方式实现您想要的功能,而不会受到某些设备驱动程序的影响。

    我建议的方法的一个缺点是,你不能只安装一个新的驱动程序,并让它针对新的硬件进行优化。然而,VCL已经支持AVX512,因此它已经为尚未推出的硬件构建,并且在几年内不会被取代。在任何情况下,为了最大限度地利用硬件,您几乎肯定必须在OpenCL中为该硬件重写内核——新的驱动程序只能帮助这么多。

    有关SIMD数学库的更多信息。为此,您可以使用Intel昂贵的封闭源代码SVML(如果您在安装Intel OpenCL驱动程序后搜索SVML,请不要将SDK与驱动程序混淆)。或者你可以使用AMD的免费但开源的LIBM。然而,这两种处理器都不能在竞争对手的处理器上正常工作。Agner Fog的VCL在两个处理器上都运行良好,开源且免费。