通过NVIDIA论坛搜索,我发现了这些问题,我也感兴趣,但在过去四天左右没有人回答过这些问题.你能帮我吗?
深入研究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使用内核?
- 或者这
work_group_size是GPU允许的唯一?在我的机器上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_size要的除数CL_DEVICE_MAX_WORK_ITEM_SIZES?在我的代码global_work_size= 20.
Gri*_*zly 72
通常,您可以根据需要选择global_work_size,而local_work_size是由底层设备/硬件约束的,因此所有查询结果都会告诉您local_work_size而不是global_work_size的可能维度.global_work_size的唯一约束是它必须是local_work_size的倍数(对于每个维度).
所以,如果工作组大小指定工作组的尺寸CL_DEVICE_MAX_WORK_ITEM_SIZES是512, 512, 64,这意味着你的local_work_size不能更大然后512x和y维度和64用于z维度.
但是,根据内核的不同,本地组大小也会受到限制.这表达了CL_KERNEL_WORK_GROUP_SIZE.您的累积工作量(如所有维度的产品,例如,256如果您有本地化16, 16, 1)不得大于该数字.这是由于在线程之间划分的硬件资源有限(从您的查询结果我假设您在NVIDIA GPU上进行编程,因此线程使用的本地内存和寄存器数量将限制可以使用的线程数量)并行执行).
CL_DEVICE_MAX_WORK_GROUP_SIZECL_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,它'