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
*/
}
}
}
해석