在OpenCL中根据设备内存确定最大的全局工作组大小?

6
我能列出以下参数,这些参数有助于根据设备内存限制工作项:
  • CL_DEVICE_GLOBAL_MEM_SIZE (全局内存大小)
  • CL_DEVICE_LOCAL_MEM_SIZE (本地内存大小)
  • CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE (常量缓冲区最大大小)
  • CL_DEVICE_MAX_MEM_ALLOC_SIZE (最大内存分配大小)
  • CL_DEVICE_MAX_WORK_GROUP_SIZE (最大工作组大小)
  • CL_DEVICE_MAX_WORK_ITEM_SIZES (最大工作项大小)
  • CL_KERNEL_WORK_GROUP_SIZE (内核工作组大小)
我发现这些参数的解释不够详细,因此我无法正确使用这些参数。请问有人能告诉我这些参数的含义和如何使用吗?需要检查所有这些参数吗?
注:我对其中一些参数有简要了解,但不确定我的理解是否正确。
1个回答

11

CL_DEVICE_GLOBAL_MEM_SIZE:

  • 设备的全局内存量。通常情况下,您不需要关心这个参数,除非您使用大量的数据。无论如何,如果您使用超出允许范围的内存,OpenCL规范将会抱怨OUT_OF_RESOURCES错误。(字节)

CL_DEVICE_LOCAL_MEM_SIZE:

  • 每个工作组的本地内存大小。但是,这个限制条件只在理想情况下成立。如果您的内核程序使用了大量的WI(工作项)来处理工作组,那么其中一些私有的WI数据可能会溢出到本地内存中。因此,请将其视为可用于每个工作组的最大数量。

CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:

  • 单个内核程序可以使用的常量内存的最大量。如果您使用的常量缓冲区总量超过了这个值,它要么会失败,要么会使用全局正常内存(可能会更慢)。 (字节)

CL_DEVICE_MAX_MEM_ALLOC_SIZE:

  • 您可以在设备上分配的单个内存块的最大量。(字节)

CL_DEVICE_MAX_WORK_GROUP_SIZE:

  • 设备的最大工作组大小。这是理想的最大值。根据内核代码的不同,限制可能会更低。

CL_DEVICE_MAX_WORK_ITEM_SIZES:

  • 每个维度中的最大工作项数量。例如:设备可能具有最大为1024的WI大小和3个最大维度。但是,您可能无法使用(1024,1,1)这样的大小,因为它可能被限制为(64,64,64),因此,您只能使用(64,2,8)。

CL_KERNEL_WORK_GROUP_SIZE:

  • 由实现提供的默认内核大小。它可能被强制设置得更高或更低,但已经提供的值应该已经是一个不错的值了(GPU使用率、内存溢出等的良好平衡点)。

注意:所有这些数据都是理论上的极限。但如果您的内核使用某个资源比其他资源更多,例如:基于工作组大小的本地内存,则您可能无法达到最大工作项数,因为您可能首先达到本地内存限制。


关于CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE,这是指全局常量内存还是内核中的私有变量? - Cool_Coder
通过__constant标志传递给内核的参数所使用的内存量。它们可能是内核外的普通缓冲区。但是在内部,如果定义为那样,它们将是非常快速的read_only内存。您应该将此用于将在许多工作项中重复的参数。静态参数(整数、结构等)也将成为某种常量内存(取决于实现方式)。 - DarkZeros
假设工作组数等于最大计算单元数。因此,如果我将CL_KERNEL_WORK_GROUP_SIZE设置为本地工作组大小,则意味着所有必需的内存检查都会由OpenCL编译器自动完成?这样我就不需要再次检查这些参数了。 - Cool_Coder
1
@Cool_Coder,我真的不明白为什么您要选择要在总共运行多少个工作组中进行选择。您需要选择的是有多少个工作项(全局大小),以及如何将这些全局大小分成适合硬件的小的并行块(工作组大小)。如果最佳工作组大小为256,并且您的工作量为1024,则硬件将运行4个工作组。但如果它的大小为1M,则会运行4096个工作组。当然,第二种情况需要更多时间,但在两种情况下,工作组大小都是理想的(256)。(通常由OpenCL(默认)提供的大小是可以接受的) - DarkZeros
2
@Cool_Coder 假设我需要将1G(1073741824)个数字乘以比例因子X。而我的硬件以WG大小为1024的最佳方式执行此操作。然后我会说global = 1073741824``local = 1024。就这样。硬件将在N个计算单元中顺序运行1M个工作组(如果只有4个,则每个周期只处理4个),直到完成。 - DarkZeros
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接