Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCL与OpenMP性能_Opencl_Gpgpu - Fatal编程技术网

OpenCL与OpenMP性能

OpenCL与OpenMP性能,opencl,gpgpu,Opencl,Gpgpu,有没有研究将OpenCL与OpenMP性能进行比较?我特别感兴趣的是使用OpenCL启动线程的开销成本,例如,如果要将域分解为大量单独的工作项(每个工作项都由一个执行小任务的线程运行),而OpenMP中较重的线程是将域分解为数量等于核心数目的子域 OpenCL编程模型似乎更倾向于大规模并行芯片(例如GPU),而不是具有更少但更强大内核的CPU OpenCL能有效替代OpenMP吗?我所看到的基准测试表明,在同一硬件上运行的OpenCL和OpenMP在性能上通常相当,或者OpenMP的性能稍好一些

有没有研究将OpenCL与OpenMP性能进行比较?我特别感兴趣的是使用OpenCL启动线程的开销成本,例如,如果要将域分解为大量单独的工作项(每个工作项都由一个执行小任务的线程运行),而OpenMP中较重的线程是将域分解为数量等于核心数目的子域

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


OpenCL能有效替代OpenMP吗?

我所看到的基准测试表明,在同一硬件上运行的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 intrinsic而牺牲可移植性和可读性


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

在我的例子中,在CPU上,openMP需要13秒,openCL需要10秒。英特尔I5

到目前为止,我最快的配置是使用OpenCLGPU添加向量,并在openMP上进行缩减,使我的时间缩短到7秒。当我在openCL内核上,在GPU上进行缩减时,总共需要8秒


因此,根据我的经验,我想说,这可能取决于使用情况,以及您可以优化openCL内核的程度

我还想知道是否/何时同时使用OpenMP和OpenCL是有效的。OpenCL是线程安全的(clSetKernelArg()方法除外),因此这两种技术似乎都有利用的空间。如果“有效”的定义包括可读性和进化性,那么答案必须是“否”。OpenCL不能像OpenMP那样固定在现有代码上,与OpenMP相比,它有大量的语法膨胀。另一方面,编写能够有效利用内存层次结构的OpenMP代码通常比OpenCL中的代码可读性差得多。我可以在这里找到OpenMP和OpenCL之间良好而科学的比较:作者Krishnahari Thouti和S.R.SatheYour的问题需要缩小一点。您是在寻找GPU与多线程CPU,还是OpenMP与OpenCL的比较?要比较这两种语言,它们确实需要在相同的体系结构上运行。我不知道没有GPU的用户是否真的那么实用。您不需要维护OpenMP回退代码,而需要维护OpenCL回退代码,因为CPU不支持2D本地工作大小,存在____本地内存等问题。如果你已经优化了GPU内核,那么就不会有太多收获。为什么你认为基于CPU的实现不能支持2D本地工作组大小或本地内存?在CPU上,缓存由硬件而不是软件管理,因此全局内存和本地内存之间的唯一区别在于是否需要锁定才能访问它。工作组大小相当于NUMA系统的调度程序提示。是的,为使OpenCL代码在GPU上良好运行而投入的大量优化工作不会影响CPU的性能,但也不会破坏代码。任何将在GPU上运行的内核都可以在兼容的CPU实现上运行。@user57368:这只是一个补充,使用优化(如显式使用本地内存)对GPU来说是有意义的。在CPU上,进行此优化“可能会对性能产生负面影响”,至少在使用针对x86 CPU的英特尔OpenCL实现时是如此。@user57368:可能英特尔SDK就是这样工作的。苹果的没有。Mac OS 10.6下我的Core2Duo的CL_设备最大工作项大小为{1,1,1},10.7下至少为{1024,1,1},但仍然不是2D。此外,任何包含多个局部变量的内核都会使编译器在10.6下放弃-我称之为破坏代码。@w.m您可以让OpenCL代码针对CPU而不是usi进行优化