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
'컴퓨터과학 > 기타' 카테고리의 다른 글
matplotlib - 1. 단순한 subplots (0) | 2020.08.25 |
---|---|
openmp - 25. 테스크 데이터 유효범위와 피보나치 (0) | 2020.07.30 |
openmp - 23. 스캐줄링과 만델브로트 (0) | 2020.07.30 |
openmp - 22. ordered, lock (0) | 2020.07.30 |
openmp - 21. nowait (0) | 2020.07.30 |