[Directive] single, master

OpenMP 페러렐코딩 중간에 단일 코어로 계산해야하는 경우 single과 master 디렉티브들이 단일코어로만 계산하도록 명령을 내립니다. 하지만 single은 배정된 쓰레드가 실행을 하는 동안 나머지 쓰레드들은 대기상태로 있는 반면, master는 나머지 쓰레드들은 멈추지 않고 바로 다음 블럭으로 가서 다음 블럭의 업무를 수행합니다. 먼저 single로 작성된 코드 예제를 살펴보면 다음과 같습니다.

[Fortran 90]
    program Console
    implicit none
    !Variables
    integer i
   
    !$omp parallel private(i)
    !$omp single
    do i=1,5
        print *, "Hello World from single"
    end do
    !$omp end single
    !implicit barrier
    print *, "Hello World"
    !$omp end parallel
    read *
    end program Console

[Output]
 Hello World from single
 Hello World from single
 Hello World from single
 Hello World from single
 Hello World from single
 Hello World
 Hello World
 Hello World
 Hello World

single 블럭에서는 문자를 출력하는 작업을 반복적으로 하도록 지시 하였습니다. 이후 single 블럭 다음에는 각각의 쓰레드들에게 문자를 출력하는 작업을 지시했습니다. 결과를 보면 이 실행은 single 블럭이 끝나기 전까지는 수행되지 않았음을 알 수 있습니다. single 디렉티브가 끝나는 지점에 "implicit barrier"가 있음을 알 수 있습니다. 다음으로 master 로 유사한 작업을 하도록 코드를 작성하면 다음과 같습니다.

[Fortran 90]
    program Console
    implicit none
    !Variables
    integer i
   
    !$omp parallel private(i)
    !$omp master
    do i=1,5
        print *, "Hello World from single"
    end do
    !$omp end master
    print *, "Hello World"
    !$omp end parallel
    read *
    end program Console

[Output]
 Hello World from single
 Hello World
 Hello World
 Hello World from single
 Hello World from single
 Hello World from single
 Hello World from single
 Hello World
 Hello World

single 디렉티브의 경우와 다르게, master의 결과는 섞여 있는 것을 볼 수 있는데요. 이는 다른 쓰레드들이 바로 수행되었음을 의미 합니다. master 의 경우도 나머지 쓰레드들을 기다리도록, master가 끝나는 지점에 "$!omp barrier" 명령어로 할 수 있습니다. 이 barrier를 explicit barrier라고 하며, 이는 하나의 디렉티브입니다. 마지막으로 master 는 clause 를 지원하지 않는 반면 single은 다음과 같은 clause 들을 지원합니다.

The single directive supports the following OpenMP clauses:
출처 - https://msdn.microsoft.com/en-us/library/9kcw2kxz.aspx

댓글

이 블로그의 인기 게시물

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

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

Ubuntu 에서 Fortran 시작하기