gpt4 book ai didi

c++ - 没有 mpi 指令的程序在 mpirun 中非常慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:26 24 4
gpt4 key购买 nike

我现在正在编写一个程序来研究 MPI。好的,我会编写一个程序来乘方阵。

long **multiplyMatrices(long **matrix1, long **matrix2, long capacity)
{
long **resultMatrix = new long*[capacity];

for (long i = 0; i < capacity; ++i) {
resultMatrix[i] = new long[capacity];
}

for (long i = 0, j, k; i < capacity; ++i) {
for (j = 0; j < capacity; ++j) {
resultMatrix[i][j] = 0;

for (k = 0; k < capacity; ++k) {
resultMatrix[i][j] = resultMatrix[i][j] + matrix1[i][k] * matrix2[k][j];
}
}
}

return resultMatrix;
}

其中 capacity == 1000

好的,在本地主机(Mac Mini 2012、Core i7、OS X 10.8.2)上,我使用 LLVM 在 XCode 中编译这段代码。计算需要 17 秒。是的,在一个线程中。

在远程主机上(Sun OS 5.11,双核 CPU,8 个 vCPU)我用它编译

g++ -I/usr/openmpi/ompi-1.5/include -I/usr/openmpi/ompi-1.5/include/openmpi -O2 main.cpp -R/opt/mx/lib -R/usr/openmpi/ompi-1.5/lib -L/usr/openmpi/ompi-1.5/lib -lmpi -lopen-rte -lopen-pal -lnsl -lrt -lm -ldl -lsocket -o main

或者只是

g++ -O2 main.cpp -o main

但是...mpirun main 需要 152 秒来计算这个...有什么问题吗?我错过了什么吗?那是关于服务器的 CPU 架构吗?

最佳答案

主要的答案是内存管理。

看看那些线

long **resultMatrix = new long*[capacity];

for (long i = 0; i < capacity; ++i) {
resultMatrix[i] = new long[capacity];
}

所有行位于内存的不同位置,而不是作为一个整体 block 。我们知道物理内存在 Mac Mini 上是如何呈现的——2 block 塑料,但在服务器上它甚至可能是不同的主机(集群)。

现在我们将尝试解决此问题。

long **allocateMatrix(long capacity)
{
// Allocating a vector of pointers to rows
long **matrix = (long **)malloc(capacity * sizeof(long *));

// Allocating a matrix as a whole block
matrix[0] = (long *)malloc(capacity * capacity * sizeof(long));

// Initializing a vector of pointers with rows of addresses
long *lineAddress = matrix[0];
for(long i = 0; i < capacity; ++i) {
matrix[i] = lineAddress;
lineAddress += capacity;
}

return matrix;
}

void deallocateMatrix(long **matrix, long capacity)
{
free(matrix[0]);
free(matrix);
}

这将代码在 Mac Mini 上的运行时间提高到 9.8 秒,在服务器上的运行时间提高到 58 秒。

但我仍然不知道其他时间泄漏在哪里。也许我应该以某种方式优化循环其中一个矩阵。

关于c++ - 没有 mpi 指令的程序在 mpirun 中非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14027691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com