[Directive] parallel

 OpenMP는 공유메모리 병렬라이브러리로서 현재 표준병렬 라이브러리로서 자리매김 하고 있습니다. OpenMP의 구문은 Directive와 Clause로 구성되어 있습니다. 오늘은 Directive중에서 가장 많이 쓰이는 parallel Directive를 살표보고자 합니다. parallel Directive는 쓰레딩을 실행시키는 명령어로서 보통 병렬프로그래밍 시작할 때, 처음 부분에 쓰입니다. Fortran90으로는 다음과 같이 쓰여집니다.

[Fortran90 Code]
    program Console
    implicit none
    !Start OpenMP threading
    !$omp parallel
    write(*, "(A11)") "Hello World"
    !$omp end parallel
    end program Console

[Output]
Hello World
Hello World
Hello World
Hello World

제가 사용하고 있는 컴퓨터에서는 4개의 코어가 있으므로, 4개의 결과가 나옵니다. parallel Directive에 Clause를 추가하여서 상세 옵션들을 조절 할 수 있습니다. 예를 들어  num_threads를 이용하여서, 다음과 같이 쓰레딩의 횟수를 조절 해 줄 수 있습니다.

[Fortran90 Code]
    program Console
    implicit none
    !Start OpenMP threading
    !$omp parallel num_threads(3)
    write(*, "(A11)") "Hello World"
    !$omp end parallel
    end program Console

[Output]
Hello World
Hello World
Hello World

위 예제에서는 3개의 쓰레드를 생성하였습니다. Clause 옵션은 여러개를 붙혀서 써줄 수도 있습니다. 기존의 Clause 옆에 하나 띄어 쓴 다음 다른 Clause를 써주시면 됩니다. 예를 들어서 다음과 같습니다.

[Fortran90 Code]
    program Console
    implicit none
    !Variables
    integer :: n
    integer :: omp_get_thread_num
    !Start OpenMP threading
    !$omp parallel num_threads(3) private(n)
    n = omp_get_thread_num()
    write(*, "(A17,I1)") "Hello World from ", n
    !$omp end parallel
    end program Console

[Output]
Hello World from 0
Hello World from 2
Hello World from 1

private 는 각각의 쓰레드에 해당변수를 독립적으로 생성시켜주는 Clause입니다. 그러므로 서로 공유하지 않게 되어서 충돌을 일으키지 않도록 해줍니다. 위의 예제에서는 n은 각 쓰레드의 번호인데, 이들 번호는 각각 다르므로 공유되지 않도록 각자에게 할당시켜줬습니다. 위 예제에서는 3개이므로 3개의 n을 생성해서 각각의 쓰레드에 나눠준 것이에요. 참고로 쓰레딩은 쓰레드 번호 순서에 맞게 쓰레딩하지 않으므로, 결과도 순서대로 나오지 않았습니다. 이외에도 parallel 이 지원하는 clause 들은 다음과 같습니다.

The parallel directive supports the following OpenMP clauses:

출처 - https://msdn.microsoft.com/en-us/library/68ah4xc7.aspx

댓글

이 블로그의 인기 게시물

[Linux, AIX] 사용자 계정 생성 및 설정

[AIX] rpm 설치와 rpm 으로 패키지 설치 및 삭제

Ubuntu 에서 Fortran 시작하기