【问题标题】:MPI_Send does not work with higher buffer size?MPI_Send 不适用于更高的缓冲区大小?
【发布时间】:2021-10-22 22:07:38
【问题描述】:

当 MPI_Send 缓冲区大小为 100 时,程序可以工作,但当它为 1000 或更大时,它会卡住。为什么?

if(id == 0){
    rgb_image = stbi_load(argv[1], &width, &height, &bpp, CHANNEL_NUM);

    for(int i = 0; i < size -1; i++)
        MPI_Send(rgb_image,1000,MPI_UINT8_T,i,0,MPI_COMM_WORLD);
        
}
uint8_t *part = (uint8_t*) malloc(sizeof(uint8_t)*(1000));

if(id != size-1 && size > 1)
    MPI_Recv(part,1000,MPI_UINT8_T,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE); 

【问题讨论】:

  • 很难说,但你可以尝试不发送/接收到进程 0 吗?

标签: parallel-processing operating-system mpi


【解决方案1】:

此程序无效 w.r.t。 MPI 标准,因为没有匹配的接收(在等级 0 上)

MPI_Send(..., dest=0, ...)

MPI_Send() 被允许阻塞,直到发布匹配的接收(这通常发生在消息“大”时)......并且永远不会发布所需的匹配接收。

典型的解决方法是在MPI_Send() 之前(以及之后的MPI_Wait())在等级0 上发出MPI_Irecv(...,src = 0,...),或者处理0 -> 0 与MPI_Sendrecv() 的通信。

话虽如此,创建一个通信器可能会更有效,将所有等级减去最后一个,并在此通信器中使用MPI_Bcast()

【讨论】:

    【解决方案2】:

    如果一个程序适用于小缓冲区但不适用于大缓冲区,您可能会遇到“急切发送”。通常,发送和接收事务涉及发送方和接收方来回交谈,以确认数据已通过。这是开销,因此对于小消息,许多 MPI 只会发送数据,无需确认。然后数据进入接收器上的某个秘密缓冲区。

    但这意味着如果程序不正确,您的程序将“成功”。就像这里的情况一样。请参阅@Giles 答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-28
      • 2014-06-26
      • 2013-04-12
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多