2014-02-18 70 views
4

鑑於主進程A產生一組工作進程B,每個工作進程都產生了自己的唯一工作進程C,如何在C到A之間打開一個通信器?在mpi4py中產生進程的相互通信?

我試圖創建一個循環,使用mpi4py之間的幾段代碼,這些代碼是彼此分開編寫的,同時儘量減少對代碼的修改。因此,MPI代碼的一般框架如下:

  1. Master A(一個進程)產生8個進程B的工作進程,並將一個數組分散到他們。
  2. 每個B進程都會產生一個工作者C,對該數組進行一些操作並將其廣播給他們自己的工作者。
  3. 每個工作人員C以自己的方式操作數組,然後(理想情況下)主人A從每個C的數組中收集數組。

我知道這將涉及打開現有進程之間的互通器,可能使用組通信。什麼是實現這一目標的最佳方式?

謝謝。

回答

2

有兩種方法可以做到這一點從我的頭頂。我不會說一個比另一個更好或更差,儘管第一個可能更好地匹配你的用例。

  1. 使用名稱出版系統(或一些其他方法)以打開使用MPI_COMM_CONNECTMPI_COMM_ACCEPT到A連接到任何人需要與其通信的連接。這可能會導致A的一些通信器取決於您創建的進程數量,因此這可能會導致一些不好的事情,但這可能是最直接的方式來完成這項工作。您只需要讓A對MPI_COMM_ACCEPT進行一堆調用(遺憾的是,此調用沒有非阻塞版本)。

  2. 不斷合併您正在創建的互動通信器與MPI_COMM_SPAWN,創建一個包含所有流程的巨大通信器。然後你可以像往常一樣發送消息(或者創建新的子通信器給A和所有的spawnees,這樣你就可以在他們之間進行集體操作)。

+0

謝謝,韋斯利!選項1更符合我試圖實現的目標。在mpi4py中使用MPI_COMM_CONNECT和ACCEPT的語法是什麼?是否像每個worker都調用MPI.MPI_COMM_CONNECT()一樣簡單,然後master有多少行「comm_n = MPI.MPI_COMM_ACCEPT」,就像工作進程一樣? – astromaddie

+0

我不知道語法。我從不使用MPI4PY。但我確定在那裏有文檔。 –