我想问一下以下问题的答案
对于此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但我不知道我是否正确
答案 0 :(得分:1)
你宁愿使用MPI_Sendrecv()
这样可以避免你不得不处理奇数和偶数等级。
请记住,一般来说,MPI_Send()
在发送小邮件时会立即返回,而如果邮件很大,它会一直阻塞,直到匹配MPI_Recv()
为止。正确的MPI程序应该始终阻止MPI_Send()
,直到匹配的MPI_Recv()
被发布。