关于全球和本地工作规模的问题

Posted

技术标签:

【中文标题】关于全球和本地工作规模的问题【英文标题】:Questions about global and local work size 【发布时间】:2011-04-26 19:22:25 【问题描述】:

通过 NVIDIA 论坛搜索,我找到了 these questions,这也是我感兴趣的,但在过去四天左右没有人回复它们。你能帮忙吗?

论坛原帖

深入研究 OpenCL 阅读教程,有些事情对我来说还不清楚。以下是我关于本地和全球工作规模的问题集合。

    global_work_size 必须小于CL_DEVICE_MAX_WORK_ITEM_SIZES? 在我的机器上CL_DEVICE_MAX_WORK_ITEM_SIZES = 512, 512, 64。

    对于使用的内核,CL_KERNEL_WORK_GROUP_SIZE 是推荐的work_group_size 吗?

      或者这是 GPU 允许的唯一work_group_size? 在我的机器上CL_KERNEL_WORK_GROUP_SIZE = 512

    我需要分成工作组还是可以只有一个但不指定local_work_size

      当我只有一个工作组时,我需要注意什么?

    CL_DEVICE_MAX_WORK_GROUP_SIZE 是什么意思? 在我的机器上CL_DEVICE_MAX_WORK_GROUP_SIZE = 512, 512, 64

      这是否意味着,我可以拥有一个与CL_DEVICE_MAX_WORK_ITEM_SIZES 一样大的工作组?

    global_work_sizeCL_DEVICE_MAX_WORK_ITEM_SIZES 的除数吗? 在我的代码中global_work_size = 20.

【问题讨论】:

【参考方案1】:

一般而言,您可以根据需要选择任意大的 global_work_size,而 local_work_size 受底层设备/硬件的约束,因此所有查询结果都会告诉您 local_work_size 的可能尺寸,而不是 global_work_size。 global_work_size 的唯一约束是它必须是 local_work_size 的倍数(对于每个维度)。

工作组大小指定工作组的大小,因此如果CL_DEVICE_MAX_WORK_ITEM_SIZES512, 512, 64,这意味着您的local_work_size 不能大于x 和y 维度的512 和z 维度的64

但是,根据内核的不同,本地组大小也受到限制。这通过CL_KERNEL_WORK_GROUP_SIZE 表达。您的累积 workgoupsize(如所有维度的乘积,例如 256,如果您的 localsize 为 16, 16, 1)不得大于该数字。这是由于要在线程之间分配的硬件资源有限(根据您的查询结果,我假设您正在 NVIDIA GPU 上编程,因此线程使用的本地内存和寄存器的数量将限制线程数并行执行)。

CL_DEVICE_MAX_WORK_GROUP_SIZE 以与CL_KERNEL_WORK_GROUP_SIZE 相同的方式定义工作组的最大大小,但特定于设备而不是内核(它应该是一个标量值,也就是512)。

您可以选择不指定 local_work_group_size,在这种情况下,OpenCL 实现将为您选择本地工作组大小(因此不能保证它只使用一个工作组)。但是,通常不建议这样做,因为您不知道您的工作是如何划分为工作组的,而且不能保证选择的工作组大小是最佳的。

但是,您应该注意,仅使用一个工作组在性能方面通常不是一个好主意(如果不考虑性能,为什么要使用 OpenCL)。一般来说,一个工作组必须在一个计算单元上执行,而大多数设备将有多个计算单元(现代 CPU 有 2 个或更多,每个内核一个,而现代 GPU 可以有 20 个或更多)。此外,即使您的工作组在其上执行的一个计算单元也可能没有被完全使用,因为多个工作组可以在一个 SMT 样式的计算单元上执行。要以最佳方式使用 NVIDIA GPU,您需要在一个计算单元上执行 768/1024/1536 个线程(取决于世代,即 G80/GT200/GF100),虽然我现在不知道 amd 的数字,但它们在量级相同,因此最好有一个以上的工作组。此外,对于 GPU,通常建议拥有至少 64 个线程的工作组(每个工作组的线程数可被 32/64 (nvidia/amd) 整除),否则您将再次降低性能(32/64 是在 gpus 上执行的最小粒度,因此如果工作组中的项目较少,它仍将作为 32/64 线程执行,但会丢弃未使用线程的结果。

【讨论】:

非常感谢。我要问的一件事:当你的意思是更小时,你的意思是 我会编辑“不建议不指定工作组大小”的建议。因为对于许多操作来说,它是最好的选择。 while modern CPUs can have up to 20) GPU 应该最多可以有 20 个吗?

以上是关于关于全球和本地工作规模的问题的主要内容,如果未能解决你的问题,请参考以下文章

薪酬不变,每周只上四天班,英国试行全球最大规模“四天工作制”

量角器本地和全球安装行为不同

字符串和标签本地化和全球化的最佳实践 [关闭]

全球案例 | Infobip :这家估值十亿美元的公司像初创企业一样规模化发展,像大型企业一样标准化

用 Python 可视化分析全球火山分布,发现了这些有趣的现象

IBM Worklight - 本机组件的全球化/本地化