我有一个MPI_Isend和MPI_Recv程序。 假设我有2个处理器,它们都是这样的。MPI_Recv没有阻塞
- MPI_Isend
- MPI_RECV
- MPI_WAIT
我从这个期望正在发送两个处理器的数据不阻塞。然后等待数据来。然后像这样恢复。
- 0发送至1
- 1发送到0
- 0收到1
- 0-1
接收但我得到的是这个。
- 0发送至1
- 0 1接收(但1没发!)
- 1发送到0(现在发送)
- 0-1
我以为MPI_Recv应该等到数据到来。什么可能造成这种情况?
我有一个MPI_Isend和MPI_Recv程序。 假设我有2个处理器,它们都是这样的。MPI_Recv没有阻塞
我从这个期望正在发送两个处理器的数据不阻塞。然后等待数据来。然后像这样恢复。
接收但我得到的是这个。
我以为MPI_Recv应该等到数据到来。什么可能造成这种情况?
MPI_Recv
确实阻止。
您只是看不到正确顺序的消息,因为标准输出会被缓冲,并且您不会一次看到所有输出。
你可以做什么以获得一种无缓冲的输出是执行输出并与交错的MPI_Barrier
齐平。只要你有P
过程,当前处理的等级被存储在变量rank
和正在使用的通信comm
,可以这样做:
for (int p = 0; p < P; ++p)
{
// Only one process writes at this time
// std::endl flushes the buffer
if (p == rank)
std::cout << "Message from process " << rank << std::endl;
// Block the other processes until the one that is writing
// flushes the buffer
MPI_Barrier(comm);
}
当然这仅仅是一个C++例子。您可能需要将它翻译成Fortran的C语言。还要注意,这段代码仍然不能保证100%的概率,输出结果实际上就是你期望的结果,但有很好的概率。
无论如何,原则是总是在两个输出操作之间添加一个屏障并刷新缓冲区。
那么有没有办法看到无缓冲的输出? – eakyurek
您可以尝试在每次打印后显式清除,但这可能无助于您的设置(以太网连接?)。 – ebo
我不知道设置,它的学校比较。但我会尝试冲洗。无论如何感谢您的答案。 – eakyurek