내가 보기 위한 OpenMP 사용법
#pragma -> 컴파일러에게 뒤에 오는 내용에 따라 어떤 일을 하라는 전처리명령
1. pragma omp parallel (option) : 구문을 병렬로 실행한다. thread 수만큼 실행된다.
>> 여러 thread에서 병렬로 실행할 코드인 병렬 영역을 정의한다.
#pragma omp parallel
// 병렬처리 할 한줄
#pragma omp parallel
{
// 병렬처리 할 여러줄
}
- Option
▣ if(조건) : 조건이 true일 때만 병렬처리 한다.
▣ num_threads(n) : n개의 thread로만 병렬처리 한다.
▣ private(var) : 변수 var를 각각 copy 해서 사용. 병렬처리 지역 이전의 초기화가 무의미함.
>> 병렬처리 지역 내부에서 초기화 필요!
각 쓰레드가 가지는 독립 변수이다.
▣ firstprivate(var) : 변수 var를 각각 copy 해서 사용. 병렬처리 이전 값이 유지됨.
>> 각 쓰레드가 가지는 독립 변수이다.
외부 선언 변수 값을 copy해 온다는 점이 private(var)과 다르다.
▣ shared(var) : 변수 var를 모든 thread가 하나의 copy로 사용. 병렬처리 이전 값이 유지됨.
>> 쓰레드 내부에서 변환 시킨 var 값이 외부 변수 var에 영향을 미친다. 같은 변수이기 때문에
2. #pragma omp for , #pragma omp parallel for
: 병렬 영역 내의 for 루프에서 수행된 작업이 thread 간에 분할된다.
3. #pragma omp atomic : atomic 연산 시 사용.
>> 공유 변수에 둘 이상의 쓰기로부터 보호하기 위해 사용한다.
4. #pragma omp critical : 코드가 한 번에 하나의 thread에서만 실행되도록 한다.
>> 코드 block 묶음.
5. #pragma omp single : 하나의 thread만 실행한다. 다른 thread는 기다린다.
#pragma omp single nowait : 하나의 thread만 실행하나 다른 thread는 기다리지 않는다.
6. #pragma omp master : master thread 하나만 실행한다. 다른 thread는 기다리지 않는다.
7. #pragma omp task : thread 하나에 task를 넘겨주고 넘어간다.
8. #pragma omp barrier : 모든 thread가 barrier에 도착한 후 이후 라인을 실행한다.