由于我的论文工作原因,我目前正在阅读OpenCL框架。到目前为止我遇到的是你可以在数据并行或并行任务中运行内核。现在我有了一个问题,我无法找到答案。
问:假设你有一个你要总结的向量。您可以通过为数据并行进程编写内核并运行它来在OpenCL中执行此操作。相当简单。
但是,现在说你有10多种不同的载体也需要总结。是否可以在任务并行中运行这10个以上的不同向量,同时仍然使用将其处理为"数据并行"?
的内核所以你基本上将任务并行化,这在某种意义上是并行运行的?因为我所理解的是你可以并行运行任务,或者只是并行运行一个任务。
答案 0 :(得分:1)
OpenCL中的整个任务并行/数据并行区别是一个错误。我们在OpenCL 2.0中弃用了clEnqueueTask,因为它没有意义。
OpenCL中所有已排队的实体都可以视为任务。这些任务可以同时运行,它们可以并行运行,也可以序列化。您可能需要多个队列来同时运行它们,或者单个无序队列,这是完全灵活的实现定义。
如果这些任务由处理同一任务中不同数据元素的多个工作项组成,则这些任务可能是数据并行的。它们可能不是,仅由一个工作项组成。最后一个定义是clEnqueueTask用来提供的 - 但是,因为它与全局大小为(1,1,1)的clEnqueueNDRangeKernel没有任何意义,并且没有检查内核代码中的任何内容,所以弃用它是更安全的选择。
所以是的,如果你排队多个NDRanges,你可以并行执行多个任务,每个任务都是数据并行的。
如果你仔细考虑传入它们的方式,你也可以在一个数据并行内核中一次复制所有这些向量。一个选项是启动一系列工作组,每个工作组遍历一个单向量复制它(这可能是CPU上用于缓存预取的最快方法)。您可以使用一些复杂的查找将每个工作项复制一个元素,以查看要从中复制的向量,但这可能会产生很高的开销。或者你可以只为一个内核启动多个并行内核,并让运行时决定它是否可以一起运行它们。
答案 1 :(得分:0)
如果您的10个以上不同的向量接近相同的大小,则会成为数据并行问题。
OpenCL的任务并行特性更适合CPU实现。 GPU更适合数据并行工作。一些高端GPU可以同时运行少量内核,但它们的真正效率在于大数据并行作业。