Concurrency OpenCL与grandcentraldispatch中的并发编程

Concurrency OpenCL与grandcentraldispatch中的并发编程,concurrency,opencl,objective-c-blocks,grand-central-dispatch,libdispatch,Concurrency,Opencl,Objective C Blocks,Grand Central Dispatch,Libdispatch,随着OpenCL2.0的推出,OpenCL似乎具备了GrandCentralDispatch(GCD)的许多功能,例如叮当声/苹果风格的块和队列。看看它们各自的功能集,我想知道OpenCL是否能做GCD/libdispatch所能做的一切,但它增加了将计算定向到GPU和CPU的能力——或者GCD是否能提供更多与OpenCL不同的功能 具体而言,我的问题是: GCD和OpenCL的并发特性有什么区别 如果将它们一起使用有价值(假设GCD提供了附加功能),C块可以路由到GCD队列或OpenCL队列吗

随着OpenCL2.0的推出,OpenCL似乎具备了GrandCentralDispatch(GCD)的许多功能,例如叮当声/苹果风格的块和队列。看看它们各自的功能集,我想知道OpenCL是否能做GCD/libdispatch所能做的一切,但它增加了将计算定向到GPU和CPU的能力——或者GCD是否能提供更多与OpenCL不同的功能

具体而言,我的问题是:

  • GCD和OpenCL的并发特性有什么区别

  • 如果将它们一起使用有价值(假设GCD提供了附加功能),C块可以路由到GCD队列或OpenCL队列吗?如果以CPU为目标,是否有理由通过OpenCL而不是直接运行

  • OpenCL2.0是否提供GCD风格的负载平衡,可以填充跨越CPU和GPU的线程

  • (一) 迪瑟马斯特已经回答得很好了。OpenCL适用于您的问题并行性非常好并且您拥有大量数据的情况。GCD适用于您必须毫不费力地生成一个线程来处理文件IO或诸如此类的情况。您永远不能从OpenCL调用任何系统或其他库函数

    (二) 如果您的问题很容易并行化,那么即使在CPU上也值得使用OpenCL。例如,Intel的OpenCL实现设法水平并行一些内核,以便单个内核一次有效地运行8个线程(一个线程在SSE寄存器的一个向量组件中“运行”)

    不能将通用C块传递给OpenCL。只有内核本身,没有更多。OpenCL对您可以在其上执行的操作更加挑剔。新型的ClangIR带来的唯一好处是能够避免以文本形式分发内核源代码。它仍然仅限于OpenCL内核代码

    (三) 不是自动的。确实存在一些执行此操作的实现。去年,GDC Intel在其CPU上演示了自动负载平衡(它同时使用集成GPU和CPU)


    OpenCL2.0并不真正关心它运行在哪种硬件上,因此硬件制造商有责任在其平台上实现这种功能。或者对于不相交的平台,这是程序员最头疼的问题。

    在目前的形式下,OpenCL能够解决数据并行和任务并行问题,不同的OpenCL API原语将工作排队就是明证:

    • clEnqueuNDRangeKernel
      :用于将具有N维工作组大小的内核排队。通常用于数据并行处理
    • clEnqueueTask
      :用于将包含单个工作项的内核排队。此原语用于任务并行执行,本质上相当于全局工作大小为1的
      clEnqueueNDRangeKernel
      。它已从OpenCL2.0规范中删除
    • clenqueueenativekernel
      将本机C/C++函数排队到设备(如果它支持本机内核),好处是您可以使用排队机制(以及在队列中排序),还可以直接从OpenCL上下文访问缓冲区数据。除此之外,这与线程或任务的概念非常相似
    因此,尽管OpenCL显然起源于GPU上的数据并行处理,并且仍然最适合处理可能以某种方式强制在1、2或三维网格中的数据,但面向任务的处理也是可能的。一旦我们开始瞄准具有多个CPU、GPU、DSP和加速器的异构系统,好处就会变得更加明显,因为OpenCL可以用一种形式瞄准所有这些设备

    另一方面,GCD提供了一个方便的库,它通过构建队列(不同类型和优先级)的概念,减轻了开发人员管理和调度任务的负担。因此,在对称多处理系统上,使用GCD可以减少错误倾向,并使代码更加紧凑

    因此,OpenCL和GCD在其起源上有不同的背景(除了它们都来自Apple),它们都在其基础上使用队列来管理工作项分布。它们都有“上下文”的概念来定义数据访问

    由于OSX版本10.7,可以使用GCD将OpenCL内核(类似于块)分派给支持OpenCL的设备,从而为结合OpenCL和GCD的优点/优势打开了可能性

    以下是对您的具体问题的一些回答/见解:

    1-GCD和OpenCL的并发特性有什么区别

    正如@Dithermaster和@sharpneli所指出的,GCD最初的目标是面向任务(对称多)的处理,而OpenCL最初是用于异构体系结构上的数据并行处理

    OpenCL和GCD之间的一个主要区别在于排队机制。例如,虽然OpenCL和GCD都支持同步和异步执行,但GCD对全局异步队列有三个优先级。OpenCL运行时没有这个功能(它有无序执行的工作项,但没有定义运行时将首先执行哪些工作项)

    GCD手册还指出,任务比传统线程更轻量级,因此可以生成比线程少得多的指令的GCD任务

    另一个区别在于所使用的内存一致性模型。OpenCL对内核使用一个宽松的模型,具有全局、局部、私有和恒定内存。GCD没有这个

    另一方面,OpenCL具有向量数据类型和向量内部函数,允许在不依赖编译器的情况下直接挖掘体系结构的SIMD潜力。在某些架构上,这是有益的,而其他架构(如MIC)建议不要手动进行矢量化

    最后—虽然不是真正的并发特性—OpenCL有func