MPI-MPI_Recv中的消息截断

MPI-MPI_Recv中的消息截断,c,mpi,parallel-processing,C,Mpi,Parallel Processing,我在一个与MPI开发相关的项目中遇到了问题。我正在使用MPI实现一个RNA解析算法,在该算法中,我根据一些解析规则和主节点的解析表(包含不同的状态和相关操作)开始解析输入字符串。在解析表中,每个状态都有多个操作,可以并行执行。因此,我必须在不同的过程中分配这些操作。为此,我使用单独的线程将当前状态和解析信息(当前解析堆栈)发送到节点,以接收来自其他节点的操作,而主线程正忙于基于接收到的操作进行解析。以下是发送方和接收方的代码片段: 发件人代码: StackFlush(&snd_stack

我在一个与MPI开发相关的项目中遇到了问题。我正在使用MPI实现一个RNA解析算法,在该算法中,我根据一些解析规则和主节点的解析表(包含不同的状态和相关操作)开始解析输入字符串。在解析表中,每个状态都有多个操作,可以并行执行。因此,我必须在不同的过程中分配这些操作。为此,我使用单独的线程将当前状态和解析信息(当前解析堆栈)发送到节点,以接收来自其他节点的操作,而主线程正忙于基于接收到的操作进行解析。以下是发送方和接收方的代码片段:

发件人代码:

StackFlush(&snd_stack);
StackPush(&snd_stack, state_index);
StackPush(&snd_stack, current_ch);
StackPush(&snd_stack, actions_to_skip);
elements_in_stack = stack.top + 1;
for(int a=elements_in_stack-1;a>=0;a--)
                StackPush(&snd_stack, stack.contents[a]);
StackPush(&snd_stack, elements_in_stack);
elements_in_stack = parse_tree.top + 1;
for(int a=elements_in_stack-1;a>=0;a--)
                StackPush(&snd_stack, parse_tree.contents[a]);
StackPush(&snd_stack, elements_in_stack);
elements_in_stack = snd_stack.top+1;
MPI_Send(&elements_in_stack, 1, MPI_INT, (myrank + actions_to_skip) % mysize, MSG_ACTION_STACK_COUNT, MPI_COMM_WORLD);
MPI_Send(&snd_stack.contents[0], elements_in_stack, MPI_CHAR, (myrank + actions_to_skip) % mysize, MSG_ACTION_STACK, MPI_COMM_WORLD);
接收器代码:

MPI_Recv(&e_count, 1, MPI_INT, MPI_ANY_SOURCE, MSG_ACTION_STACK_COUNT, MPI_COMM_WORLD, &status);
if(e_count == 0){
                break;
}
while((bt_stack.top + e_count) >= bt_stack.maxSize - 1){usleep(500);}
pthread_mutex_lock(&mutex_bt_stack); //using mutex for accessing shared data among threads
MPI_Recv(&bt_stack.contents[bt_stack.top + 1], e_count, MPI_CHAR, status.MPI_SOURCE, MSG_ACTION_STACK, MPI_COMM_WORLD, &status);
bt_stack.top += e_count;
pthread_mutex_unlock(&mutex_bt_stack);
对于通信量较少的小输入,程序运行良好,但随着我们增加输入大小,相应地增加了通信量,因此接收器在处理少量请求的同时接收到许多请求,然后程序崩溃,出现以下错误:

MPI_Recv中出现致命错误:消息被截断,错误堆栈: MPI_Recv(186)……:MPI_Recv(buf=0x5b8d7b1,计数=19,MPI_字符,src=3,标记=1,MPI_通信世界,状态=0x41732100)失败 MPIDI_CH3U_请求_解包_uebuf(625)L消息被截断;接收到21字节,但缓冲区大小为19 作业73 hpc081_56549中的等级0导致所有等级的集体中止等级0的退出状态:被信号9杀死


我也尝试过使用非阻塞MPI调用,但仍然出现类似的错误。

我不知道其余代码是什么样子,但这里有一个想法。由于存在一个
中断
,我假设接收方代码是循环或switch语句的一部分。如果是这种情况,则当元素计数变为0时,发送和接收之间存在不匹配:

  • 发送方将发送元素计数和长度为零的消息(MPI_发送(&snd_stack.contents…行)
  • 第二条消息将没有匹配的receive,因为接收方中断了循环
  • 然后,长度为零的消息将与其他消息匹配,这可能会导致您看到的错误

  • 该错误表示
    MPI_Recv
    接收的数据比预期的多(21个字符而不是19个字符)。是否有多个线程运行接收器代码?如果是,则可能是有一个线程接收另一个线程的数据,因此
    e_计数不同。