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

+ Recent posts