2013-08-20 49 views
1

我有,我想在MPI寫一個仿真和我已經開始在網上讀到它。在我的模擬中,我有一個函數,我將參數作爲指針傳遞給粒子數組,因爲我需要在模擬過程中對其進行修改。現在,我不完全理解MPI是如何工作的,所以我寫了這個小程序。MPI調用內部函數和函數參數

#include <stdio.h> 
#include "mpi.h" 
void function(int* a) 
{ 
    int size, rank; 
    MPI_Init(NULL,NULL); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    if(rank!=0) 
    { 
     printf("%d ", *a); 
     printf("process: %d", rank); 
    } 
    else 
    { 
     (*a)++; 
     printf("%d ", *a); 
     printf("process: %d", rank); 
    } 
    printf("\n"); 
    MPI_Finalize(); 
} 

int main (void) { 
    int a,i; 
    i=0; 
    a=5; 
    function(&a); 
    printf("%d %d\n",a,(i++)); 
    printf("%d\n", i); 
    return 0; 
} 

當我運行它:mpirun -np 2 ./program和我得到的輸出象下面這樣:

6 process: 0 
5 process: 1 
5 0 
6 0 
1 
1 

這是否意味着每個進程都有自己的變量ai副本,在function()內撥打MPI_Finalize()之後,MPI如何仍在運行。

回答

4

這似乎是MPI初學者中一個相當普遍的誤解。

MPI_Init()MPI_Finalize() do 不是標記並行處理的開始和結束。它們標誌着允許其他MPI呼叫的開始和結束。 MPI運行整個程序的多個獨立實例,每個實例都有其獨立的內存空間。所以是的,每個流程都有自己的副本ai

+0

它是一個「聰明」的做法,像我一樣,使每個進程都有它自己的拷貝來定義一個變量? –

+2

這實際上是唯一的方法。沒有通過傳遞MPI調用周圍的值來顯式共享「共享」變量的概念。 –