정보공간_1

[2기 전주 박준형] OpenMP 병렬 영역, 작업 분할 지시어 본문

IT 놀이터/Elite Member Tech & Talk

[2기 전주 박준형] OpenMP 병렬 영역, 작업 분할 지시어

알 수 없는 사용자 2012. 11. 24. 20:42

 

병렬 영역 지시어

parallel 지시어

순차 프로그램 내에서 멀티스레드로 실행되는 병렬 영역을 정의합니다.

시작점에서 병렬 작업을 수행할 스레드 팀이 생성되고 종료지점에서 스레드 팀이 소멸됩니다.

 

 

이 예제는 int x = 1로 초기화 하는 시간과 #pragma omp parallel를 이용하여 스레드를 생성하는 시간을 측정한 예제입니다. 컴퓨터 환경이 쿼드 코어이므로 기본적으로 4개의 스레드가 생성됩니다.

이는 OpenMP에서 스레드를 생성하고 소멸할때의 기본적으로 걸리는 시간입니다.

하지만 작업량이 증가할수록 순차 프로그램보다 빠른 속도를 나타낼 것입니다.

쿼드 코어 순차처리 작업 시간이 0.652ms를 넘지 않은 작업은 병렬처리를 할 경우 오히려 효율성이 떨어지게 된다는 의미입니다.

 

작업 분할 지시어

for 지시어

문법

#pragma omp parallel

{

#pragma omp for [보조 지시어 [,보조 지시어 ..]]

for(초기값; 조건식; 증감값)

{

구조 블럭 //코드 작성

}

}

#pragma omp for 지시어를 이용하여 for 루프 문의 반복 작업을 자동으로 배분하는 기능을 제공 합니다.

sections 지시어

#pragma omp sections 지시어는 루프의 반복 작업 없이 여러 스레드에게 작업 단위로 배분하여 병렬로 처리하는 기능을 수행합니다. 스레드 팀의 각각의 스레드에 #pragma omp section 지시어로 작업을 나누게 됩니다.

 

각기 다른 작업을 여러 스레드가 배분받아서 수행하는 것을 나타냄 작업을 배분받지 못하는 스레드는 암시적 동기화 지점에서 대기하게 된다.

문법

#pragma omp sections [보조 지시어 [,보조 지시어...]]

{

#pragma omp section

{

작업1;

}

#pragma omp section

{

작업2;

}

}

 

#pragma omp sections 지시어를 사용하여 각각 다른 작업을 수행하는 예입니다. 3개의 printf는 생성된 여러 개의 스레드 중에서 각각 하나의 스레드에 할당되어 한번만 실행되고 종료하게 됩니다.

 

single 지시어

#pragma omp single 지시어는 스레드 팀 중 하나의 스레드만 해당 코드를 실행하게 됩니다.

다른 스레드들은 single 지시어로 지정된 스레드가 실행을 완료할때까지 #pragma omp single의 구조 블록의 마지막 지점에서 암시적 동기로 대기합니다.

 

#pramga omp single 지시어 이후에 나오는 두번째 프린터 문은 첫번째 프린트 문을 완료하고 먼저 진입하는 스레드가 실행됩니다.