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

根据OpenCL中的设备内存确定最大全局工作组大小?,opencl,Opencl,我可以列出以下参数,这些参数有助于根据设备内存限制设备的工作项: CL\ U设备\全局\成员\大小 CL\ U设备\本地\内存\大小 CL\u设备\u最大\u常数\u缓冲区\u大小 CL_设备_最大_内存_所有尺寸 CL\ U设备\最大\工作\组\大小 CL\ U设备\最大\工作\项目\尺寸 CL\内核\工作\组\大小 我发现这些参数的配置不足,因此无法正确使用这些参数。 有人能告诉我这些参数的含义和使用方法吗。 是否有必要检查所有这些参数 PS:我对一些参数有一些简要的了解,但我不确定我的

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

  • CL\ U设备\全局\成员\大小
  • CL\ U设备\本地\内存\大小
  • CL\u设备\u最大\u常数\u缓冲区\u大小
  • CL_设备_最大_内存_所有尺寸
  • CL\ U设备\最大\工作\组\大小
  • CL\ U设备\最大\工作\项目\尺寸
  • CL\内核\工作\组\大小
我发现这些参数的配置不足,因此无法正确使用这些参数。 有人能告诉我这些参数的含义和使用方法吗。 是否有必要检查所有这些参数


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

CL\u设备\全局\内存大小:

  • 设备的全局内存量。除非使用大量数据,否则您通常不会在意。无论如何,如果您使用的资源超过允许的数量,OpenCL规范将抱怨资源不足错误。(字节)
CL\ U设备\本地\内存大小:

  • 每个工作组的本地内存量。然而,这个极限只是在理想条件下。如果内核在每个工作组中使用了大量的WI,那么可能会有一些私有WI数据溢出到本地内存中。因此,将其作为每个工作组的最大可用量
CL\ U设备\最大\常数\缓冲区\大小:

  • 单个内核可以使用的最大常量内存量。如果您使用的常量缓冲区总数超过此数量,则它将失败,或者使用全局正常内存(因此可能会更慢)。(字节)
CL\ U设备\最大\内存\所有大小:

  • 在一个设备中,一个单件中可以分配的最大内存量。(字节)
CL\ U设备\最大\工作\组\大小:

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

  • 每个维度的最大工作项数。IE:设备最大尺寸为1024 WI,最大尺寸为3个。但是您可能无法使用(1024,1,1)作为大小,因为它可能被限制为(64,64,64),因此,您只能使用(64,2,8)作为示例
CL_内核_工作_组_大小:

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

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

一,。关于CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE,这是全局常量内存还是内核中的私有变量?是通过_CONSTANT标志传递给内核的参数所使用的内存量。它们可能是内核之外的普通缓冲区。但在内部,如果这样定义的话,它们将是一个速度非常快的只读存储器。对于将在多个工作项中重复的参数,应该使用此选项。静态参数(整数、结构等)也会缺少一些常量内存(取决于实现)。为什么我们已经有了CL_设备\u最大工作\u组\u大小,还需要CL_设备\u最大工作\u项目\u大小?@Cool\u Coder我真不明白为什么要选择总共要运行多少个工作组。您必须选择的是多少个工作项(全局大小),以及如何将这些全局大小拆分为硬件的小型并行队列(工作组大小)。如果最佳工作组大小是256,而您的工作是1024。硬件将运行4个工作组。但如果它的规模是1米,它将运行4096个工作组。当然,第二种情况需要更多的时间,但在这两种情况下,工作组的规模都是理想的(256)。(通常OpenCL(默认)提供的是OK)@Cool_Coder Supose我需要将1G(1073741824)数字乘以X的比例因子。我的硬件以最佳方式完成,工作组大小为1024。然后我会说
global=1073741824
local=1024
。仅此而已。硬件将以N个计算单元顺序运行1M个工作组(如果只有4个,则每个周期仅处理4个),直到完成。