【问题标题】:Open CL Running parallel tasks on data parallel kernelOpencl 在数据并行内核上运行并行任务
【发布时间】:2016-01-28 06:39:00
【问题描述】:

由于我的论文工作的原因,我目前正在阅读 OpenCL 框架。到目前为止,我遇到的是,您可以在数据并行或任务并行中运行内核。现在我有一个问题,但我无法找到答案。

问:假设您有一个要总结的向量。您可以在 OpenCL 中通过为数据并行进程编写内核并运行它来做到这一点。相当简单。

但是,现在假设您有 10 多个不同的向量也需要汇总。是否可以在任务中并行运行这 10 多个不同的向量,同时仍使用将它们作为“数据并行”处理的内核?

所以你基本上是并行化任务,在某种意义上它们是并行运行的?因为我的理解是,您可以并行运行任务,也可以只并行运行一项任务本身。

【问题讨论】:

  • 这是可行的,但可能不是很有用,除非你有多个 GPU。为此,您需要多个 OpenCL 上下文,每个上下文处理一个命令队列,每个队列运行一个数据并行内核。

标签: c++ opencl


【解决方案1】:

OpenCL 中整个任务并行/数据并行的区别是一个错误。我们在 OpenCL 2.0 中弃用了 clEnqueueTask,因为它没有任何意义。

OpenCL 中的所有入队实体都可以视为任务。这些任务可以并发运行,可以并行运行,也可以串行化。您可能需要多个队列来同时运行它们,或者需要一个乱序队列,这都是由实现定义的,以便完全灵活。

如果这些任务由多个工作项组成,这些工作项在同一任务中处理不同的数据元素,则它们可能是数据并行的。它们可能不是,仅由一个工作项组成。最后一个定义是 clEnqueueTask 曾经提供的 - 但是,因为与全局大小为 (1,1,1) 的 clEnqueueNDRangeKernel 相比,它没有任何意义,并且没有针对内核代码中的任何内容进行检查,因此弃用它是更安全的选择。

所以是的,如果您将多个 NDRange 排入队列,您可以并行处理多个任务,每个任务都是数据并行的。

您还可以在一个数据并行内核中一次复制所有这些向量,前提是您要小心传递它们的方式。一种选择是启动一系列工作组,每个工作组迭代一个单个向量复制它(由于缓存预取原因,这可能是 CPU 上最快的方法)。您可以让每个工作项使用一些复杂的查找来复制一个元素,以查看要从哪个向量复制,但这可能会产生很高的开销。或者您可以启动多个并行内核,每个内核对应一个内核,并让运行时决定是否可以一起运行它们。

【讨论】:

    【解决方案2】:

    如果你的 10+ 个不同的向量接近相同的大小,这就变成了一个数据并行问题。

    OpenCL 的任务并行特性更适合 CPU 实现。 GPU 更适合数据并行工作。一些高端 GPU 可以同时运行少量内核,但它们的真正效率在于大数据并行作业。

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 2019-01-16
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多