2016-07-30 336 views
0

我試圖重現在此post中提出的問題。以下是我的代碼。根據答案,因爲每個進程都是獨立運行的,所以global_variable應該在進程1中爲0.然而,進程1也會打印1000.所以在我的理解中,進程是在MPI_Init中產生的,所以如果全局變量是在MPI_Init之前定義的,創建的流程將獲得相同的價值,對吧?我誤解了這篇文章嗎?MPI及其全局變量

#include <stdio.h> 
#include <mpi.h> 

static int global_variable; 

main(int argc, char **argv) 
{ 
    int ierr, num_procs, my_id; 

    global_variable = 1000; 

    ierr = MPI_Init(&argc, &argv); 

    /* find out MY process ID, and how many processes were started. */ 

    ierr = MPI_Comm_rank(MPI_COMM_WORLD, &my_id); 
    ierr = MPI_Comm_size(MPI_COMM_WORLD, &num_procs); 

    if(my_id == 0) { 
     printf("%d\n", global_variable); 
    } 
    else if(my_id == 1) { 
     printf("%d\n", global_variable); 
    } 

    ierr = MPI_Finalize(); 
} 
+0

想知道,如果你不使用它們,你爲什麼要存儲所有'ierr'返回值? – Kusalananda

+1

@Kusalananda在評論中有一點。而且,與文件I/O無關的MPI調用的默認錯誤處理程序會終止整個作業,因此這些'MPI _...'例程將返回MPI_SUCCESS或根本不返回。除非'MPI_ERRORS_RETURN'錯誤處理程序被**明確**設置,即。 –

回答

1

這就是獨立的手段:

#include <stdio.h> 
#include <mpi.h> 

static int global_variable; 

int main(int argc, char **argv) 
{ 
    int ierr, num_procs, my_id; 
    ierr = MPI_Init(&argc, &argv); 

    ierr = MPI_Comm_rank(MPI_COMM_WORLD, &my_id); 
    ierr = MPI_Comm_size(MPI_COMM_WORLD, &num_procs); 

    if (my_id == 0) { 
     global_variable = 1000; 
    } 
    MPI_Barrier(MPI_COMM_WORLD); 
    printf("%d\n", global_variable); 

    ierr = MPI_Finalize(); 
} 

在這裏,只處理0變爲global_variable。在你的例子中,global_variable = 1000;行不是特定於任何一個進程,所有進程都會執行它。

+0

感謝您的回覆。我之前有過誤會。我認爲新創建的進程將在MPI_Init之後執行該程序。但是,根據你的回答,「所有進程將執行global_variable = 1000」,這意味着每個進程從main()的開頭運行程序,對嗎?非常感謝。 – HuangJie

+2

@黃傑,幾乎所有的生產級MPI實現對每個MPI等級使用不同的OS進程,這意味着等級從ma​​in()開始執行程序代碼。儘管如此,MPI標準並沒有規定這種行爲,並且使用線程的實現取而代之的是存在共享全局變量等所有後果。 –