728x90

테스크

- 암시적 묶음(스레드당 하나)

- 스레드 팀 발생

- 팀내 각 스레드에 테스크 하나씩 할당( 스레드 하나에 테스크가 묶임)

- 모든 태스크가 멈출때까지 마스터 스래드 대기

 

태스크의 개념

- 태스크 스캐줄링 = 은행 번호표 시스템

- 태스크 = 은행 업무

- 스레드 = 은행원

 

태스크 라이프사이클

1. 태스크 생성

2. 태스크 실행

3. 경우에 따라 일시 정지 후 재실행 등

4. 실행 완료

 

 

테스크 예제 1

- 32개의 스레드가 모두 ABCD 다 출력

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

int main()
{
#pragma omp parallel num_threads(32)
{
        printf("A ");
        printf("B ");
        printf("C ");
        printf("D ");
        printf("\n");
} // pragma omp parallel
}

 

테스크 예제2

- ABCD다 19번스레드가 수행

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

int main()
{
#pragma omp parallel num_threads(32)
{
        #pragma omp single
        {
                printf("A tid=%d\n", omp_get_thread_num() );
                printf("B tid=%d\n", omp_get_thread_num() );
                printf("C tid=%d\n", omp_get_thread_num() );
                printf("D tid=%d\n", omp_get_thread_num() );
        }
}
}

 

 

테스크 예제3

- 스래드 32개 준비됨

- A는 10번 스레드가 수행

- B와 C 테스크에 20, 10번 스레드가 수행

- 마무리 후 D는 1번 스레드가 수행

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

int main()
{
#pragma omp parallel num_threads(32)
{
        #pragma omp single
        {
                printf("A tid=%d\n", omp_get_thread_num() );
                #pragma omp task
                {
                        printf("B tid=%d\n", omp_get_thread_num() );
                }
                #pragma omp task
                {
                        printf("C tid=%d\n", omp_get_thread_num() );
                }
                printf("D tid=%d\n", omp_get_thread_num() );
        }
}
}

 

 

테스크 예제 4

- taskwait : 태스크가 끝날떄까지 대기 = wait

- A를 23이 수행, 태스크 B와 C를 18, 25가 수행, 태스크가 끝나면 D를 23번이 수행

=> taskwait한 탓에 테스크 예제3번보다 0.003s 더 오래 걸림

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

int main()
{
#pragma omp parallel num_threads(32)
{
        #pragma omp single
        {
                printf("A tid=%d\n", omp_get_thread_num() );
                #pragma omp task
                {
                        printf("B tid=%d\n", omp_get_thread_num() );
                }
                #pragma omp task
                {
                        printf("C tid=%d\n", omp_get_thread_num() );
                }
                #pragma omp taskwait
                printf("D tid=%d\n", omp_get_thread_num() );
        }
}
}

300x250

+ Recent posts