gpt4 book ai didi

c - 我不明白简单得可笑的 MPI_Send/Recv 问题

转载 作者:行者123 更新时间:2023-11-30 18:06:31 27 4
gpt4 key购买 nike

我有两个具有不同算法的函数。在第一个函数中,我实现了非阻塞通信(MPI_Irecv、MPI_Isend),并且程序运行没有任何错误。即使我将非阻塞通信更改为阻塞通信,一切都很好。没有僵局。但是,如果我像这样使用基本的阻塞通信来实现第二个函数(将算法简化为问题):

 if( my_rank == 0)
{
a = 3 ;
MPI_Send(&a,1,MPI_DOUBLE,1,0,MPI_COMM_WORLD) ;
}

else if( my_rank == 1 )
{
MPI_Recv(&a,1,MPI_DOUBLE,0,0,MPI_COMM_WORLD, &status ) ;
}

因此,进程 1 应该从进程 0 接收值 a。但我收到此错误:

Fatal error in MPI_Recv: Message truncated, error stack: MPI_Recv(187).......................: MPI_Recv(buf=0xbfbef2a8, count=1, MPI_DOUBLE, src=0, tag=0, MPI_COMM_WORLD, status=0xbfbef294) failed MPIDI_CH3U_Request_unpack_uebuf(600): Message truncated; 32 bytes received but buffer size is 8 rank 2 in job 39 Blabla caused collective abort of all ranks exit status of rank 2: killed by signal 9

如果我只使用这两个函数之一运行程序,那么它们就会按预期工作。但两者一起会导致上述错误消息。我确实理解该错误消息,但我不知道如何防止它发生。有人可以向我解释一下我必须在哪里寻找错误吗?由于我在第一个函数中没有遇到死锁,因此我假设第一个函数中不会有未收到的发送,从而导致第二个函数中出现错误。

最佳答案

所以,这是第一个函数:

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_Irecv/send 中的 MPI 数据类型更改为 MPI_DOUBLE,这将适合第二个函数的 recv/send 的数据类型..因此不会出现截断错误。所以,没有解决方案......

关于c - 我不明白简单得可笑的 MPI_Send/Recv 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5463686/

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