2017-10-15 180 views
0

請參考下面的收集代碼:如何打印「之前收集」之前「後集」在MPI蟒蛇mpi4py

from mpi4py import MPI 

comm = MPI.COMM.WORLD 
size = comm.Get_size() 
rank = comm.Get_rank() 
stat = MPI.Status() 

message = (rank)**2 
print "Before Gather ",rank, message 

message = comm.gather(message, root=0) 

if rank == 0: 
     print "After Gather ",rank,message 

我如何使用comm.barrier()功能,保證的「之後」步驟總是在「之前」步驟之後出現?

如果在條件之前放置comm.barrier(),結果將以任意順序排列。

我試過沖洗,它不起作用。

我應該使用Gather指定發送緩衝區和接收緩衝區嗎?

或者,我應該嘗試將所有內容收集到一個進程中,然後分散,然後再次收集?

任何建議是不是歡迎和讚賞。

回答

0

基本上,你不能。

stdout從每個MPI任務聚集然後mpirun印刷,並沒有任何機制強制執行任何種類的全球秩序。

的唯一保證就是Before Gather 0 ...將總是先After Gather 0 ...

+0

打印是的,這就是我想要的,以「後集」之前打印「前集」。事實上,結果總是以隨機順序出現,儘管我在收集之前放置了comm.barrier()。即使sys.stdout.flush()在這裏也不起作用。我想知道打印不會產生stdout ......或者可能。非常感謝你的回覆。 – Jeslll07

+0

好吧,就像我說的那樣,不能保證'n> 0''在Gater n ...之前''會在輸出中的'收集0之前'結束。如果你確實需要這種行爲,你不能依賴'stdout'。如果這只是爲了調試的目的,並且你希望某些工作在大多數時間*,你可以在MPI_Gather()之前或之後足夠長的時間flush()'**和**'sleep()' –

+0

好吧,我現在明白了。謝謝,吉爾斯。 – Jeslll07