1. Scheduling clauses
개요
Static [, chunk_size]
chunk_size가 주어진 경우, 총 반복 실행 회수를 chunk_size로 나누어 chunk 생성Dynamic [, chunk_size]
chunk_size로 나누어 chunk 생성chunk_size가 없으면 디폴트 chunk_size=1Guided [, chunk_size]
Runtime
$ export OMP_SCHEDULE="static,1000"
$ export OMP_SCHEDULE="dynamic"
Auto
2. 비교

1. 명시적 task

(암시적) task
개요
사용
#pragma omp single로 해결Task Construct

2. Task Example
C code
#include <stdio.h>
#include <omp.h>
int main()
#pragma omp parallel num_threads(32)
{
#pragma omp single
{
printf("A tid=%d\n", omp_get_thread_num());
#pragma omp task
{
printf("B tid=%d\n", omp_get_thread_num());
}
#pragma omp task
{
printf("C tid=%d\n", omp_get_thread_num());
}
printf("D tid=%d\n", omp_get_thread_num());
}
}
}
Result

#pragma omp single 내의 작업인 A,D는 항상 똑같은 스레드가 출력#pragma omp task로 queue에 넘긴 작업인 B,C는 실행마다 각기 다른 스레드에서 출력Taskwait

#pragma omp taskwait 영역 내부 작업은 위의 작업들이 모두 완료된 후에 수행됨taskwait 추가 -> D는 위의 A,B,C print 작업이 모두 완료된 후에 수행 -> A,B,C,D 순서대로 출력3. 데이터 유효 범위
C code
int foo()
{
int a,b,c,d,e;
#pragma omp parallel private(b,d,e)
{
#pragma omp task private(e)
{
/*
a: shared
b: firstprivate
c: shared
d: firstprivate
e: private
*/
}
}
}
해석