在从主站获得某些信号后调用MPI_RECV

时间:2014-03-14 11:38:44

标签: fortran mpi

我正在使用一个运行循环并累积一些平均值的代码。在特定的时刻,我想发送这个平均值并在所有奴隶上接收它。这应该只进行一次。乍一看,我教过这应该很容易做到。所以我使用内部变量(循环计数)来执行以下操作

! on the master
if( i == 55 ) 
do mt = 1, tasks
call MPI_SEND(A,size,MPI_DOUBLE_PRECISION,mt,5,MPI_COMM_WORLD,status,ierror)
end do

! on the slaves
if(i==55) then
call MPI_RECV(a,size,MPI_DOUBLE_PRECISION,0,5, MPI_COMM_WORLD,status,ierror)
endif

在调用MPI_RECV的行上运行此操作会导致分段错误。一般情况下,如果我连续通信,即在整个循环期间发送和接收数据,这将起作用。

最自然的事情是假设我用于触发通信的变量在主设备和从设备之间不同步。因此,我决定向从设备发送一个整数值,并将其用作调用MPI_RECV的信号。不幸的是,这导致了通信僵局。我做了类似的事情:

! on the master
sig = 0
if ( i == 55) then 
sig = 1
call MPI_SEND(sig,1,MPI_INTEGER,mt,10,MPI_COMM_WORLD,status,ierror)
endif

if(i==55) then
do mt =1,tasks
call MPI_SEND(A,size,MPI_DOUBLE_PRECISION,mt,5,MPI_COMM_WORLD,status,ierror)
end do
endif 

! on the slaves
call MPI_RECV(sig,1,MPI_INTEGER,mt,10,MPI_COM_WORLD,status,ierror)
if ( sig == 1) Call MPI_RECV(a,size,MPI_DOUBLE_PRECISION,0,5,   MPI_COMM_WORLD,status,ierror)

我无法弄清楚自己出了什么问题。

我很感激任何想法。

1 个答案:

答案 0 :(得分:1)

如果您尝试将数据从一个MPI流程发送到所有其他MPI流程,则使用MPI_SENDMPI_RECV的效率非常低。看看函数MPI_BCAST。这个函数的原型如下所示:

MPI_BCAST(BUFFER, COUNT, DATATYPE, ROOT, COMM, IERROR)
<type>    BUFFER(*)
INTEGER    COUNT, DATATYPE, ROOT, COMM, IERROR

在根进程(在您的情况下为主进程)中,您将要发送给的所有值作为BUFFER传递给其他所有人。我假设您只打算发送一个值作为均值,以便COUNT为1. DATATYPE是您想要的任何内容(MPI_DOUBLE_PRECISION),{{1} }是你的主等级(我假设0)而你的ROOTCOMM

使用MPI_BCAST(以及所谓的其他函数,如#34;集合函数&#34;)要记住的重要事项是每个进程必须一起进行此调用。在每个人都进入电话之前,没有人能够离开。因此,请确保每个人都在同一个迭代中。