OpenMP 구문 구조

1944년 컴퓨터가 처음 출현하고난 후 하드웨어의 발전은 계속해서 거듭났습니다. 하지만 CPU는 쿨럭을 높일수록 발열이 점차 심해져서, 발전에 한계가 있었습니다. 이러한 문제점을 해결하기 위해서, CPU는 멀티코어의 방향으로 발전해 나갔습니다. 멀티코어에 따라서 프로그래밍에서도 코드 병렬화가 필요했습니다. 그러던중 1997년 OpenMP 아키텍처 리뷰보드는 최초의 API규격인 포트란 1.0용 병렬라이브러리를 출시했습니다. 이 후 2002년에는 C/C++용으로도 출시가 되었으며 인기가 많아지면서, 병렬컴퓨팅에서 표준적인 라이브러리중 하나가 되었습니다. 오늘 소개할 것은 바로 이 OpenMP의 구문 구조에 대해서 살펴 보도록 하겠습니다. OpenMP의 구문은 OpenMP의 시작과 끝을 알리는 부분들과 Directives 그리고 Clauses 로 나뉘어져있습니다.

[Fortran OpenMP]
!$OMP [Directives] [Clauses](optional)
   .
   .
!$OMP END [Directives]

[C/C++ OpenMP]
#pragma omp [Directives] [Clauses](optional)
{
   .
   .
}

먼저, OpenMP의 시작을 알려주는 구문이 맨처음에 나와있습니다. 그리고 Directives 는 전체적인 방향을 결정하는 부분이고, 반드시 있어야됩니다. Clauses 는 옵션으로 넣어주는 부분이여서 세부사항을 조절 할 때, 이용하는 부분입니다. 마지막으로 OpenMP 코딩의 끝을 알려주는 구문을 적습니다. C의 경우에는 괄호로 범위를 설정합니다. 끝으로 Directive와 Clause는 다음과 같은 종류들이 있습니다.
DirectiveDescription
atomicSpecifies that a memory location that will be updated atomically.
barrierSynchronizes all threads in a team; all threads pause at the barrier, until all threads execute the barrier.
criticalSpecifies that code is only executed on one thread at a time.
flushSpecifies that all threads have the same view of memory for all shared objects.
forCauses the work done in a for loop inside a parallel region to be divided among threads.
masterSpecifies that only the master threadshould execute a section of the program.
orderedSpecifies that code under a parallelized for loop should be executed like a sequential loop.
parallelDefines a parallel region, which is code that will be executed by multiple threads in parallel.
sectionsIdentifies code sections to be divided among all threads.
singleLets you specify that a section of code should be executed on a single thread, not necessarily the master thread.
threadprivateSpecifies that a variable is private to a thread.
ClauseDescription
copyinAllows threads to access the master thread's value, for a threadprivate variable.
copyprivateSpecifies that one or more variables should be shared among all threads.
defaultSpecifies the behavior of unscoped variables in a parallel region.
firstprivateSpecifies that each thread should have its own instance of a variable, and that the variable should be initialized with the value of the variable, because it exists before the parallel construct.
ifSpecifies whether a loop should be executed in parallel or in serial.
lastprivateSpecifies that the enclosing context's version of the variable is set equal to the private version of whichever thread executes the final iteration (for-loop construct) or last section (#pragma sections).
nowaitOverrides the barrier implicit in a directive.
num_threadsSets the number of threads in a thread team.
orderedRequired on a parallel for statement if an ordered directive is to be used in the loop.
privateSpecifies that each thread should have its own instance of a variable.
reductionSpecifies that one or more variables that are private to each thread are the subject of a reduction operation at the end of the parallel region.
scheduleApplies to the for directive.
sharedSpecifies that one or more variables should be shared among all threads.

댓글

이 블로그의 인기 게시물

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

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

Ubuntu 에서 Fortran 시작하기