Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization AMD GCN OpenCL上运行的优化内核一次只能使用1024字节吗?_Optimization_Opencl_Gpgpu_Amd Gcn - Fatal编程技术网

Optimization AMD GCN OpenCL上运行的优化内核一次只能使用1024字节吗?

Optimization AMD GCN OpenCL上运行的优化内核一次只能使用1024字节吗?,optimization,opencl,gpgpu,amd-gcn,Optimization,Opencl,Gpgpu,Amd Gcn,我开始设计我的第一个严肃的OpenCL程序,我想确保我了解我的AMD R9 290x是如何设置的。(GCN 2.0体系结构)。所以我只想说我理解的,希望有人能告诉我哪里是对的,哪里是错的 在我看来,优化内核的一个主要问题是内存限制性能。我真的不想在这里进行“过早”的优化,但看起来至少考虑内存对于OpenCL代码来说是非常重要的。(见GPU排序:调查(Dmitri I.Arkhipov+其他)) 根据,每个矢量单元每4个时钟可以运行64个工作项,每个工作项可以访问256个32位VGRP。实际上,私

我开始设计我的第一个严肃的OpenCL程序,我想确保我了解我的AMD R9 290x是如何设置的。(GCN 2.0体系结构)。所以我只想说我理解的,希望有人能告诉我哪里是对的,哪里是错的

在我看来,优化内核的一个主要问题是内存限制性能。我真的不想在这里进行“过早”的优化,但看起来至少考虑内存对于OpenCL代码来说是非常重要的。(见GPU排序:调查(Dmitri I.Arkhipov+其他))

根据,每个矢量单元每4个时钟可以运行64个工作项,每个工作项可以访问256个32位VGRP。实际上,私有数据(尝试)存储在VGGPRS中

这导致OpenCL内核有1024个“简单”访问寄存器

LDS(也称为本地)似乎可以用作OpenCL内核的高效存储,但它们的主要设计似乎是跨工作组进行数据通信。由于计算单元的64kb在4个向量单元之间共享(每个向量单元理想情况下至少有1个执行64个工作项的波前),因此可以为每个工作项提供最多256字节的LDS空间,以使系统尽可能“宽”地运行


因此,通过仔细分配局部变量和私有变量,每个工作项似乎有1280个“快速访问”字节可用。我猜一级缓存会再提供16kb(即每个工作项只有64字节),但这需要一些谨慎的处理。此外,一级缓存还包含代码/指令,不能全部用于数据。“__常数”空间似乎实际上是L1空间,如果波前同步到相同的索引,则可能会出现一些“多路复用”魔法

上述计算均未考虑理论上每矢量单位10个波前(似乎共享VGRP)。如果R9 290x实际上有40个波前同时执行,它们将只使用100字节(每个工作项25 vGPRs)的快速访问内存


所以。。。这是否正确理解了每个工作项在GCN设备(如R9 290x)中的“快速”内存量?如果我们认为VGPRS、L1和LDS空间是R9290X工作的“快速”存储的整体,我们只看1024(VGPR)+ 64(L1)+ 256(LDS)空间来工作。 我确实意识到内核可以扩展到全局内存(在典型的R9 290x上大约4GB,每个工作项大约1MB)。由于GPU上的全局内存仍然是高度并行的GDDR5内存,我希望它会非常快,但它仍然比L1/VGRS/LDS空间慢一个数量级。所以我希望最优程序在不需要的时候尽量避免使用全局RAM