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

标签 gpu opencl matrix-multiplication amd-gcn

我有一个 OpenCL 代码,它将 2 个矩阵 (GEMM) 与 M=4096、N=4096 和 K=16 相乘。 (即矩阵 4096 x 16 浮点数)
我在 Polaris 560、16CU GPU 上运行它。
代码:https://github.com/artyom-beilis/oclblas/blob/master/gemm/gemm.cl
我注意到这个大小的性能下降非常奇怪,这个大小的矩阵乘法有 ~8-10 GFlops 的性能,而如果我将 N 更改为 4095 或 4097,我会得到大约 130-150Gflops。我注意到与 clblas 或 miopengemm 等其他 GEMM 库类似的行为 - 对于这个 4096x16 的特定大小,我的性能显着下降,并且将 N 更改为 1 可以多次提高性能。
工作负载分为 256 个线程的工作组。每个工作组处理 128x16 和 128x16 矩阵图块(每个线程 8x8 块)。
我尝试使用 6x6 块将矩阵平铺更改为 96x96,而不是使用 8x8 的 128x128 - 结果相同。
我使用 ROCm 3.7 OpenCL、Clover OpenCL 甚至 Windows OpenCL 驱动程序测试了相同的代码 - 相同的行为。
具有相同数量的 GPU 内核(线程)和相同内存类型/大小的 nvidia gtx 960 不存在此类问题。
我怀疑这与缓存/冲突有关,但我不明白它是如何发生的。因此我不知道如何解决它。

最佳答案

最后我发现 clBlas 库(最初为 AMD 开发)处理了 lda % 1024==0 的特殊情况。 , ldb % 1024==0可能是因为缓存
https://github.com/clMathLibraries/clBLAS/blob/master/src/library/blas/specialCases/GemmSpecialCases.cpp#L228
我发现更好的方法是按 z 曲线顺序重新排列块,而不是将多个内核排队。
https://github.com/artyom-beilis/oclblas/blob/master/gemm/gemm.cl#L109
办案M!=NM != 1<<n我刚刚将 M/N 的工作组数量增加到接近 1<<n和没有工作的团体在乞讨中退出,不会增加太多的开销。
z-order 将性能提高了 4 倍。

关于gpu - AMD Polaris 上某些尺寸的矩阵乘法性能下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68149241/

相关文章:

c - 如何在没有任何非标准库的情况下在 C 中进行多处理

c - 非 GPU 硬件上是否会发生 Bank 冲突?

linux - 带有集成英特尔图形芯片的 Linux 上的 OpenCL

python - 来自因子载荷和因子协方差的协方差矩阵?

c - openMP COLLAPSE 在内部是如何工作的?

linux - 在 Windows 中运行时的 CUDA 性能损失

cuda - 为什么cuFFT这么慢?

matlab - Matlab 中的张量收缩

javascript - 使用 GPU 在 Canvas 上绘图时性能受到影响

cuda - 简单的 CUBLAS 矩阵乘法示例?