OpenCL工作组、工作项、本地内存概念

OpenCL工作组、工作项、本地内存概念,c,memory,opencl,gpu,C,Memory,Opencl,Gpu,我正试着把我的头放在这些东西上。显然,数据的细分方式对性能利用率至关重要。我走对了吗?我们使用大小为1024x1024的图像,并将进行简单的任意计算作为示例 首先,GPU设备有几个核,也称为计算单元(CU)。每个计算单元进一步细分为执行实际工作的数字处理元素(PE)。在OpenCL中,我们使用CL_设备_MAX_计算单位来计算CU的数量。但是我们如何找到PEs呢?在OpenCL规范中似乎找不到该标志 全局大小将为1024x1024=1048576个图像像素,我们将对每个像素执行操作 (1) 现在

我正试着把我的头放在这些东西上。显然,数据的细分方式对性能利用率至关重要。我走对了吗?我们使用大小为1024x1024的图像,并将进行简单的任意计算作为示例

首先,GPU设备有几个核,也称为计算单元(CU)。每个计算单元进一步细分为执行实际工作的数字处理元素(PE)。在OpenCL中,我们使用CL_设备_MAX_计算单位来计算CU的数量。但是我们如何找到PEs呢?在OpenCL规范中似乎找不到该标志

全局大小将为1024x1024=1048576个图像像素,我们将对每个像素执行操作

(1) 现在,我们将图像细分为称为工作组的区域。工作组在CUs上执行,对吗?即,一个工作组映射到一个CU

(2) 假设我们的GPU有16个CU,我们将工作组设置为16个。现在每个工作组将执行65536个工作项

(3) 现在我们的图像被分成16个部分同时执行

(4) 每组有65536像素可供自己的CU处理。由于CU由几个PE组成,这些65536像素是否进一步细分并同时处理?有多个工作组和较少的工作项(单个像素)或相反的东西会更好吗

(5) 本地内存。。。本地内存被称为固定在CL_设备本地内存大小的某个最大值。如果我有一个uu kernel const char*ker(uu local uint*locMem){…}并且在初始化时我将locMem设置为大于最大值,该怎么办?这将对性能产生什么影响?此外,本地内存仅在单个CU中可见,并且在该特定CU中的所有PE之间共享

(6) 在单个内核(即一个PE)中,设置本地变量的界限是什么?如果我设置了太多的本地变量,会发生什么?同样的问题也适用于CU


很抱歉,这是一个谜,其他讨论这些问题的线程都与我正在使用的书在不同的背景下或类似的含糊不清。

现在不要太关注硬件;相反,遵循一般准则-每个工作组128-256个工作项(每个块的线程数)是一个很好的起点;根据需要生成多个工作组以覆盖整个图像。然后对您的发布配置进行基准测试、评测和优化。在一个线程中处理多个像素也是一种可行的优化策略。谢谢您的回答。所以我设置为256像素而不是65536?这将为我提供4096个组,这些组将在我的16个CUs上执行->一次16个组?:)在问这些问题之前,你需要先尝试一下。甚至不支持每个块65536个线程;如果指定这样的配置,内核启动就会失败。不要担心团队如何分布在CU中;只要您有足够的组,这将保持设备饱和。