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;
....
}
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 |
댓글 영역