1. Open specifications for Multi Processing
API
구성
omp parallel
omp_set_num_threads(n)
OMP_NUM_THREADS=n
2. OpenMP의 장단점 (vs MPI)
장점
단점
1. 구성 요소
Compiler Directive (Fortan)
!$OMP PARALLEL DO
Runtime Library
함수 | 기능 |
---|---|
omp_set_num_threads(n) | 생성될 스레드 개수 set |
omp_get_num_threads() | 생성된 스레드 개수 return |
omp_get_thread_num() | 스레드 ID return |
omp_get_max_threads() | 사용 가능한 최대 스레드개수 return |
omp_set_num_threads(n)
으로 스레드 생성 시, master thread 1개 + 추가 생성된 n-1개의 스레드로 구성됨 Environmental Variables
export OMP_NUM_THREADS=8
2. Example
C code
#include <stdio.h>
#include <omp.h>
int main()
{
#pragma omp parallel //Compiler Directive
{
// Runtime Library
printf("Hello World! %d\n", omp_get_thread_num());
} // end #pragma omp parallel
}
Compile 및 실행 (C / C++)
$ gcc -fopenmp -o omp_comp.x omp_comp.c
$ export OMP_NUM_THREADS = 4
$ ./omp_comp.x
Result
Hello World! 0
Hello World! 1
Hello World! 3
Hello World! 2
$ export OMP_NUM_THREADS = 4
에 의해 4줄 출력C code
#include <stdio.h>
#include <omp.h>
int main()
{
#ifdef_OPENMP
#pragma omp parallel //Compiler Directive
{
// Runtime Library
printf("Hello World! %d\n", omp_get_thread_num());
} // end #pragma omp parallel
#else
printf("Hello World 0\n")
#endif
}
Compile 및 실행 (C / C++)
$ gcc conditional.c
$ gcc -fopenmp conditional.c
$ export OMP_NUM_THREADS = 4
$ ./a.out
Result
$ gcc conditional.c
: SerialHello World! 0
$ gcc -fopenmp conditional.c
: ParallelHello World! 0
Hello World! 3
Hello World! 2
Hello World! 1
해석
#ifdef_OPENMP
로 분기 처리 시, serial 조건으로도 parallel 조건으로도 컴파일이 가능함#else
이후가 주석처리 된다면, serial 컴파일 불가omp_get_thread_num
함수를 찾을 수 없다는 에러 출력1. Example
C code
#include <stdio.h>
#include <omp.h>
int main()
{
#pragma omp parallel
{
printf("Hello World! %d\n", omp_get_thread_num());
}
printf("\n");
omp_set_num_threads(4);
#pragma omp parallel
{
printf("Hello World! %d\n", omp_get_thread_num());
}
printf("\n");
#pragma omp parallel num_threads(2)
{
printf("Hello World! %d\n", omp_get_thread_num());
}
}
Compile 및 실행 (C / C++)
$ gcc -fopenmp -o create_thread.x create_thread.c
$ export OMP_NUM_THREADS = 8
$ ./create_thread.x
Result
Hello World! 0
Hello World! 4
Hello World! 3
Hello World! 5
Hello World! 7
Hello World! 2
Hello World! 1
Hello World! 6
Hello World! 0
Hello World! 3
Hello World! 2
Hello World! 1
Hello World! 1
Hello World! 0
OMP_NUM_THREADS = 8
로 시작 -> 8번 출력omp_set_num_threads(4);
-> 4번 출력#pragma omp parallel num_threads(2)
-> 2번 출력2. OpenMP Programming Model
Thread-Based
Fork-Join Model
컴파일러