상세 컨텐츠

본문 제목

OpenMP #3 - omp parallel for 디렉티브

병렬처리/OpenMP

by cepiloth 2020. 1. 21. 16:39

본문

728x90
반응형

omp parallel for

OpenMP에서 반복문을 병렬화 하기 위해 omp parallel for 디렉티브를 사용한다. 예제는 아래와 같다.

#pragma omp parallel for
for (int i = 0; i < count; i++ )
{
    //TODO..
}

 한 개의 큰 루프를 하나의 paraller for 디렉티브만 추가해서 시리얼 프로그램을 병렬화 하는 것이 가능하다. 또한 많은 수의 for 루프를 각 루프 전에 여러 개의 parallel for 디렉티브를 연속해서 추가해서 시리얼 프로그램을 병렬화할 수도 있다.

 하지만 모든 상황에서 항상 좋은 결과가만 가져오는 것은 아니다. paraller for 디렉티브를 사용할 때는 몇 가지 주의 사항이 있다. 

 

병렬화 불가 코드 예시

아래의 코드는 병렬화 할 수 없다. OpenMP는 for 루프만 병렬화한다. while문이나 do-while 문을 병렬화하지 않는다.

// 예1) 무한 루프 
for( ; ; ) {
    //TODO
}

 

for 문 자체 부터( for(... ;... ;... )의 코드를 의미)

// 예2) break 문
for(i = 0; i < n; i++) {
    if( ... ) break;
    ....
}

 

루프가 실행되는 본문의 코드

// 예3) buffer count 반복횟수 결정 못함
char* buffer;
for(i = 0; i < n; i++, buffer++) {
    if( ... ) break;
    ....
}

 

OpenMP는 정형화된 형태(canonical form)의 for 루프만을 별령 화할 수 있다. 
 상기 코드의 문제점은 반복 횟수가 결정되지 않았기 았기 때문이다. 이 for 루프는 구조화된 블록도 없고 break 문을 통해 루프 밖으로 빠져나갈 수도 있게 되어 있다.

 

레이스 컨디션(Race Condition)

 멀티스레드 프로그래밍(Multi-Thread Programming)에서 발생하는 문제 중 하나로. 여러 스레드(Thread)가 하나 또는 다수의 리소스를 경쟁적으로 업데이트하면 예측 불가능한 데이터 문제가 발생하는 것을 말한다. omp parrallel for 디렉티브를 사용할 때 아래 코드에서 레이스 컨디션이 발생한다.

// 레이스 컨디션 유발 코드 
char* buffer[1024] = {0,}; // 전역으로 선언된 buffer 을 다수의 스레드에서 접근 하게 된다.
char* color
#pragma omp parallel for 
for(i = 0; i < count; i++) {
    ...
    color = buffer + i;
    ....
}

 

 

상기 코드에서 color 포인터 변수를 여러 스레드에서 동시에 업데이트된다. 의도한 봐야 다르게 color 변수를 공유하면서 사용 하게 되어 이때 color 의 값이 메모리 주소는 비 결정적으로 업데이트 된다. 상기 코드는 아래와 같이 변경하여 레이스 컨디션을 회피할 수 있다.

// 레이스 컨디션 제거 
char* buffer[1024] = {0,};

#pragma omp parallel for 
for(i = 0; i < count; i++) {
    ...
    char* color = buffer + i;
    ....
}

 

728x90
반응형

'병렬처리 > OpenMP' 카테고리의 다른 글

OpenMP #5 - android configration  (0) 2020.01.21
OpenMP #4 - xcode configration  (0) 2020.01.21
OpenMP #2 - Work Sharing  (0) 2020.01.21
OpenMP #1 - 환경 설정  (0) 2020.01.21

관련글 더보기

댓글 영역