728x90

작업 분할지시어

-do/for : 전체 스래드들에게 일을 분담하여 맡김. 노는 스래드 x

-sections : 스레드 하나씩에게 일 할당. 나머지 스레드는 대기

-single : 하나의 스레드에게만 일시킴. 나머지는 대기

-workshare : fortran 명령어

 

 

 

 

 

section

- 스레드 하나에게 작업을 할당해주는 구문

- 모든 section이 종료될때까지 대기함

- 문제점 : 스레드가 10개가 존재하는데, section이 2개뿐이라면 -> 8개는 쉬고 있음

 

section 예제

#include <stdio.h>
#include <omp.h>

int main()
{
        int i, a[10], b[20];

        omp_set_num_threads(2);
#pragma omp parallel private(i)
{
        #pragma omp sections
        {
                #pragma omp section
                for(i=0; i<10; i++)
                        a[i] = i*10+5;
                #pragma omp section
                for(i=0; i<20; i++)
                        b[i] = i*5+10;
        }
} // pragma omp parallel private(i)

        for(i=0; i<10; i++)
                printf("%d ", a[i]);
        printf("\n");
        for(i=0; i<20; i++)
                printf("%d ", b[i]);
        printf("\n");
}

 

 

 

 

 

 

 

single

- 하나의 스레드만 들어와서 작업

- 먼저 도착하는 스레드가 일함

- 다른 스레드는 싱글에 도착한 스레드가 작업 끝날때까지 대기(베리어)

 

 

single 예제

#include <stdio.h>
#include <omp.h>

int main()
{
        omp_set_num_threads(4);
#pragma omp parallel
{
        #pragma omp single
        {
                printf("hello world\n");
        }
} // pragma omp parallel
}

 

 

 

 

 

 

 

master

- single이랑 동일함

- 마스터 스래드에서만 실행함

- 다른 스레드들은 싱글과 달리 베리어가 없어 넘어감

 

 

master 예제

#include <stdio.h>
#include <omp.h>

int main()
{
        omp_set_num_threads(4);
#pragma omp parallel
{
        #pragma omp master
        {
                sleep(1);
                printf("hello world\n");
        }
        printf("tid = %d\n", omp_get_thread_num());
} // pragma omp parallel
}

 

300x250

+ Recent posts