Concurrency OpenCL与grandcentraldispatch中的并发编程
随着OpenCL2.0的推出,OpenCL似乎具备了GrandCentralDispatch(GCD)的许多功能,例如叮当声/苹果风格的块和队列。看看它们各自的功能集,我想知道OpenCL是否能做GCD/libdispatch所能做的一切,但它增加了将计算定向到GPU和CPU的能力——或者GCD是否能提供更多与OpenCL不同的功能 具体而言,我的问题是: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能够解决数据并行和任务并行问题,不同的OpenCL API原语将工作排队就是明证:
:用于将具有N维工作组大小的内核排队。通常用于数据并行处理clEnqueuNDRangeKernel
:用于将包含单个工作项的内核排队。此原语用于任务并行执行,本质上相当于全局工作大小为1的clEnqueueTask
。它已从OpenCL2.0规范中删除clEnqueueNDRangeKernel
将本机C/C++函数排队到设备(如果它支持本机内核),好处是您可以使用排队机制(以及在队列中排序),还可以直接从OpenCL上下文访问缓冲区数据。除此之外,这与线程或任务的概念非常相似clenqueueenativekernel
因此,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