반응형
1. OpenMP (Multi-processing)
- 각 스레드나 프로세스가 제약없이 메모리를 액세스할 수 있도록 설계되어 있음
- 개발자가 병렬로 실행될 코드의 블록만을 간단하게 설정하고, 세밀한 제어는 컴파일이나 런타임 시스템에게 맡기는 방식
- 컴파일러나 런타임 시스템이 스레드의 디테일한 동작을 제어하기 때문에 간단하게 구현 할 수 있음.
2. OpenMP vs pthreads
| OpenMP | pthreads |
| 개발자가 병렬로 실행될 코드의 블록만 설정 | 개발자가 명시적으로 각 스레드의 형태 설정 |
| 컴파일러나 런타임 시스템이 스레드의 세밀한 동작을 제어함 | Low Level로 thread의 실행 형태를 세밀하게 제어 할 수 있음 |
| 코드를 간단하게 사용할 수 있음(쉬움) | 용도에 따라 구현이 필요함(어려움) |
3. 환경구축
- Windows 10 pro, visual studio 2013 pro

4. 테스트
- 싸인파 예제소스 fftSize=256K
- 병렬 OFF (75msec)

- 병렬 ON (16msec)

5. 문법
- num_threads를 생략하면, 현재 PC의 CPU 논리프로세서의 수만큼 스레드를 실행함.
#pragma omp parallel for or #pragma omp parallel for num_threads(thrMAX)
#pragma omp parallel or #pragma omp parallel num_threads(thrMAX)
#pragma omp parallel
{
// 현재 블록은 parallel 모드 상태, parallel 생략함
#pragma omp critical
#pragma omp for
#pragma omp atomic
}
- for문
// for문 문법
#pragma omp parallel for
#pragma omp parallel for num_threads(thrMAX)
//-----------------------------
// example
#pragma omp parallel for ( num_threads(8) )
for(int n=0; n<fftSize; n++){
data[n] = lib.expj(2.0*PI/fftSize*freq*n) + lib.gen_cnormal();
}
- 블록단위
// 블록단위
#pragma omp parallel
#pragma omp parallel num_threads(thrMAX)
//---------------------------
// example
#pragma omp parallel // num_threads(numThr)
{
int rank = omp_get_thread_num();
int numCntThr = omp_get_num_threads();
printf("rank=%d, numCntThr=%d\n", rank, numCntThr);
}
- 크리티컬섹션 1
- 연간, 공유 변수 접근 시 사용
- 지원되는 종류만 사용 가능, 불가능한 경우 critical로 대체

// critical section
#pragma omp atomic
//-------------------------
// example
int shareCnt = 0;
#pragma omp parallel
{
#pragma omp atomic
shareCnt ++;
}
- 크리티컬섹션 2
// critical section
#pragma omp critical
// ------------------------
// example
int shareCnt = 0;
#pragma omp parallel
{
#pragma omp critical
{
shareCnt += 1;
}
}
감사합니다.
잘못된 정보나 오타 및 수정사항이 있을 경우 댓글로 달아주시면 감사하겠습니다.
반응형