gpt4 book ai didi

c++ - Open CL 在数据并行内核上运行并行任务

转载 作者:行者123 更新时间:2023-11-30 05:32:44 25 4
gpt4 key购买 nike

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

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

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

所以您基本上是并行化任务,从某种意义上说,这些任务是并行运行的?因为我了解到,您可以并行运行任务,也可以并行运行一个任务本身。

最佳答案

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

OpenCL 中所有排队的实体都可以视为任务。这些任务可以并发运行,它们可以并行运行,它们可以序列化。您可能需要多个队列来同时运行它们,或者需要一个无序队列,这都是实现定义的,非常灵活。

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

所以是的,如果您将多个 NDRanges 入队,您可以并行执行多个任务,每个任务都是数据并行的。

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

关于c++ - Open CL 在数据并行内核上运行并行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35039110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com