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

Coo*_*der 5 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

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

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

Dar*_*ros 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:

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

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使用%,内存溢出等的良好权衡).

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

  • @Cool_Coder 假设我需要将 1G (1073741824) 数字乘以 X 的比例因子。我的硬件以最佳方式执行此操作,WG 大小为 1024。然后我会说 `global = 1073741824` `local = 1024`。仅此而已。硬件将在N个计算单元中依次运行1M个工作组(如果只有4个,则每个周期仅处理4个)直到完成。 (2认同)