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

时间:2014-04-11 15:41:12

标签: opencl

我能够列出以下参数,这些参数有助于根据设备内存限制设备的工作项:

  • 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

我发现这些参数的explanation不足,因此我无法正确使用这些参数。 有人可以告诉我这些参数的含义以及它们的使用方法。 是否有必要检查所有这些参数?

PS:我对一些参数有一些简要的了解,但我不确定我的理解是否正确。

1 个答案:

答案 0 :(得分:8)

CL_DEVICE_GLOBAL_MEM_SIZE:

  • 设备的全局内存量。除非您使用大量数据,否则您通常不在乎。无论如何,如果你使用超过允许的数量,OpenCL规范会抱怨OUT_OF_RESOURCES错误。 (字节)

CL_DEVICE_LOCAL_MEM_SIZE:

  • 每个工作组的本地内存量。然而,这个限制恰好在理想条件下。如果你的内核每WG使用大量的WI,那么一些私有WI数据可能会泄漏到本地内存中。因此,将其视为每个工作组的最大可用金额。

CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:

  • 可用于单个内核的最大常量内存量。如果你使用的常量缓冲区总共超过这个数量,它将失败,或者使用全局普通内存(因此可能会更慢)。 (字节)

CL_DEVICE_MAX_MEM_ALLOC_SIZE:

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

CL_DEVICE_MAX_WORK_GROUP_SIZE:

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

CL_DEVICE_MAX_WORK_ITEM_SIZES:

  • 每个维度的最大工作项数量。 IE:设备最大尺寸为1024 WI,最大尺寸为3。但是您可能无法使用(1024,1,1)作为大小,因为它可能限于(64,64,64),因此,您只能执行(64,2,8)。

CL_KERNEL_WORK_GROUP_SIZE:

  • 实现给出的默认内核大小。它可能被迫更高或更低,但已经提供的值应该是一个好的值(GPU使用率,内存溢出等的良好权衡)。

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