首页 > 解决方案 > 使用 AMP 的矩阵乘法的奇怪性能取决于内存布局

问题描述

我开始尝试使用 Microsoft 的 AMP - Accelerated Massive Parallelism 库。

我编写了代码来计算 C = A * B(或 C = A*B^T)。

我的 CPU 直觉表明,将转置的 B 矩阵作为输入应该可以大大提高性能。循环和访问将是:
for(y) for(x) for(k) C[y][x] = A[y][k] * B[x][k];

在 GPU 上运行时,此变体比没有转置的变体慢一个数量级 -B[k][x]运行时间从 700 毫秒降低到 100 毫秒。

这对我来说毫无意义。谁能解释这种行为?更一般地说,编写高性能 GPU 算法的内存布局规则是什么?

产生上述结果的代码:https ://gist.github.com/Noxitu/d961889140691693072562eac08e50bc

(我认为 AMP 默认与 Visual Studio 一起安装。)

(请注意,代码声称大部分时间都花在“同步”调用中,但由于我的基准测试的一致性,我相信它一定parallel_for_each是异步操作。)

标签: c++directxc++-amp

解决方案


推荐阅读