【发布时间】:2019-01-02 00:22:21
【问题描述】:
我正在尝试使用 MPI 进行矩阵乘法,并且想寻求一些帮助以了解一个问题。该机有6个核心,32KB L1缓存,256KB L2缓存和15MB L3缓存。乘法是这样的:
vector<vector<double>> mult_mpi(vector<vector<double>> m,
vector<vector<double>> n) {
int rows = m.size();
int size = n.size();
vector<vector<double>> r(rows, vector<double>(size));
for (int i = 0; i < rows; ++i)
for (int k = 0; k < size; ++k)
for (int j = 0; j < size; ++j)
r[i][j] += m[i][k] * n[k][j];
return r;
}
我对@987654327@也有同样的看法:
vector<vector<int>> mult_mpi(vector<vector<int>> m, vector<vector<int>> n);
然后我做了一些图,不同的线条颜色表示节点的数量。
下图显示了将两个 int 矩阵相乘所花费的时间:
下图显示了将两个双精度矩阵相乘所花费的时间:
为什么在双重情况下,4 个节点和 6 个节点的时间相同?我是否遇到了内存带宽的限制?
我在过去一小时内尝试了多次,结果相同。还使用top 检查了机器负载,但在我看来,我一个人在那里。
【问题讨论】:
-
我不知道您的问题的答案,但请注意,这是矩阵乘法的缓慢实现。
-
你能给我推荐一个替代方案吗?因为我刚刚开始,我想越简单越好。你会说我得到的时间与硬件兼容吗?
-
不幸的是,所有使矩阵乘法快速的东西也使它变得更复杂。作为参考,在 Sandy Bridge E 上(我猜你使用 i7-3960X?)你的 DP FPop/循环上限是 4 次乘法和4 补充,您可以根据时钟速度(取决于有多少内核处于活动状态)、内核数量和矩阵大小计算出最短时间,然后您可以看到您离该最短时间有多近
-
我还建议Eigen,一个非常易于使用的矩阵代数库。
-
作为比较,在我的 Haswell(4770K,3.9GHz)上,将两个 4096x4096 矩阵在一个内核上相乘大约需要 1.5 秒,这还不是最佳的。请注意,MMM 相当独特,因为它不需要受到内存带宽的限制,因为它有一个立方的算术量并且只有一个平方的数据量 - 但它将受到内存带宽的限制如果你不实现平铺。
标签: c++ matrix mpi matrix-multiplication hpc