반응형

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;
	}
}

감사합니다.

잘못된 정보나 오타 및 수정사항이 있을 경우 댓글로 달아주시면 감사하겠습니다. 


 

반응형

+ Recent posts