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

时间:2017-09-26 22:06:09

标签: optimization opencl gpgpu amd-gcn

我开始构建我的第一个严肃的OpenCL程序,我想确保我理解我的AMD R9 290x是如何设置的。 (GCN 2.0架构)。所以我只是说出我理解的内容,希望那里有人可以告诉我哪里对错?

在我看来,优化内核的一个主要问题是内存限制性能。我真的不想做过早的"这里优化,但似乎至少考虑内存对OpenCL代码一般非常重要。 (请参阅使用GPU排序:调查(Dmitri I. Arkhipov +其他))

根据AMD's optimization guide,每个向量单元可以每4个时钟运行64个工作项,每个工作项可以访问256个32位vGPR。实际上,__私有数据(尝试)存储在vGPR中。

这导致1024" easy"访问OpenCL内核的寄存器。

看起来LDS(又名__local)可以用作OpenCL内核的高效存储,但它们的主要设计似乎是在整个工作组中传递数据。由于计算单元的64kb在4个向量单元(每个理想情况下至少有1个波前的64个工作项执行)之间共享,因此最多可以给出256个字节的LDS空间每个工作项使系统运行为"宽"尽可能。

因此,通过一些仔细的__local和__private变量分配,它似乎是1280"快速访问"每个工作项可用字节数。我猜L1缓存授予另外16kb(每个工作项只有64字节),但这需要一些小心的玩杂耍来使用。此外,L1缓存还包含代码/指令,并且不能全部用于数据。 " __恒定"空间似乎是有效的L1空间,有些"多路复用"如果wavefront同步到同一索引,可能会发生魔法。

上述计算均未考虑每个矢量单位(似乎共享vGPR)的理论10波阵面。如果R9 290x实际上同时执行了40个波阵面,那么它们只能使用100个字节(每个工作项25个vGPR)的快速访问存储器。

所以...这是正确理解多少"快速"内存每个工作项都像R9 290x一样进入GCN设备?如果我们认为vGPR,L1和LDS空间是" quick"的总和。 R9 290x的存储空间可供使用,我们只需查看1024(vGPR)+ 64(L1)+ 256(LDS)空间即可使用。

我确实认识到内核可以扩展到全局内存(在典型的R9 290x上大约4GB,每个工作项大约大约1MB)。由于GPU上的全局内存仍然是高度并行化的GDDR5内存,我预计它会非常快,但它仍然比L1 / vGPR / LDS空间慢一些。因此,我希望最佳程序尽量避免在不需要时使用全局RAM。

0 个答案:

没有答案