2013-08-20 5 views
1

MPI에서 쓰고 싶은 시뮬레이션이 있으며 온라인으로 읽었습니다. 내 시뮬레이션에서는 필자가 시뮬레이션 중에 수정해야하기 때문에 필자가 입자 배열에 대한 포인터로 인수를 전달하는 함수가 있습니다. 이제는 MPI가 어떻게 작동하는지 완전히 이해하지 못하여이 작은 프로그램을 작성했습니다. mpirun -np 2 ./program 내가 출력 아래와 같이 가지고 : 나는 그것을 실행함수 및 함수 인수 내에서 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; 
} 

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

이합니까 각 프로세스 변수 ai의 복사본을 가지고 의미하며, 내가 MPI_Finalize()function()이라고 부른 후에도 MPI는 어떻게 작동합니까?

답변

4

이것은 MPI 초보자들 사이에서 상당히 일반적인 오해 인 것 같습니다.

MPI_Init()MPI_Finalize() do 은 병렬 처리의 시작과 끝을 표시합니다. 다른 MPI 호출이 허용되는 곳의 시작과 끝을 표시합니다. MPI는 전체 프로그램의 여러 개별 인스턴스를 실행하며 각 인스턴스마다 별도의 메모리 공간이 있습니다. 그렇습니다. 각 프로세스에는 ai이라는 자체 복사본이 있습니다.

+0

각 프로세스가 자체 복사본을 갖도록 내가했던 것처럼 변수를 정의하는 것이 "현명한"방법입니까? –

+2

사실 그것이 유일한 방법입니다. MPI 호출을 사용하여 값을 전달함으로써 명시 적으로 공유하지 않고 "공유 된"변수에 대한 개념은 없습니다. –