OpenCL与OpenMP性能

Rob*_*ert 29 gpgpu opencl

是否有任何研究比较OpenCL和OpenMP性能?具体来说,我感兴趣的是使用OpenCL启动线程的开销,例如,如果要将域分解为大量单个工作项(每个工作项由一个执行小工作的线程运行),而不是OpenMP中的较重权重线程.域被分解为子域,其数量等于核心数.

似乎OpenCL编程模型更多地针对大规模并行芯片(例如GPU),而不是具有更少但更强大的内核的CPU.

OpenCL可以成为OpenMP的有效替代品吗?

use*_*368 26

我看到的基准测试表明,在相同硬件上运行的OpenCL和OpenMP通常在性能上相当,或者OpenMP的性能稍好一些.但是,我没有看到任何我认为是确凿的基准,因为他们大多缺乏对其方法的详细解释.但是,有一些有用的事情需要考虑:

  • 在运行时编译内核时,OpenCL总会有一些额外的开销.任何基准测试都需要单独列出此时间,使用预编译的本机内核,或运行足够长的内核编译无关紧要.

  • OpenCL实现会有所不同.像NVidia这样的GPU供应商没有动力去确保他们基于CPU的OpenCL实现尽可能快.没有一个OpenCL实现可能像一个好的OpenMP实现那样成熟.

  • OpenCL规范基本上没有说明基于CPU的实现如何使用线程,因此任何关于线程是相对轻量级还是重量级的讨论都必然是特定于实现的.

  • 当您在CPU上运行OpenCL代码时,您的工作项目不必太小.您可以像对待OpenMP一样分解问题.

即使OpenCL有更多的开销,也可能有其他理由喜欢它.

  • 显然,如果您的代码可以充分利用GPU,那么您将需要一个OpenCL实现.CPU上的OpenCL性能可能足够好,不值得为没有强大GPU的用户维护OpenMP回退代码路径.

  • 基于CPU的良好OpenCL实现意味着您将自动获得CPU和OpenCL实现支持的任何指令集扩展的好处.使用OpenMP,您必须做额外的工作以确保您的可执行文件包含SSEx和AVX代码路径.

  • OpenCL矢量原语可以帮助您表达一些显式并行性,而无需使用SSE内在函数所带来的可移植性和可读性牺牲.

  • 为什么您认为基于CPU的实现不支持2D本地工作组大小或本地内存?在CPU上,高速缓存存储器由硬件而不是软件管理,因此全局和本地存储器之间的唯一区别在于是否需要锁定才能访问它.工作组大小将等于NUMA系统的调度程序提示.是的,为了使其在GPU上运行良好,OpenCL代码中的大量优化工作不会影响CPU的性能,但也不会破坏代码.任何将在GPU上运行的内核都可以在兼容的CPU实现上运行. (2认同)

MVT*_*VTC 7

我有一个程序,可以选择在一些关键瓶颈上使用openCL或openMP,基本上添加向量和执行减少.

在我的情况下,openMP需要13秒,其中openCL需要10秒,在CPU上.英特尔I5.

到目前为止,对我来说最快的配置是使用openCL GPU添加向量,并对openMP进行减少,使我减少到7秒.当我在openCL内核上进行减少时,在GPU上,总共需要8秒.

所以根据我的经验,我会说这可能取决于使用,而且你可以优化你的openCL内核.