Opencl 确定最佳工作组大小和工作组数量的算法是什么

Opencl 确定最佳工作组大小和工作组数量的算法是什么,opencl,Opencl,OpenCL标准定义了以下选项以获取有关设备和编译内核的信息: CL\U设备\U最大\U计算单元 CL\ U设备\最大\工作\组\大小 CL\内核\工作\组\大小 CL\内核\首选\工作\组\大小\倍数 给定这些值,我如何计算工作组的最佳大小和工作组的数量?您可以通过实验为您的算法找到这些值。使用探查器获取硬数字 我喜欢使用CL_DEVICE_MAX_COMPUTE_UNITS作为工作组的数量,因为我经常依赖于同步工作项。我通常使用很少分支的内核运行,因此在每个计算单元中执行内核需要相同的时

OpenCL标准定义了以下选项以获取有关设备和编译内核的信息:

  • CL\U设备\U最大\U计算单元

  • CL\ U设备\最大\工作\组\大小

  • CL\内核\工作\组\大小

  • CL\内核\首选\工作\组\大小\倍数


给定这些值,我如何计算工作组的最佳大小和工作组的数量?

您可以通过实验为您的算法找到这些值。使用探查器获取硬数字

我喜欢使用CL_DEVICE_MAX_COMPUTE_UNITS作为工作组的数量,因为我经常依赖于同步工作项。我通常使用很少分支的内核运行,因此在每个计算单元中执行内核需要相同的时间

对于您的设备来说,CL\u内核\u首选\u工作\u组大小\u倍数的某些倍数将是最佳的。这个倍数实际上是多少取决于您的内存访问模式以及您对每个工作项所做的工作类型。在运行繁重的计算绑定(ALU)内核时,请使用1作为倍数。如果您受到内存访问的限制,请尝试使用更大的倍数来隐藏内存延迟。使用探查器确定何时访问时间和ALU时间是最佳的


对于任何设备,ALU获取的最佳比率为1:1。这在实践中很少实现,因此您希望保持ALU/SIMD库饱和。这意味着ALU:fetch应尽可能大于1。小于1意味着您应该尝试更大的工作组大小以更好地隐藏内存延迟。

正如mfa所说,您必须通过实验发现这些延迟。 我想补充一点,根据您正在计算的内容(特别是作业的大小,即每个工作项的大小),有时一个好的尝试可以是:

  • 很多工作项都有小工作组,每个工作项都很小
  • 工作组越大,每个工作项越大,工作项越少
也就是说,基本上检查基本情况并找出它如何影响处理管道


本质上,你必须调整它。我经常对不同的参数执行几次(对其进行配置),然后生成曲面图以查看其行为。

我的目标是支持一系列设备。这是否意味着,我必须在每个内核上测试我的内核,以获得内核排队的最佳值?在您可以访问的设备上测试您的算法——结果应该不会有太大变化。我建议您在每个主要体系结构的一台设备上进行尝试。如果可以,请在运行时调整参数以尝试优化。这可能会调整您在开发过程中发现的最佳值。从最终用户/客户那里获得有关实际硬件数量的反馈将使您能够将改进重点放在最常见的设备上。通常,使用
CL\u设备\u MAX\u计算单元
不会给您带来最佳性能(除非您在工作组之间进行大量同步,但这通常是个坏主意)。我通常会要求文档提供好的值,但我从未见过更多的工作组损害性能,所以越是糟糕。请注意,选择更高的工作组大小来隐藏内存延迟的部分(至少对于GPU来说)只有在您没有使用足够的工作组时才是正确的(比如CL_DEVICE_MAX_COMPUTE_UNITS,因为CU通常一次可以支持多个工作组)。@Grizzly我知道CL_DEVICE_MAX_COMPUTE_UNITS作为工作组的数量是个坏主意。我用它作为乘数。例如,10*CL_装置最大计算单位。我仍然对基于运行时的方法感兴趣,以确定首选的工作组大小和数量,因为我通常必须在一个主任务中将几十个子任务排队。