C++ 有人能帮我识别这个代码示例中的运行时MPI错误吗?
此代码采样器用于学习MPI编程。我使用的MPI包是MPICH2 1.3.1。下面的代码是我学习MPI_Isend、MPI_Irecv和MPI_Wait的第一步。该代码有一个主代码和几个工作代码。Master从workers接收数据,workers向Master发送数据。与往常一样,数据量非常大,工作人员将数据拆分为中继并按顺序发送中继。在发送中继时,我使用了一些技巧来重叠计算和通信。该方法非常简单,只需为每个发送周期保留两个缓冲区以容纳两个中继C++ 有人能帮我识别这个代码示例中的运行时MPI错误吗?,c++,mpi,C++,Mpi,此代码采样器用于学习MPI编程。我使用的MPI包是MPICH2 1.3.1。下面的代码是我学习MPI_Isend、MPI_Irecv和MPI_Wait的第一步。该代码有一个主代码和几个工作代码。Master从workers接收数据,workers向Master发送数据。与往常一样,数据量非常大,工作人员将数据拆分为中继并按顺序发送中继。在发送中继时,我使用了一些技巧来重叠计算和通信。该方法非常简单,只需为每个发送周期保留两个缓冲区以容纳两个中继 int test_mpi_wait_2(int a
int test_mpi_wait_2(int argc, char* argv[])
{
int rank;
int numprocs;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
int trunk_num = 6;// assume there are six trunks
int trunk_size = 10000;// assume each trunk has 10,000 data points
if(rank == 0)
{
//allocate receiving buffer for all workers
int** recv_buf = new int* [numprocs];
for(int i=0;i<numprocs;i++)
recv_buf[i] = new int [trunk_size];
//collecting first trunk from all workers
MPI_Request* requests = new MPI_Request[numprocs];
for(int i=1;i<numprocs;i++)
MPI_Irecv(recv_buf[i], trunk_size, MPI_INT, i, 0, MPI_COMM_WORLD, &requests[i]);
//define send_buf counter used to record how many trunks have been collected
vector<int> counter(numprocs);
MPI_Status status;
//assume therer are N-1 workers, then the total trunks will be collected is (N-1)*trunk_num
for(int i=0;i<(numprocs-1)*trunk_num;i++)
{
//wait until receive one trunk from any worker
int active_index;
MPI_Waitany(numprocs-1, requests+1, &active_index, &status);
int request_index = active_index + 1;
int procs_index = active_index + 1;
//check wheather all trunks from this worker have been collected
if(++counter[procs_index] != trunk_num)
{
//receive next trunk from this worker
MPI_Irecv(recv_buf[procs_index], trunk_size, MPI_INT, procs_index, 0, MPI_COMM_WORLD, &requests[request_index]);
}
}
for(int i=0;i<numprocs;i++)
delete [] recv_buf[i];
delete [] recv_buf;
delete [] requests;
cout<<rank<<" done"<<endl;
}
else
{
//for each worker, the worker first fill one trunk and send it to master
//for efficiency, the computation of trunk and communication to master is overlapped.
//two buffers are allocated to implement the overlapped computation
int* send_buf[2];
send_buf[0] = new int [trunk_size];//Buffer A
send_buf[1] = new int [trunk_size];//Buffer B
MPI_Request requests[2];
//file first trunk
for(int i=0;i<trunk_size;i++)
send_buf[0][i] = 0;
//send this trunk
MPI_Isend(send_buf[0], trunk_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &requests[0]);
if(trunk_num > 1)
{
//file second trunk
for(int i=0;i<trunk_size;i++)
send_buf[1][i] = i;
//send this trunk
MPI_Isend(send_buf[1], trunk_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &requests[1]);
}
//for remained trunks, keep cycle until all trunks are sent
for(int i=2;i<trunk_num;i+=2)
{
//wait till trunk data at buffer A is sent
MPI_Wait(&requests[0], MPI_STATUS_IGNORE);
//fill buffer A with next trunk data
for(int j=0;j<trunk_size;j++)
send_buf[0][j] = j * i;
//send buffer A
MPI_Isend(send_buf[0], trunk_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &requests[0]);
//if more trunks are remained, fill buffer B and sent it
if(i+ 1 < trunk_num)
{
MPI_Wait(&requests[1], MPI_STATUS_IGNORE);
for(int j=0;j<trunk_size;j++)
send_buf[1][j] = j * (i + 1);
MPI_Isend(send_buf[1], trunk_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &requests[1]);
}
}
//wait until last two trunks have been sent
if(trunk_num == 1)
{
MPI_Wait(&requests[0], MPI_STATUS_IGNORE);
}
else
{
MPI_Wait(&requests[0], MPI_STATUS_IGNORE);
MPI_Wait(&requests[1], MPI_STATUS_IGNORE);
}
delete [] send_buf[0];
delete [] send_buf[1];
cout<<rank<<" done"<<endl;
}
MPI_Finalize();
return 0;
}
我看到了几个明显的问题:一些for循环没有终止,一些cout语句没有终止,等等。我认为代码的格式不正确…答案不多,但这在我的MPI版本上编译并运行,最多有4个处理器。代码似乎有点复杂,但我也看不出它不起作用的任何原因。格式化代码时,请使用编辑框中的0101按钮并添加一些上下文,如正在使用的API、环境是什么,您认为的问题可能会帮助您更快地获得更好的答案。这看起来更好-那么错误是什么?错误是PMPI_Wait error和MPI_Finalization中的致命错误。这只是一个关于MPI_Isend、MPI_Irecv和MPI_Wait的测试代码。该代码可以在VisualStudio2008上正确编译。但在运行时,它总是停止。