以环形形式在MPI中发送和接收消息的最佳案例

时间:2017-06-03 00:04:52

标签: parallel-processing mpi shared-memory distributed-computing

我想问一下以下问题的答案

对于此MPI程序段,通过让每个进程发送一个来执行通信 值n,以环形模式显示在它旁边的过程中。也就是说,如果有N个进程,则进程0 将值发送到1,进程1将发送到2,依此类推。最后一个进程将发送其值 这些消息将同时发生一次。

  if (my_rank%2 == 0) { MPI_SEND(msg,size,MPI_INT,(my_rank+1)%comm_sz,0,comm);

    MPI_RECV(new_msg,size,MPI_INT,(my_rank+comm_sz-1)%comm_sz,0,comm,MPI_STATUS_IGNORE); } 

else  {

    MPI_RECV(new_msg,size,MPI_INT,(my_rank+comm_sz-1)%comm_sz,0,comm,MPI_STATUS_IGNORE);

    MPI_SEND(msg,size,MPI_INT,(my_rank+1)%comm_sz,0,comm); }

假设发送消息的时间是一个时间单位,以及接收消息的时间 消息是一个时间单位。仅包括消息传递的成本(忽略任何启动 成本等)并在最好的情况下计算代码需要多少时间单位 去完成。您应该陈述您明确做出的任何假设。

我认为它会是4,在最好的情况下,如果所有偶数同时发送n并且同时收到的所有赔率都是2而奇数发送相同则另外2所以它会是4但我不知道我是否正确

1 个答案:

答案 0 :(得分:1)

你宁愿使用MPI_Sendrecv() 这样可以避免你不得不处理奇数和偶数等级。

请记住,一般来说,MPI_Send()在发送小邮件时会立即返回,而如果邮件很大,它会一直阻塞,直到匹配MPI_Recv()为止。正确的MPI程序应该始终阻止MPI_Send(),直到匹配的MPI_Recv()被发布。