ex)
omp_set_num_thread(4);
#pragma omp parallel private(myid);
{
myid = omp_get_thread_num();
#pragma omp for private(i) ordered
for(int i=0; i<8; i++)
{
#pragma omp ordered
printf("T:%d,i=%d\n", myid, i);
}
}
-. 데이터 유효범위
OMP의 쓰레드별 데이터 변수별로 사용 범위(개별로 쓸것인지, 아니면 공유하여 쓸것인지)를 지정 할
수 있다.
기본적으로 OMP의 루프변수(루프의 count인자)는 private로 지정되며, 이외의 모든 변수는 shared
로 자동적으로 지정된다.
OMP는 이를 수동으로 사용자가 지정할 수 있도록 clause를 제공한다.
private(변수, 변수...)
shread(변수, 변수...)
-. omp_set_dynamic
사용자가 지정한 개수로만 동적 개수로 쓰레드를 생성하여 시스템의 상황에 맞도록 병렬 실행한다.
작업분할(do/for, section, single)
do/for
=> (균등한 분할)
Master Thread => Fork => Thread Team => JOIN
=>
section
=> (편중된 분할)
Master Thread =>Fork => Thread Team => JOIN
=>
single
=> (Only 1 Thread)
Master Thread =>Fork => Thread Team => JOIN
=>
FORK 후의 JOIN시 어떠한 쓰게드라도 모두 종료되어야만 쓰레드 팀이 소거된다.
다른 쓰레드가 종료되기를 기다리지 않고, 다른 작업을 계속하려면 nowait clause를 사용해야 한다.
-. single 지시어는 암시적인 장벽이 없어 가정 먼저 실행된 스레드만이 signle 코드 블럭을 실행하게 된다.
만약 nowait가 없다면 signle 코드를 실행한 스레드가 종료해야만, 다른 스레드도 종료하게 된다.
<결합도 작업 구문 clause>
#pragma omp parallel
#pragma omp for ==> #pragma omp parallel for
#pragma omp parallel
#pragma omp sections ==> #pragma omp parallel sections
변수 영역 관련
-. 병렬 구문 아래의 순차적으로 실행되는 for 루프의 인자는 기본적으로 shared를 가지게 된다.
따라서 명시적으로 루프의 인자는 private clause를 사용 할 필요가 있다.
-. 병렬 구문 아래의 서브 루틴의 지역변수는 기본적으로 private 속성을 가지게 된다.
그러나 static 변수경우 쓰레들간 공유하게 된다.
-. 병렬 구문 아래의 루프안의 수시로 선언되는 지역변수는 private가 된다.
-. defualt(none)을 사용하여, 병렬구문 내의 모든 변수가 shared또는 private로 미리 선언되어야
한다.
Reduction Clause
병렬로 처리된 결과를 마지막에 모두 취합하여 계산해야 하는 변수에 대하여 사용한다.
예)
#pragma omp parallel for
for(int i=0; i<100; i++)
sum += a + b;
위 변수 sum은 병렬로 처리되어 thread마다 소유하게 되고, join시 team thread 별 sum변수는 다
른 값을 가지게 되어 스레드별로 모두 취합하여 따로 계산해 줘야하는 경우에는
reduction clause를 사용하여 이러한 과정을 자동적으로 처리하도록 할 수 있다.
다음은 reduction clause를 사용한 예이다.
#pragma omp parallel for reduction(+:sum)
for(int i=0; i<100; i++)
sum += a+b;
reduction 사용시 주의점
우선 순위에 영향을 받게되는 연산의 경우에는 reduction 사용시 나중에 어떻한 값이 나오게 될 지 장담할 수 없게 된다.
즉, 먼저 실행이 종료된 스레드의 값이 우선순위가 높게되며, 나중에 종료된 스레드 값이 우선순위가 낮아 결과값으로 취합할 경우 장담할 수 없는 값이 나오게 되는데 이러한 경우를 막기위해서는 추가적인
코드 처리를 해줘야 한다.
또한 reduction 변수는 스칼라 형이여야하고, 스레드 팀에서 모두 공유 할 수 있는 shared 타입이여야 한다.
따라서 배열이나 구조체의 경우 reduction 변수가 될 수 없다.
scheduale
staic(nochunk)
staic(chunk)
댓글 없음:
댓글 쓰기