C 可笑的简单MPI发送/接收问题我不知道';我不明白
我有两个不同算法的函数。在第一个函数中,我实现了非阻塞通信(MPI_Irecv、MPI_Isend),程序运行时没有任何错误。即使我将非阻塞通信更改为阻塞通信,一切都很好。没有僵局。 但是如果我用基本的阻塞通信实现第二个函数,就像这样(将算法简化为问题): 因此,进程1应该从进程0接收值a。但我得到了一个错误: MPI_Recv中的致命错误:消息 截断,错误堆栈: MPI_Recv(187): MPI_Recv(buf=0xbfbef2a8,计数=1, MPI_双精度,src=0,tag=0, MPI_通信世界,状态=0xbfbef294) 失败 MPIDI CH3U请求打开包装(600): 消息被截断;接收到32字节 但缓冲区大小是8,在作业39中排名2 布拉布拉引起的集体冲突 所有列组的中止退出状态 等级2:被信号9杀死C 可笑的简单MPI发送/接收问题我不知道';我不明白,c,mpi,C,Mpi,我有两个不同算法的函数。在第一个函数中,我实现了非阻塞通信(MPI_Irecv、MPI_Isend),程序运行时没有任何错误。即使我将非阻塞通信更改为阻塞通信,一切都很好。没有僵局。 但是如果我用基本的阻塞通信实现第二个函数,就像这样(将算法简化为问题): 因此,进程1应该从进程0接收值a。但我得到了一个错误: MPI_Recv中的致命错误:消息 截断,错误堆栈: MPI_Recv(187): MPI_Recv(buf=0xbfbef2a8,计数=1, MPI_双精度,src=0,tag=0,
如果我只使用这两个函数中的一个来运行程序,那么它们就可以正常工作。但这两种情况一起会导致上面的错误消息。我确实理解错误消息,但我不知道我能做些什么来防止它。有人能告诉我在哪里可以找到错误吗?因为第一个函数没有死锁,所以我假设第一个函数不会有未接收到的发送导致第二个函数出错。因此,这里是第一个函数:
MPI_Type_vector(m,1,m,MPI_DOUBLE, &column_mpi_t ) ;
MPI_Type_commit(&column_mpi_t) ;
T = (double**)malloc(m*sizeof(double*)) ;
T_data = (double*)malloc(m*m*sizeof(double)) ;
for(i=0;i<m;i++)
{
T[i] = &(T_data[i*m]) ;
}
if(my_rank==0)
{
s = &(T[0][0]) ;
for(i=1;i<p;i++)
{
MPI_Send(s,1,column_mpi_t,i,0,MPI_COMM_WORLD) ;
}
}
for(k=0;k<m-1;k++)
{
if(k%p != my_rank)
{
rbuffer = &(T[0][k]) ;
MPI_Recv(rbuffer,1,column_mpi_t,k%p,0,MPI_COMM_WORLD,&status) ;
}
for(j=k+1;j<n;j++)
{
if(j%p==my_rank)
{
if(j==k+1 && j!=n-1)
{
sbuffer = &(T[0][k+1]) ;
for(i=0;i<p;i++)
{
if(i!= (k+1)%p )
MPI_Send(sbuffer,1,column_mpi_t,i,0,MPI_COMM_WORLD) ;
}
}
}
}
}
MPI类型向量(m,1,m,MPI-DOUBLE,&column-MPI-t);
MPI\u类型\u提交(&column\u MPI\u t);
T=(双**)malloc(m*sizeof(双*);
T_data=(双*)malloc(m*m*sizeof(双));
对于(i=0;问题不是Recv vs Irecv,当然也不是死锁。问题是,从任务0接收单个MPI_双精度的秩2的Recv()与从大小为32字节的秩0发送的匹配(可能是4双精度?)。因此,消息被截断了。因此,我们需要查看更多代码以了解发生了什么。我知道。第二个函数仅包含send/recv操作。它肯定位于第一个函数中,因为(取决于用户输入)这正是通信阵列的大小。但这怎么可能?所有发送/接收操作都必须完成,否则会导致死锁。或者我完全错了吗?整个代码大约有600行。必须简化它…可能需要一段时间。这里的m
和p
是什么?现在,看起来像是ely表示发送和接收的数据不匹配。
MPI_Type_vector(m,1,m,MPI_DOUBLE, &column_mpi_t ) ;
MPI_Type_commit(&column_mpi_t) ;
T = (double**)malloc(m*sizeof(double*)) ;
T_data = (double*)malloc(m*m*sizeof(double)) ;
for(i=0;i<m;i++)
{
T[i] = &(T_data[i*m]) ;
}
if(my_rank==0)
{
s = &(T[0][0]) ;
for(i=1;i<p;i++)
{
MPI_Send(s,1,column_mpi_t,i,0,MPI_COMM_WORLD) ;
}
}
for(k=0;k<m-1;k++)
{
if(k%p != my_rank)
{
rbuffer = &(T[0][k]) ;
MPI_Recv(rbuffer,1,column_mpi_t,k%p,0,MPI_COMM_WORLD,&status) ;
}
for(j=k+1;j<n;j++)
{
if(j%p==my_rank)
{
if(j==k+1 && j!=n-1)
{
sbuffer = &(T[0][k+1]) ;
for(i=0;i<p;i++)
{
if(i!= (k+1)%p )
MPI_Send(sbuffer,1,column_mpi_t,i,0,MPI_COMM_WORLD) ;
}
}
}
}
}