2013-05-19 57 views
2

我有一个MPI_Isend和MPI_Recv程序。 假设我有2个处理器,它们都是这样的。MPI_Recv没有阻塞

  1. MPI_Isend
  2. MPI_RECV
  3. MPI_WAIT

我从这个期望正在发送两个处理器的数据不阻塞。然后等待数据来。然后像这样恢复。

  1. 0发送至1
  2. 1发送到0
  3. 0收到1
  4. 0-1

接收但我得到的是这个。

  1. 0发送至1
  2. 0 1接收(但1没发!)
  3. 1发送到0(现在发送)
  4. 0-1
接收

我以为MPI_Recv应该等到数据到来。什么可能造成这种情况?

回答

0

MPI_Recv确实阻止。

您只是看不到正确顺序的消息,因为标准输出会被缓冲,并且您不会一次看到所有输出。

+0

那么有没有办法看到无缓冲的输出? – eakyurek

+0

您可以尝试在每次打印后显式清除,但这可能无助于您的设置(以太网连接?)。 – ebo

+0

我不知道设置,它的学校比较。但我会尝试冲洗。无论如何感谢您的答案。 – eakyurek

0

你可以做什么以获得一种无缓冲的输出是执行输出并与交错的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%的概率,输出结果实际上就是你期望的结果,但有很好的概率。

无论如何,原则是总是在两个输出操作之间添加一个屏障并刷新缓冲区。