基于MPI C++的3x3矩阵泰勒级数指数并行计算的循环优化问询
基于MPI C++的3x3矩阵泰勒级数指数并行计算的循环优化问询
我现在需要用MPI结合泰勒级数来计算矩阵的指数,比如3x3这类小矩阵。我已经写好了相关代码,包括矩阵乘法函数matrixMult以及核心的并行矩阵指数计算函数matrixExp:
vector<vector<double>> matrixMult(const vector<vector<double>>& A, const vector<vector<double>>& B) { int n = A.size(); vector<vector<double>> C(n, vector<double>(n, 0)); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) for (int k = 0; k < n; k++) C[i][j] += A[i][k] * B[k][j]; return C; } vector<vector<double>> matrixExp(const vector<vector<double>>& A) { int n = A.size(); vector<vector<double>> E(n, vector<double>(n, 0)); vector<vector<double>> T(n, vector<double>(n, 0)); vector<vector<double>> localE(n, vector<double>(n, 0)); int rank, size; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); for (int i = 0; i < n; i++) E[i][i] = 1; for (int i = 0; i < n; i++) localE[i][i] = 0; T = E; for (int j = 1; j <= rank; j++) { T = matrixMult(T, A); T = matrixDiv(T, j); } localE = T; for (int i = rank + 1; i <= N; i += size) { for (int j = i; j < i + size; j++) { T = matrixMult(T, A); T = matrixDiv(T, j); } localE = matrixSum(localE, T); } MPI_Reduce(localE[0].data(), E[0].data(), n, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(localE[1].data(), E[1].data(), n, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(localE[2].data(), E[2].data(), n, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); return E; }
不过我对这段循环的优化完全没思路:
for (int j = i; j < i + size; j++) { T = matrixMult(T, A); T = matrixDiv(T, j); }
我甚至怀疑以当前的实现方式,可能根本没办法优化这段循环,这里附上了并行计算的示意图。
备注:内容来源于stack exchange,提问作者Godlaa
相关产品推荐
相关产品推荐

