본문 바로가기
Programming/C | C++

OpenMP(1) - 입문자용 주요 사용법 간단한 설명/정리(omp parallel, for, atomic,critical)

by 썽하 2020. 7. 24.

 

 

매일 GPU나 분산 컴퓨팅으로 병렬 처리만 하다가, 오랜만에 단일 cpu환경에서 thread로 병렬 처리를 해야 할 일이 생겼다. 학습하는 김에 주요 사용법을 정리해보고자 한다.

 

개발 환경

  • C/C++
  • OpenMP 5.0 API

 

사용법

1. omp parallel

기본 사용법

#pragma omp parallel
//병렬 처리 할 한줄

#pragma omp parallel
{
	/*
	병렬 처리 할 여러줄
	*/
}

다음 한 줄이나 다음에 오는 중괄호에 묶인 구문을 병렬로 실행한다. thread 수만큼 실행된다.

 

 

 

옵션

#pragma omp parallel if(condition)
#pragma omp parallel num_threads(n)
#pragma omp parallel private(a)
#pragma omp parallel firstprivate(b)
#pragma omp parallel shared(c)

중복되는 옵션은 한 번만 설명합니다.

 

if(condition) : 조건이 참일 때만 병렬 처리된다.

 

 

num_threads(n) : n개의 thread로만 병렬 처리한다.

 

 

private(a) : 변수 a를 각각 copy 해서 사용한다. parallel region 이전의 초기화가 무의미하다.

firstprivate(b) : 변수 b를 각각 copy 해서 사용한다. parallel region 이전 값이 유지된다.

 

 

shared(c) : 변수 c를 모든 thread가 하나의 copy로 사용한다. parallel region 이전의 값이 유지된다.

 

 

주의! shared 예제는 자원 동시 접근이 가능해서 따라 하면 안됨. 아래 atomic이나 critical을 참고.

 

2. omp for

#pragma omp parallel
#pragma omp for
// for-loop

// or 

#pragma omp parallel
{
	#pragma omp for
	// for-loop
}

for 혼자서는 동작하지 않고 parallel 구문 안에 있어야 정상 동작한다.

 

3. omp parallel for

#pragram omp parallel for
// for-loop

#pragma omp parallel
#pragma omp for

와 동일하다. 그럼 왜 두 줄로 나눠쓰자? 아마 parallel에만 들어갈 수 있는 옵션 때문에?

4. omp atomic

#pragma omp atomic
// atomic section

연산을 atomic 하게 한다. 공유 변수에 접근할 때 쓴다.

지원되는 연산 종류만 가능하며, 불가능한 경우 critical section으로 대체 가능하다.

지원되는 연산

 

 

5. omp critical

#pragma omp critical
// critical section

충동할 수 있는 자원에 대해서 critical section으로 설정한다. atomic보다 더 오래 걸리니 atomic이 불가능할 때 사용하자.

 

 

 

Reference

 

쓰다 보니 많아져서 다음 편에 이어서...

댓글