gpt4 book ai didi

c++ - 为什么 MPI_Send 调用累积时 MPI_Recv 会失败

转载 作者:行者123 更新时间:2023-11-30 05:20:09 25 4
gpt4 key购买 nike

我有一个 MPI 程序,其中 worker ranks (rank != 0) 发出一堆 MPI_Send 调用,master rank (rank == 0) 接收所有这些消息。但是,我在 MPI_Recv 中遇到了 fatal error - MPI_Recv(...) 失败,内存不足。

这是我在 Visual Studio 2010 中编译的代码。我像这样运行可执行文件:

mpiexec -n 3 MPIHelloWorld.exe

int main(int argc, char* argv[]){
int numprocs, rank, namelen, num_threads, thread_id;
char processor_name[MPI_MAX_PROCESSOR_NAME];

MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Get_processor_name(processor_name, &namelen);

if(rank == 0){
for(int k=1; k<numprocs; k++){
for(int i=0; i<1000000; i++){
double x;
MPI_Recv(&x, 1, MPI_DOUBLE, k, i, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
}
}
else{
for(int i=0; i<1000000; i++){
double x = 5;
MPI_Send(&x, 1, MPI_DOUBLE, 0, i, MPI_COMM_WORLD);
}
}
}

如果我只运行 2 个进程,程序不会崩溃。因此,问题似乎出在来自第三级(也称为第二个工作节点)的 MPI_Send 调用累积时。

如果我将迭代次数减少到 100,000 次,那么我可以运行 3 个进程而不会崩溃。但是,一百万次迭代发送的数据量约为 8 MB(8 字节用于 double * 1000000 次迭代),因此我认为“内存不足”指的不是任何物理内存,如 RAM。

感谢任何见解,谢谢!

最佳答案

MPI_send 操作将数据存储在 system buffer 上准备发送。此缓冲区的大小及其存储位置为 implementation specific (我记得听说这甚至可以在互连中)。就我而言(带有 mpich 的 linux),我没有收到内存错误。显式更改此缓冲区的一种方法是将 MPI_buffer_attachMPI_Bsend 一起使用。可能还有一种方法可以更改系统缓冲区大小(例如 IBM 系统上的 MP_BUFFER_MEM 系统变量)。

不过,这种无回复消息的情况在实际中应该不会出现。在上面的示例中,可以交换 ki 循环的顺序以防止消息堆积。

关于c++ - 为什么 MPI_Send 调用累积时 MPI_Recv 会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40794858/

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