问题标签 [amd-gcn]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
770 浏览

parallel-processing - SIMD-16 和 SIMD-32 的优势/劣势?

因此,最近,AMD 在其新的 Navi GPU 系列中推出了名为 rDNA 的新 GPU 架构。在阅读了某些架构深度文章视频后,我的理解是这样的(如果我错了,请随时纠正):

  • 需要类似指令才能执行的小型工作负载称为“线程”。

  • 然后调度程序将一堆需要相同指令的线程安排在一起。特别是在 AMD GPU 的情况下,GCN 和 rDNA 被设计为分别处理 64 和 32 个线程。

  • SIMD 然后处理那些集群线程。但不同的是,AMD GCN 使用 SIMD16,意味着一次可以处理 16 个线程,而 AMD rDNA 使用 SIMD32,意味着一次可以处理 32 个线程。

  • 如果 GPU 需要执行所有 64 个线程,事情应该可以完美运行,但如果它只需要执行 1 个线程,那就太麻烦了。所以只有 1 个 SIMD16 矢量单元实际上在做一些富有成效的事情,而其他三个基本上只是令人不寒而栗。

  • 架构的改变意味着,有了 SIMD32,GPU 可以消除潜在的瓶颈。

然而,这些消息来源中的每一个都在说“SIMD16 设计更适合计算工作负载”......这让我提出了一些问题:

1)SIMD32设计在SIMD16中不是在各个方面都更好吗?如果不是,那么 SIMD16 在计算工作中的优势到底是什么?

2)对于每64个线程,4个SIMD16是同时还是串行做处理工作?我问它的原因是来自Engadget的视频将这个过程描述为序列化,而来自Linus Tech Tips的视频似乎暗示它是并行的。这让我很困惑。

  • 如果一切都是串行的,那么为什么 AMD 不只是选择 SIMD64 或其他东西?

  • 如果一切都是平行的,那么老实说,我根本看不到 SIMD 的优势。在 GCN 上,你有 4 个 SIMD16,在 rDNA 上,你有 2 个 SIMD32。如果您使用 SIMD16 在 GCN 上处理 1 个线程,则运行 1 个 SIMD16 的时间应该等于运行 4 个 SIMD16 的时间,因为它们再次是并行的。跳转到 2 SIMD32,您处理 1 SIMD32 的时间应该等于您处理其中 2 个 SIMD32 的时间。在这两种情况下,您仍然可能有 63 个未使用的线程。那么有什么意义呢。

我知道我的理解在某些时候一定有缺陷,所以我希望得到一些深入的解释。谢谢。

0 投票
1 回答
43 浏览

opencl - 在 AMD Radeon RX580 上解决的这个 N 体问题中,内存访问的最佳实践是什么?

我计算了 N 个粒子在其引力场中移动的轨迹。我编写了以下 OpenCL 内核:

然后我多次运行这个内核作为全局工作大小=[体数]的一维问题:

这是来自AMD OpenCL 优化指南(2015 年)的引述:

在某些情况下,通道冲突的一个意外情况是从同一地址读取是一个冲突,即使在 FastPath 上也是如此。这不会发生在只读存储器上,例如常量缓冲区、纹理或着色器资源视图 (SRV);但可以在读/写 UAV 内存或 OpenCL 全局内存上。

我队列中的工作项都尝试在此循环中访问相同的内存,因此肯定存在通道冲突:

我换了

所以第一个工作项(具有全局 id 0)首先访问数组r中的第一个元素,第二个工作项访问第二个元素,依此类推。

我预计这种变化一定会导致性能提高,但相反,它会导致性能显着下降(大约是 2 倍)。我错过了什么?为什么在这种情况下,完全相同的内存可以更好地访问它?

如果您有其他提示如何提高性能,请与我分享。OpenCL 优化指南非常混乱。

0 投票
0 回答
32 浏览

opencl - 在 OpenCL 中,可以获取一个包含 GCN 程序集的数组并执行它(JIT)吗?

我对 OpenCL 比较陌生,对此感到疑惑。我听说可以通过 OpenCL 在某些 AMD gpus 上进行 JIT。现在,如果这要像在 c++ 中那样在语法上工作,我会写如下内容:

当然,这样的事情给了我错误-11。

可以做到吗,如果可以,正确的方法是什么?

...如果可以的话,第二次跟进,OpenCL 中的调用约定是什么?

0 投票
1 回答
169 浏览

gpu - AMD Polaris 上某些尺寸的矩阵乘法性能下降

我有一个 OpenCL 代码,它将 2 个矩阵 (GEMM) 与 M=4096、N=4096 和 K=16 相乘。(即矩阵 4096 x 16 浮点数)

我在 Polaris 560、16CU GPU 上运行它。

代码:https ://github.com/artyom-beil​​is/oclblas/blob/master/gemm/gemm.cl

我注意到这种大小的性能下降非常奇怪,这种大小的矩阵乘法具有约 8-10 GFlops 的性能,而如果我将 N 更改为 4095 或 4097,我会得到大约 130-150Gflops 的性能。我注意到其他 GEMM 库(如 clblas 或 miopengemm)的类似行为 - 对于这种 4096x16 的特定大小,我的性能显着下降,并且将 N 更改为 1 可将性能提高数倍。

工作负载分为 256 个线程的工作组。每个工作组处理 128x16 和 128x16 矩阵块(每个线程 8x8 块)。

我尝试使用 6x6 块将矩阵平铺更改为 96x96,而不是使用 8x8 的 128x128 - 结果相同。

我使用 ROCm 3.7 OpenCL、Clover OpenCL 甚至 Windows OpenCL 驱动程序测试了相同的代码 - 相同的行为。

具有相同数量的 gpu 内核(线程)和相同内存类型/大小的 nvidia gtx 960 不存在此类问题。

我怀疑这与缓存/冲突有关,但我不明白它是如何发生的。因此,我不知道如何解决它。