OpenMP (Open Multi-Processing)
1. 정의 및 목표
OpenMP는 공유 메모리(Shared Memory) 기반의 병렬 프로그래밍을 위한 API 규격입니다. 컴파일러 지시어(디렉티브), 라이브러리 루틴, 환경 변수로 구성되며, C/C++/Fortran에서 순차 코드를 최소한의 수정으로 병렬화하는 것을 목표로 합니다.
2. 병렬 프로그래밍 전체 구조에서의 위치
병렬 프로그래밍은 메모리 구조에 따라 접근 방식이 갈립니다.
병렬 프로그래밍 모델
├── 공유 메모리(Shared Memory) 모델
│ ├── OpenMP (지시어 기반, 스레드 병렬)
│ ├── Pthreads (저수준 스레드 API)
│ └── TBB (Intel Threading Building Blocks)
├── 분산 메모리(Distributed Memory) 모델
│ └── MPI (Message Passing Interface)
├── 이기종/가속기 병렬
│ └── CUDA, OpenCL, OpenACC (GPU 등)
└── 하이브리드 모델
└── MPI + OpenMP (클러스터 내 노드 간 MPI, 노드 내 OpenMP)
- OpenMP: 하나의 물리적 노드/서버 내부, 즉 메모리를 공유하는 멀티코어 환경에서 스레드 단위 병렬화
- MPI: 메모리를 공유하지 않는 여러 노드 간 통신 기반 병렬화
- CUDA/OpenCL: CPU가 아닌 GPU 가속기 병렬화
- 대규모 슈퍼컴퓨팅에서는 MPI(노드 간) + OpenMP(노드 내)를 함께 쓰는 하이브리드 구조가 일반적
3. 핵심 구성 요소
| 구성요소 | 설명 | 예시 |
|---|---|---|
| 컴파일러 지시어 | #pragma omp 형태로 병렬 영역 지정 | #pragma omp parallel for |
| 런타임 라이브러리 | 스레드 수 제어, 동기화 등 함수 | omp_get_thread_num() |
| 환경 변수 | 실행 시 병렬 동작 제어 | OMP_NUM_THREADS |
4. 실행 모델 (Fork-Join Model)
Master Thread ──────┬─── Thread 1 ───┐
(순차 실행) ├─── Thread 2 ───┼──── Master Thread (병합, Join)
└─── Thread 3 ───┘
(Fork: 병렬 영역 진입 시 분기)
parallel지시어를 만나면 마스터 스레드가 여러 워커 스레드를 fork- 병렬 영역이 끝나면 다시 하나로 join
5. 주요 지시어(Directive) 분류
- 작업 분할(Work-sharing):
for,sections,single,task - 동기화(Synchronization):
critical,atomic,barrier,master - 데이터 범위(Data Scope):
private,shared,firstprivate,reduction
6. 관련 개념과의 비교
| 구분 | OpenMP | MPI | Pthreads |
|---|---|---|---|
| 메모리 모델 | 공유 메모리 | 분산 메모리 | 공유 메모리 |
| 프로그래밍 난이도 | 낮음 (지시어 삽입) | 높음 (명시적 통신 코드) | 높음 (수동 스레드 관리) |
| 확장성 | 단일 노드 내 제한적 | 대규모 클러스터 확장 가능 | 단일 노드 내 |
| 통신 방식 | 암묵적(메모리 공유) | 명시적 메시지 전달 | 암묵적(메모리 공유) |
7. 장단점
- 장점: 기존 순차 코드에 지시어만 추가하면 되어 이식성·생산성이 높음, 점진적 병렬화(incremental parallelism) 가능
- 단점: 단일 노드(공유 메모리) 범위를 벗어난 확장이 불가, race condition·false sharing 등 동기화 이슈 관리 필요