Visual Studio 2005 + Intel Visual Fortran 9.1 install Intel Visual Fortran 9.1 intel Visual Fortran Compiler 9.1 만설치해서 DOS 모드에서실행할수있지만, Visual Studio 2005 의 IDE 를사용하기위해서는 Visual Studio 2005 를먼저설치후 Integration 파일을설치해야합니다. 또한, MPICH2 파일을받을때처럼자신의 CPU 에맞게설치합니다. 설치순서는 compiler, debuger, visual studio integration, IMSL library 순서로깔립니다. 물론, 정품라이센스가있어야합니다. 학생신분이면비교적저렴한가격에라이센스를얻을수있습니다. 또한, 학교나연구실소속이면자신의학교에라이센스가있는지알아보면좋다.
환경변수를자동으로업데이트를꼭체크합니다. 이것을꺼두면수동으로환경변수설정을해주어야한다. 모두설치되었으면, 일반컴파일, OpenMP compile, MPI compile, IMSL library 컴파일순으로환경을설정하고테스트할것입니다. 최초설치시환경설정을실행해윈도우즈시스템에환경변수를저장시킵니다. Intel Visual Fortran 9.1 을 DOS 명령에서직접실행하는명령은다음과같습니다. ifort -o 타겟파일명소스코드 2
integration for visual Studio 를설치후 DOS 모드에서 Intel Visual Fortran 컴파일명령을실행하였을경우다음과같은에러메시지를출력하는경우가있습니다. Visual Studio 2005 와 2003 이각각 mspdb80.dll, mspdb71.dll 을찾고있습니다. 원인은 ifort 가 Visual Studio 모드로작동하게되었지만 DOS 모드에서실행되기때문입니다. 이를해결하기위해서는 mspdb80.dll 의위치를 Path 디렉토리를지정해줘야합니다. Visual Studio 2005 C: Program Files Microsoft Visual Studio 8 Common7 IDE Visual Studio 2003 C: Program Files Microsoft Visual Studio.NET 2003 Common7 IDE 이것은 integration 을설치하면서 ifort 가 windows 용으로작동되게설정되었기때문에이후 ifort 는 Visual 3
Studio 에서실행해야하기때문입니다. integration 을설치하지않았다면 DOS 창에서직접실행할수있습니다. 하지만 Visual Studio 에서는사용할수없게됩니다. Visual Studio 의프로젝트에서 Visual Fortran 을선택한다. 빈프로젝트를하나만든다. 4
파일을하나생성하고코드를입력한다. PROGRAM MAIN PRINT*, 'hello world! with fortran' END 정상실행되는것을확인할수있다. 5
이제 OpenMP 프로그래밍을해보자. PROGRAM hello IMPLICIT NONE INTEGER inode, nnode INTEGER omp_get_thread_num, omp_get_num_threads nnode=4 CALL omp_set_num_threads(nnode)!$omp parallel default(private) shared(nnode) inode=omp_get_thread_num() print*,'hello from',inode, 'of total threads ',nnode!$omp end parallel END PROGRAM hello 6
일단컴파일해보면기본적에러가뜨는것을확인할수있다. Intel Visual Fortran 은 openmp 컴파일시 /Qopenmp 명령을넣어주어야한다. 이제정상컴파일되고실행하면여러개의 threads 가생성됨을확인할수있다. 7
8
MPI compile Visual Studio 2005 + IVF 9.1 9
간단한 fortran MPI 코드를입력한다. hello.f program main include 'mpif.h' integer n, myid, numprocs ierr,rc print*,'hello fortran' call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) print *, "Process ", myid, " of ", numprocs, " is alive" call MPI_FINALIZE(ierr) stop end 컴파일하면에러가발생하는것을확인할수있다. 이제환경변수를설정해보자. 도구 > 환경설정 > Intel(R) Fortran Tools > Properties > Intel(R) Fortran 10
C: Program Files MPICH2 include C: Program Files MPICH2 lib MPICH2 의 library 와 include 디렉토리를설정한다. 프로젝트에 MPICH2 관련 fmpich2.lib 파일을추가한다. Linker > Input > Additional Dependencies 이제에러없이컴파일이된다. 이제 mpiexec -n 2 fmpi.exe 를통해병렬실행시킬수이다. 11
12
MPI+OpenMP Hybrid compile MPI 와 OpenMP 의 Hybrid Compile 은 SMP cluster 환경에적당하다. 이를위해서는 MPICH2 library, MPICH2 include 디렉토리설정 ( 이미되어있음 ) 하고 Project 에선 MPICH2 와 openmp 설정을동시에해주어야한다. 즉 Fortran > Command Line 에 /Qopenmp 를등록한후 Input > Additional Dependencies 에 fmpich2.lib 를등록하면된다. 13
이후새파일을만든다. 코드는다음과같다. 이때, mpif.h 를넣었고, mpi 코드와 openmp 코드가동시에있는것을확인할수있다. program main IMPLICIT NONE include 'mpif.h' INTEGER myrank, numprocs, ierr INTEGER inode, nnode INTEGER omp_get_thread_num, omp_get_num_threads print*,'hello fortran' call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, myrank, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) if (myrank == 0 ) then print *, "Process ", numprocs, " is alive" endif nnode=4 CALL omp_set_num_threads(nnode)!$omp parallel default(private) shared(nnode,myrank,numprocs) inode=omp_get_thread_num() if (myrank==0.and. inode==0) then print*, "threads ", nnode, " is alive" endif print*,'hello from',inode, 'of ',myrank!$omp end parallel call MPI_FINALIZE(ierr) stop end 14
15
process 4 개와 threads 4 개가실행된것을확인할굿있다. process 2,1 의 thread 0 threads 가 process 0 의 thread0 보다먼저실행된것도확인할수있다. 16