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는 다음과 같은 종류들이 있습니다.
[Fortran OpenMP]
!$OMP [Directives] [Clauses](optional)
.
.
!$OMP END [Directives]
[C/C++ OpenMP]
#pragma omp [Directives] [Clauses](optional)
{
.
.
}
먼저, OpenMP의 시작을 알려주는 구문이 맨처음에 나와있습니다. 그리고 Directives 는 전체적인 방향을 결정하는 부분이고, 반드시 있어야됩니다. Clauses 는 옵션으로 넣어주는 부분이여서 세부사항을 조절 할 때, 이용하는 부분입니다. 마지막으로 OpenMP 코딩의 끝을 알려주는 구문을 적습니다. C의 경우에는 괄호로 범위를 설정합니다. 끝으로 Directive와 Clause는 다음과 같은 종류들이 있습니다.
Directive | Description |
---|---|
atomic | Specifies that a memory location that will be updated atomically. |
barrier | Synchronizes all threads in a team; all threads pause at the barrier, until all threads execute the barrier. |
critical | Specifies that code is only executed on one thread at a time. |
flush | Specifies that all threads have the same view of memory for all shared objects. |
for | Causes the work done in a for loop inside a parallel region to be divided among threads. |
master | Specifies that only the master threadshould execute a section of the program. |
ordered | Specifies that code under a parallelized for loop should be executed like a sequential loop. |
parallel | Defines a parallel region, which is code that will be executed by multiple threads in parallel. |
sections | Identifies code sections to be divided among all threads. |
single | Lets you specify that a section of code should be executed on a single thread, not necessarily the master thread. |
threadprivate | Specifies that a variable is private to a thread. |
Clause | Description |
---|---|
copyin | Allows threads to access the master thread's value, for a threadprivate variable. |
copyprivate | Specifies that one or more variables should be shared among all threads. |
default | Specifies the behavior of unscoped variables in a parallel region. |
firstprivate | Specifies 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. |
if | Specifies whether a loop should be executed in parallel or in serial. |
lastprivate | Specifies 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). |
nowait | Overrides the barrier implicit in a directive. |
num_threads | Sets the number of threads in a thread team. |
ordered | Required on a parallel for statement if an ordered directive is to be used in the loop. |
private | Specifies that each thread should have its own instance of a variable. |
reduction | Specifies 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. |
schedule | Applies to the for directive. |
shared | Specifies that one or more variables should be shared among all threads. |
댓글
댓글 쓰기