【发布时间】:2023-01-12 23:31:42
【问题描述】:
我有一个程序将驻留在同一容器矩阵中的两个子矩阵相乘。我试图通过使用 OpenMP API 进行并行化来获得一些性能提升。下面是我使用的乘法算法。
#pragma omp parallel for
for(size_t i = 0; i < matrixA.m_edgeSize; i++) {
for(size_t k = 0; k < matrixA.m_edgeSize; k++) {
for(size_t j = 0; j < matrixA.m_edgeSize; j++) {
resultMatrix(i, j) += matrixA(i, k) * matrixB(k, j);
}
}
}
该算法按行访问两个输入子矩阵的元素,以增强空间局部性的缓存使用。
可以使用哪些其他 OpenMP 指令从该简单算法中获得更好的性能?有没有其他指令可以优化两个子矩阵重叠区域的操作?
您可以假设所有子矩阵都具有相同的大小并且它们是方形的。生成的子矩阵驻留在另一个容器矩阵中。
【问题讨论】:
-
是为了实用还是为了学习?在第一种情况下,有很多高性能线性代数库可以为您的特定 CPU 进行各种优化
-
“如何在两个子矩阵相乘的同时获得性能提升?” - 第一步是转向在构建代码时的编译器优化器(调试构建(通常是编译器默认)可以是真的慢的)。
-
@Unlikus 这是为了学习。感谢您的建议。
-
@JesperJuhl 我的目的是增强这个单一的代码片段。无论如何,感谢您的优化建议。
标签: c++ openmp matrix-multiplication