728x90

동기화

- nowait

- ordered, lock, flush

 

nowait

- 베리어 기능이 있는 명령어 사용시 작업이 끝날떄까지 기다림 => 시간 낭비 발생

- nowait 구문이 있을시 대기하지 않게함.

 

nowait 사용 예제 1

- 사용 안한경우

 -> 2번이 먼저 들어오나 이후 들어오는 작업들을 대기후, 같이 수행하여 늦게 종료됨

#include <stdio.h>
#include <omp.h>
#define N 20

int main()
{
        int i, a[N];

        omp_set_num_threads(4);
#pragma omp parallel private(i)
{
        if( omp_get_thread_num() != 2 )
                sleep(5);
        #pragma omp for
        for(i=0; i<N; i++) {
                a[i] = i;
                printf("a[%d]=%d tid=%d\n", i, a[i], omp_get_thread_num());
        }
        printf("end %d thread\n", omp_get_thread_num());
} // pragma omp parallel private(i)
}

- 사용한 경우

 2번이 먼저 들어오므로 먼저 마무리하고 나머지 스래드들의 연산 분할

 => 사용안한 경우보다 조금빨리종료

#include <stdio.h>
#include <omp.h>
#define N 20

int main()
{
        int i, a[N];

        omp_set_num_threads(4);
#pragma omp parallel private(i)
{
        if( omp_get_thread_num() != 2 )
                sleep(2);
        #pragma omp for nowait
        for(i=0; i<N; i++) {
                a[i] = i;
                printf("a[%d]=%d tid=%d\n", i, a[i], omp_get_thread_num());
        }
        printf("end %d thread\n", omp_get_thread_num());
} // pragma omp parallel private(i)
}

 

nowait 사용 예제 2 section

- 사용 안한경우

#include <stdio.h>
#include <omp.h>
#define N 4

int main()
{
        int i, tid;
        omp_set_num_threads(4);
#pragma omp parallel private(i, tid)
{
        tid = omp_get_thread_num();
        #pragma omp sections
        {
                #pragma omp section
                {
                        for(i=0; i<N; i++)
                                printf("L1 tid=%d\n", tid);
                }
                #pragma omp section
                {
                        for(i=0; i<N; i++)
                                printf("L2 tid=%d\n", tid);
                        sleep(2);
                }
        }
        printf("end tid=%d\n", tid);
} // pragma omp parallel
}

- 사용한 경우

#include <stdio.h>
#include <omp.h>
#define N 4

int main()
{
        int i, tid;
        omp_set_num_threads(4);
#pragma omp parallel private(i, tid)
{
        tid = omp_get_thread_num();
        #pragma omp sections nowait
        {
                #pragma omp section
                {
                        for(i=0; i<N; i++)
                                printf("L1 tid=%d\n", tid);
                }
                #pragma omp section
                {
                        for(i=0; i<N; i++)
                                printf("L2 tid=%d\n", tid);
                        sleep(2);
                }
        }
        printf("end tid=%d\n", tid);
} // pragma omp parallel
}

300x250

+ Recent posts