병렬기법
홈 > CUDA > 병렬기법 > MPI 병렬화

MPI 병렬화

MPI를 사용하기 위해서는 OpenMPI 혹은 MPICH를 이용하면 됩니다. MPI는 MultiGPU 환경에서 CUDA와 혼용하여 사용가능합니다.  윈도우즈에서는 Yum Install 등의 방식으로 쉽게 설치가능하고, 수동으로 설치해도 됩니다. fortran, C, C++을 지원합니다.  최근에는 python 등을 이용한 MPI 기법도 연구되고 있습니다. 윈도우즈 환경에서는 MPICH를 설치하면 가상의 노드에서 MPI 병렬코딩의 결과를 확인해 볼 수 있습니다.

 

다음의 링크를 확인하시면 MPI관련 IBM Redbook을 확인해보실 수 있습니다.

http://www.redbooks.ibm.com/abstracts/sg245380.html 

 

다음은 MPI를 이용하여 PI를 계산하는 예제입니다.

 

#include

#include

#include "mpi.h"

 

double f(a)

double a;

{

    return (4.0 / (1.0 + a*a));

}

 

int main(argc,argv)

int argc;

char *argv[];

{

    int done = 0, n, myid, numprocs, i;

    double PI25DT = 3.141592653589793238462643;

    double mypi, pi, h, sum, x;

    double startwtime, endwtime;

    int  namelen;

    char processor_name[MPI_MAX_PROCESSOR_NAME];

 

    MPI_Init(&argc,&argv);

    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

    MPI_Comm_rank(MPI_COMM_WORLD,&myid);

    MPI_Get_processor_name(processor_name,&namelen);

 

    fprintf(stderr,"Process# %d with name %s on %d processors\n",

            myid, processor_name, numprocs);

 

        if (myid == 0)

        {

            n = 1000000;

 

            startwtime = MPI_Wtime();

        }

        MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

        if (n == 0)

            done = 1;

        else

        {

            h   = 1.0 / (double) n;

            sum = 0.0;

            for (i = myid + 1; i <= n; i += numprocs)

            {

                x = h * ((double)i - 0.5);

                sum += f(x);

            }

            mypi = h * sum;

 

            MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

 

            if (myid == 0)

            {

                printf("pi is approximately %.16f, Relative Error is .8e\n",

                       pi, (double)100 * (pi - PI25DT)/PI25DT);

               endwtime = MPI_Wtime();

               printf("wall clock time = %f\n",

                      endwtime-startwtime);        

            }

        }

    MPI_Finalize();

 

    return 0;

}

 

 MPI파트의 대부분은 통신을 위한 프로세서/노드 설정과 통신 파트로 되어있습니다.  MPI_Bcast, MPI_Send, MPI_Get, MPI_Reduce 등의 명령을 통해 통신을 하게 됩니다. 실제로 MPI 병렬 프로그래밍시 어떻게 데이터를 분할하고, 코어간 데이터를 교환할 것인지에 대한 고민이 필요합니다.