在上一篇中我們介紹了 mpi4py 中的掃描操作方法芍锦,下面我們將介紹柵障同步操作。
此為實(shí)施在通信子上的同步操作飞盆,會(huì)阻塞所有的進(jìn)程直到所有的進(jìn)程都調(diào)用此操作娄琉。如果是組間通信子,則會(huì)在組間通信子上的所有進(jìn)程之間執(zhí)行吓歇,但也允許當(dāng)所有遠(yuǎn)程組中的進(jìn)程進(jìn)入 barrier 之后柑蛇,所有本地組中的進(jìn)程已經(jīng)離開俺祠。
方法接口
mpi4py 中的柵障同步操作的方法(MPI.Comm 類的方法)接口為:
barrier(self)
Barrier(self)
barrier 和 Barrier 實(shí)施的操作相同,可以任意使用其中的一個(gè)。
注意:前面介紹的很多阻塞式的集合通信(如 Bcast坝咐,Scatter留储,Gather卜录,Allgather 等)都隱式地包含著同步操作工育,因此并不需要顯式地調(diào)用 Barrier 進(jìn)行同步。但是在某些情況下鹃愤,顯式的同步操作對(duì)應(yīng)保證程序的順利執(zhí)行卻是必須的簇搅,如我們前面介紹的點(diǎn)到點(diǎn)就緒通信模式,要求僅當(dāng)對(duì)方的接收操作啟動(dòng)并準(zhǔn)備就緒時(shí)才可發(fā)送數(shù)據(jù)软吐,否則可能導(dǎo)致錯(cuò)誤或無法預(yù)知的結(jié)果瘩将,一種保證發(fā)送操作晚于對(duì)方的接收操作的方式就是使用這里的柵障同步,讓接收操作在 Barrier 之前凹耙,而讓就緒的發(fā)送操作在 Barrier 之后姿现。另一個(gè)常見的例子是,由一個(gè)進(jìn)程創(chuàng)建一個(gè)目錄或者文件肖抱,然后其它的進(jìn)程向其中寫入數(shù)據(jù)备典,此時(shí)必須保證創(chuàng)建目錄/文件的操作在所有其它進(jìn)程的寫入之前,這可以由它們之間的 Barrier 來實(shí)現(xiàn)意述。
例程
下面給出柵障同步操作的使用例程提佣。
# barrier.py
"""
Demonstrates the usage of barrier, Barrier.
Run this with 2 processes like:
$ mpiexec -n 2 python barrier.py
"""
import os
import shutil
import numpy as np
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
# ---------------------------------------------------------------------
# example 1
count = 10
send_buf = np.arange(count, dtype='i')
recv_buf = np.empty(count, dtype='i')
if rank == 0:
comm.Rsend(send_buf, dest=1, tag=11)
comm.Barrier() # synchronization here
print 'process %d sends %s' % (rank, send_buf)
elif rank == 1:
comm.Barrier() # synchronization here
comm.Recv(recv_buf, source=0, tag=11)
print 'process %d receives %s' % (rank, recv_buf)
# ---------------------------------------------------------------------
# example 2
temp_dir = './temp_dir'
temp_file = 'temp_file%d.txt' % rank
# rank 0 crates the directory first if necessary
if not os.path.isdir(temp_dir):
if rank == 0:
os.mkdir(temp_dir)
print 'rank %d creates dir: %s' % (rank, temp_dir)
# synchronization before writing to temp_dir
comm.Barrier()
# each process creates its own file
open(temp_dir + '/' + temp_file, 'w').close()
print 'rank %d creates file: %s' % (rank, temp_dir + '/' + temp_file)
# synchronization before remove temp_dir
comm.Barrier()
# now remove temp_dir by rank 0
if rank == 0:
shutil.rmtree(temp_dir)
print 'rank %d removes dir: %s' % (rank, temp_dir)
運(yùn)行結(jié)果如下:
$ mpiexec -n 2 python barrier.py
process 0 sends [0 1 2 3 4 5 6 7 8 9]
process 1 receives [0 1 2 3 4 5 6 7 8 9]
rank 0 creates dir: ./temp_dir
rank 1 creates file: ./temp_dir/temp_file1.txt
rank 0 creates file: ./temp_dir/temp_file0.txt
rank 0 removes dir: ./temp_dir
以上我們介紹了 mpi4py 中的柵障同步操作方法吮蛹,至此我們介紹了 mpi4py 中的各種集合通信,下面我們將進(jìn)入到對(duì)數(shù)據(jù)類型的介紹拌屏,在下一篇中我們首先介紹數(shù)據(jù)類型圖的概念潮针。