728x90
병렬 블록 문제
1. 병렬 영역안에 점프문을 쓰면 안됨
2. if(omp_get_thread_num() == 1)로 1번 스레드만 들어올수 있는데 안에 barrier 구문이 존재
=> 나머지 스레드가 들어오지 못함 => 영원히 종료 x
#include <stdio.h>
#include <omp.h>
int main()
{
omp_set_num_threads(4);
goto L1;
#pragma omp parallel
{
L1:
if (omp_get_thread_num() == 1)
goto L2;
}
L2:
#pragma omp parallel
{
if(omp_get_thread_num() == 1){
#pragma omp barrier
}
}
}
포크 조인 모델 문제
- 배열 a는 private 처리 됨
- a[0]는 그대로 0으로 남아있음
#include <stdio.h>
#include <omp.h>
int main()
{
int a[4] = {0}, tid;
omp_set_num_threads(4);
#pragma omp parallel private(a, tid)
{
tid = omp_get_thread_num();
a[tid] = tid;
printf("a[%d] = %d in %d - th thread\n", tid, a[tid], tid);
a[0] = 100;
}
printf("a[0] = %d\n", a[0]);
}
동기화 문제
- 서로 다른 크리티컬 구간에서 동일한 변수에 접근하려함
#include <stdio.h>
#include <omp.h>
int main()
{
int x=1;
omp_set_num_threads(4);
#pragma omp parallel
{
#pragma omp critical(n1)
{ x++; }
#pragma omp critical(n2)
{ x++; }
#pragma omp atomic
x++;
printf("x = %d\n", x);
}
}
- 서로 다른 임계구간에서 동일 변수 접근을 막도록 임계 구간을 동일한 이름으로 변경
#include <stdio.h>
#include <omp.h>
int main()
{
int x=1;
omp_set_num_threads(4);
#pragma omp parallel
{
#pragma omp critical(n1)
{ x++; }
#pragma omp critical(n1)
{ x++; }
#pragma omp atomic
x++;
printf("x = %d\n", x);
}
}
300x250
'컴퓨터과학 > 기타' 카테고리의 다른 글
openmp - 20. 작업 분할 지시어들 (0) | 2020.07.30 |
---|---|
openmp - 19. 중첩 스레드 (0) | 2020.07.30 |
openmp - 17. pi계산에서의 병렬화를 통한 성능 개선 (0) | 2020.07.29 |
openmp - 16. reduction과 factorial (0) | 2020.07.29 |
openmp - 15. reduction (0) | 2020.07.29 |