OpenCL的1.0规范刚出现(Spec是here),我刚刚开始阅读它。我想知道它是否与OpenMP(spec)等其他高性能多处理API一起运行良好,我想知道我应该学到什么。所以,这是我的基本问题:
答案 0 :(得分:7)
OpenMP和OpenCL是截然不同的,但可以一起使用。他们俩都不应该“打破”另一方。
为了论证,我们假设在最小化对现有代码库的更改与性能或计算能力之间存在权衡。 OMP是“容易的”,你可以用一两个快速的pragma“神奇地”将它应用于令人尴尬的并行问题。
OpenCL引入了超越典型操作系统线程模型的全新高级概念。 Khronos可能不想大声说出来,但它的起源是在NVIDIA的CUDA中。如果您想了解它今天的工作原理,请下载CUDA SDK并开始播放。如果您没有任何NVIDIA GPU,请不要担心,有GPU仿真器软件选项。 OpenCL是一个方便的GPU抽象,应该适用于CPU,DSP,“加速器”(Khronos的昵称为IBM的CellBE,可能是英特尔的Larrabee)。
OpenCL不应该“直接在C99中编写”。它被称为C99扩展,因为它的语法与C99类似/相同,带有一些新的关键字。你不能从内核调用libc(或任何其他库)。
你可以使用两者,但理论上,如果你愿意移植你的代码,OpenCL应该“更好”(因为它可以移植到更多的计算设备)。您不能在OpenCL内核中使用OpenMP pragma。
另见:
答案 1 :(得分:4)
在大多数情况下,OpenMP和OpenCL是相互独立的。它们都是让开发人员在其平台上访问并行性的方法。
OpenMP旨在与多个(相同的)处理器配合使用,其中大致相等的工作可以(几乎)自动在它们之间进行耕作。
OpenCL是一种有点不同的野兽,因为在使用特殊的协处理器硬件时它真的很棒。它将允许您将一些重载数字运算卸载到GPU或其他一些协处理器(如Cell)。然而,它的构建也是为了能够利用其他主处理器,这在多核计算机中很常见。我认为这个功能是次要的,如果您打算使用OpenCL,我不建议使用OpenCL。
那就是说,我猜它会有些挑战,但绝对不是不可能让OpenMP和OpenCL在同一个问题上一起工作。
首先要考虑的是你给OpenCL的工作。这肯定是你只希望OpenCL在GPU /协处理器上运行而不是在其他主处理器/核心上运行的情况,因为OpenMP总是使用它们。它不会(不应该)导致应用程序错误在同一个主处理器上运行OpenCL和OpenMP,但是它会导致不合需要的调度,因为OpenMP和OpenCL的运行时间都很慢,因为它们会花很多时间切换回来和彼此之间的第四个。如果您同时在同一个核心上运行任何其他需要处理器的进程,也会发生这种情况。
要考虑的另一个重要事项是如何安排在协处理器上运行的任务。确实,您可以将大量工作投入到一个现代GPU中,但管道和内存使用方面需要考虑很多事情。您不希望发生的是拥有8个不同的OpenMP线程,每个线程都试图同时将自己的工作发送到协处理器。我建议只有一个线程来管理与协处理器的所有交互,因此它可以确保以有效的方式提供它。
尽管如此,我确信有些程序同时发生了多种类型的任务,其中一种任务总是可以用于协处理器,另一种任务可以由多核主处理器。这将是混合OpenMP和OpenCL的时间的一个很好的例子。
祝你好运!
答案 2 :(得分:0)
答案 3 :(得分:0)
顺便说一句,there is a work使用CUDA将openMp改为gpgpu。