Opencl 关于全球和本地工作规模的问题 通过英伟达论坛搜索,我发现,这也是我感兴趣的,但是在过去的四天里没有人回答他们。你能帮忙吗 原始论坛帖子
深入阅读OpenCL阅读教程,有些事情对我来说还不清楚。以下是我关于本地和全球工作规模的问题集Opencl 关于全球和本地工作规模的问题 通过英伟达论坛搜索,我发现,这也是我感兴趣的,但是在过去的四天里没有人回答他们。你能帮忙吗 原始论坛帖子,opencl,Opencl,深入阅读OpenCL阅读教程,有些事情对我来说还不清楚。以下是我关于本地和全球工作规模的问题集 global\u work\u size必须小于CL\u DEVICE\u MAX\u work\u ITEM\u size? 在我的机器上CL\u设备\u最大工作\u项目\u大小=512、512、64 CL\u内核\u工作组\u大小是否为所用内核的建议WORK\u组\u大小 或者这是GPU唯一允许的工作组大小? 在我的机器上CL\u内核\u工作组\u大小=512 我是否需要分成工作组,或者只能有一
global\u work\u size
必须小于CL\u DEVICE\u MAX\u work\u ITEM\u size
?
在我的机器上CL\u设备\u最大工作\u项目\u大小
=512、512、64CL\u内核\u工作组\u大小
是否为所用内核的建议WORK\u组\u大小
工作组大小?
在我的机器上CL\u内核\u工作组\u大小
=512
本地工作大小
当我只有一个工作组时,我需要注意什么
CL\u设备最大工作组大小是什么意思?
在我的机器上CL\u设备\u最大工作\u组\u大小
=512、512、64
这是否意味着,我可以有一个与CL\u设备\u最大工作\u项目大小一样大的工作组李>
global\u work\u size
是否为CL\u DEVICE\u MAX\u work\u ITEM\u size
的除数?
在我的代码中,全局工作大小等于20
通常,您可以选择任意大的全局工作大小,而本地工作大小受底层设备/硬件的约束,因此所有查询结果都会告诉您本地工作大小而不是全局工作大小的可能维度。全局工作大小的唯一限制是它必须是本地工作大小的倍数(对于每个维度)
工作组大小指定了工作组的大小,因此,如果CL\u设备\u最大工作\u项目\u大小
为512、512、64
,则对于x和y维度,您的本地工作\u大小不能大于512
,对于z维度,您的本地工作\u大小不能大于64
但是,本地组大小也有一个限制,具体取决于内核。这是通过CL\u内核\u工作组\u大小表示的。您的累积工作规模(如所有维度的乘积,例如,如果您的localsize为16,16,1
,则为256
)不得大于该数字。这是由于线程之间分配的硬件资源有限(根据查询结果,我假设您正在NVIDIA GPU上编程,因此线程使用的本地内存和寄存器数量将限制可并行执行的线程数量)
CL\u DEVICE\u MAX\u WORK\u GROUP\u SIZE
以与CL\u KERNEL\u WORK\u GROUP\u SIZE
相同的方式定义工作组的最大大小,但特定于设备,而不是内核(它应该是一个标量值aka512
)
您可以选择不指定本地工作组大小,在这种情况下,OpenCL实现将为您选择本地工作组大小(因此不能保证它只使用一个工作组)。然而,这通常是不可取的,因为你不知道你的工作是如何划分为工作组的,而且也不能保证选择的工作组大小是最佳的
但是,您应该注意到,从性能角度来看,仅使用一个工作组通常不是一个好主意(如果性能不是一个问题,为什么要使用OpenCL)。一般来说,一个工作组必须在一个计算单元上执行,而大多数设备将有多个计算单元(现代CPU有2个或多个,每个核心一个,而现代GPU可以有20个或更多)。此外,即使是您的工作组执行的一个计算单元也可能没有被完全使用,因为多个工作组可以以SMT样式在一个计算单元上执行。要优化使用NVIDIA GPU,您需要在一个计算单元上执行768/1024/1536个线程(取决于生成,意味着G80/GT200/GF100),虽然我现在不知道amd的数字,但它们的大小相同,因此最好有多个工作组。此外,对于GPU,通常建议至少有64个线程的工作组(以及每个工作组可被32/64(nvidia/amd)整除的线程数),因为否则会再次降低性能(32/64是在GPU上执行的最小授权,因此如果工作组中的项目较少,它仍将以32/64线程的形式执行,但会丢弃未使用线程的结果)。非常感谢。有一件事我必须确认:当您指的是更小时,您是指<还是我会编辑“不建议不指定工作组大小”。因为对于许多操作来说,这是最佳选择。而现代CPU最多可以有20个)
应该是GPU最多可以有20个吗?