我正试图绕过这些东西。显然,我们的数据如何细分对性能利用至关重要。我在这里走在正确的轨道上吗?我们使用大小为1024x1024的图像,并将进行简单的任意计算作为示例。
首先,GPU设备有几个核心,也称为计算单元(CU)。每个计算单元进一步细分为执行实际工作的多个处理元件(PE)。在OpenCL中,我们使用CL_DEVICE_MAX_COMPUTE_UNITS找到CU的数量。但我们如何找到PE?似乎无法在OpenCL规范中找到标志。
全局大小为1024x1024 = 1048576个图像像素,我们将对每个像素执行操作。
(1)现在,我们将图像细分为称为工作组的区域。工作组在CU上执行,CORRECT?即一个工作组只映射到一个CU?
(2)假设我们的GPU有16个CU,我们将工作组设置为16.现在每个工作组将有65536个工作项执行?
(3)现在我们的图像被分成16个部分同时执行所有部分?
(4)每组有65536个像素在其自己的CU上嘎吱作响。由于CU由几个PE组成,那些65536个像素是否会进一步细分和同时处理?什么会更好 - 很多工作组和较少的工作项(单个像素)或相反的?
(5)本地存储器......据说本地存储器在CL_DEVICE_LOCAL_MEM_SIZE处固定在某个最大值。如果我有一个__kernel const char * ker(__ local uint * locMem){...}并在初始化时我将locMem设置为大于max?会产生什么样的表现?此外,本地存储器仅在单个CU中可见,并且在该特定CU中的所有PE之间共享?
(6)在单个内核(即一个PE)中,我在设置本地变量时有什么界限?如果我设置过多的本地变量,会发生什么?同样的问题适用于CU。
对不起轰炸,一定是神秘的,其他讨论这些问题的线索都在不同的背景下,或者和我正在使用的书一样含糊不清。