2013-12-17 23 views
0

當我運行「打開MPI」程序時,它通常按隨機順序分配排名我想知道 有沒有辦法總是按順序分配排名?打開MPI排名不是爲了

所以不是這個

Hello, World. I am 2 of 3 
Hello, World. I am 0 of 3 
Hello, World. I am 1 of 3 

我可以得到這個

Hello, World. I am 0 of 3 
Hello, World. I am 1 of 3 
Hello, World. I am 2 of 3 

編輯

這裏

PROGRAM hello 
INCLUDE 'mpif.h' 
INTEGER*4 :: numprocs, rank, ierr 
CALL MPI_INIT(ierr) 
CALL MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr) 
CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) 
write(*,*) 'Hello World. I am', rank, 'of', numprocs 
CALL MPI_FINALIZE(ierr) 
    END PROGRAM hello 

我已經測試了i5處理器(代碼4個線程),當我運行

mpirun -np 4 myprog 

它可以作爲我希望它,爲了0-3印刷行列,否則(像3如上所示),它只是不會做(測試它象100時)

+0

隊列到主機/內核的映射在每個MPI實現中都是確定性的。每個職位的確切進展在工作過程中(很大程度上)是獨立的。打印的「亂序」性質說明每個進程都已寫入,並且通過stdout將寫入發送回mpirun命令,以便以不同的順序輸出到終端。這是MPI計劃的基本性質。充其量,級別之間存在「鬆散」的協調。並行編程中的基本問題之一是所有級別的同步。 –

+0

@StanGraves非常感謝 –

回答

2

順序在大多數MPI實現中,所分配的級別絕不是隨機的,並且通常存在精確控制它的機制。什麼是隨機的,通過IO重定向機制,不同級別的輸出到達MPI啓動器(mpirun,mpiexec等)的順序。由於通常涉及的緩衝,人們無法確定如果例如等級0在等級1之前輸出一些文本,則等級0的輸出必然在等級1的輸出之前到達。保證文本輸出的排序的唯一便攜式方式是讓所有等級通過單個等級來傳遞他們的消息IO。

通過一些實施方式有可能像做線性令牌傳遞或障礙的順序,如:

int rank, size; 

MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
MPI_Comm_size(MPI_COMM_WORLD, &size); 

for (int i = 0; i < size; i++) 
{ 
    if (i == rank) 
     printf("Hello world! I am %d of %d\n", rank, size); 
    MPI_Barrier(MPI_COMM_WORLD); 
} 

這樣的代碼背後的基本原理是MPI_Barrier可能可能進步掛起的通信操作完成之前,包括那些帶有重定向標準輸出的。仍然不能保證printf()的輸出立即顯示在mpirun/mpiexec的控制檯輸出中。

+0

如果我有一個從1到3560的循環,那麼我將循環中的工作分成5個處理器,所以每個處理器都會循環執行730次迭代。現在隊伍不按順序排列(我已經嘗試過),排名0進行迭代[731 - 1461],但我希望它做迭代[1 - 730] –

+1

您的問題沒有意義。只需讓你的應用程序做一次檢查,'if(rank == 0){do 1 - 730}'。 –

3

許多mpi實現將讓您在輸出前加上該進程的排名。那麼你可以在事實之後對其進行分類。在MPICH中,這是--prepend-rank-l。在OpenMPI中,它是--tag-output