병렬처리

내가 보기 위한 OpenMP 사용법

1minair 2022. 10. 27. 16:08
728x90

#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에 도착한 후 이후 라인을 실행한다.