-fopenmp
-qopenmp
-h omp
#pragma omp parallel
{
...
}
export OMP_NUM_THREADS = [int]
omp_set_num_threads([int])
#pragma omp parallel num_threads(16)
#include<omp.h>; omp_get_thread_num();
_OPENMP
macro 를 사용하여, OpenMP 컴파일 option 유무에 따른 분기 가능.private, firstprivate
private
: 변수를 새로 declaration (value assign X, gcc 의 default value 는 0)firstprivate
: parallel block 밖의 값으로 변수 값으로 initialization. parallel block 나가면 값은 사라짐.shared
: thread 가 모두 같은 변수를 사용 할 때는 shared 활용. default 임. parallel block 밖에 변수 주소를 그대로 활용.#pragma omp parallel shared(a) private(b,c) firstprivate(d)
#pragma omp critical
{
...
}
#pragma omp atomic
Critical
보다 ligth 하여, 성능이 더 좋음.Critical, atomic
적용하면 serial code 보다 더 느려 질 수도 있음. private
을 활용해서 thread 가 각각 실행되도록 하고, 반드시 필요한 부분만 critical, atomic
적용해야 함.#pragma omp barrier
prgma omp for reduction ([operator]:[variable])
pragma omp parallel for reduction ([operator]:[variable])
로 하면 지시자 한 줄로 가능.atomic, critical
을 쓰지 않고 변수와 연산을 정해서 값을 취합 하는 방법.variable
: 어떤 변수에 취합 할 것인지operator
: 어떤 종류 (연산)의 취합을 쓸 것인지. +,*,-,&,|,^,&&,||
omp_set_nested([1||0])
: nested parallel 사용 여부 설정 (0 으로 하면 parallel 안에 parallel block 은 thread 1개만 실행 됨.)omp_set_nested(1)
for, sections, single
#pragma omp sections
로 block 설정#prgma omp section
로 1개 thread 에 작업 할당#pragma omp parallel
{
// 작업 할당 받은 thread 만 아래 block 실행
#prgma omp sections
{
...
}
// 동기화
...
}
Singles
#pragma omp parallel
{
// 먼저 도착한 thread 가 아래 구문 실행
#pragma omp single
{
...
}
// 동기화
}
master
single
과 유사하나, 반드시 id 0번 thread 가 구문을 실행. #pragma omp parallel
{
// 0번 thread 가 아래 구문 실행
#pragma omp master
{
...
}
// 동기화 없음.
}
nowait
single,for
에 사용.for
구문에 nowait
사용하면 먼저 할당량이 끝난 thread 는 다음 code 를 쭉 진행.#pragma omp single nowait
,#pragma omp for nowait
ordered
#pragma omp for ordered
for (;;){
#pragma omp ordered
printf(~);
}
#pragma omp parallel for schedule([static||dynamic||guided])
chunk_size
가 주어지면, 총 반복 실행 횟수를 chunk_size
로 나누어 생성chunk_size
로 나누어 chunk 생성pragma omp for collapse(loop 개수)
for(i = 0; i < N; i++)
for(j = 0; j < N; j++)
a[i][j] *= 2;
flush directive
#pragma omp flush([variable])
-O3
를 사용하면 read/write 순서의 reordering 이 발생 함. 또한, -O3
옵션 사용 시 메모리를 전부 캐시에 올려서 사용해서, 메모리 값의 변경을 알 수 없는 경우도 있음. 그 때 flush
를 써서 문제 해결False sharing
데이터 의존성
출처 :
- KISTI e-learning OpenMP(초급) 강의
- 네이버 Mybox 에 강의자료 업로드