opencl - OpenCL 工作项是否并行执行?

标签 opencl

我知道工作项被分组到工作组中,并且您不能在工作组之外进行同步。

这是否意味着工作项是并行执行的?

如果是这样,使用 128 个工作项创建 1 个工作组是否可能/有效?

最佳答案

组内的工作项将一起安排,并且可能一起运行。由硬件和/或驱动程序来选择执行的实际并行度。这有不同的原因,但一个很好的原因是隐藏内存延迟。

在我的 AMD 卡上,“计算单元”分为 16 个 4 宽 SIMD 单元。这意味着在技术上可以在组中同时运行 16 个工作项。建议我们在一个组中使用 64 个工作项的倍数,以隐藏内存延迟。显然,它们不可能都在准确的时间运行。这不是问题,因为大多数内核实际上都受内存限制,因此调度程序(硬件)将交换在内存 Controller 上等待的工作项,而“就绪”项则获得它们的计算时间。组中的实际工作项数由宿主程序设置,并受 CL_DEVICE_MAX_WORK_GROUP_SIZE 限制。您将需要为您的内核试验最佳工作组大小。

当涉及到同时工作项时,cpu 实现“更糟”。运行的工作项数量与可用于运行它们的核心数量一样多。它们在 CPU 中的行为更加顺序。

那么工作项是否在完全相同的时间运行?几乎从来没有。这就是为什么当我们想确保它们在给定点暂停时我们需要使用障碍。

关于opencl - OpenCL 工作项是否并行执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8980044/

相关文章:

c++ - OpenCL 的意外 CPU 使用率

c++ - 我可以使用 OpenCL 分配设备内存并使用指向 CUDA 内存的指针吗?

cuda - OpenCL 中是否有任何扭曲投票功能?

c - 代码的链接时间运行? (具体来说,Valgrind 似乎在链接时提出的问题)

kernel - 有关 OpenCL 内核编程的教程或书籍?

c++ - OpenCL enqueueWriteImage 在 C++ 包装器中但在 C 函数中没有 const void* ptr

c++ - OpenCL 将 float16 转换为 float*

opencl - 在 OpenCL 1.1 中定义具有相同名称但不同参数类型的不同函数

c# - Opencl 内核缓冲区在 12k 浮点元素后泄漏

opencl - clinfo 显示 "Number of platforms 0"