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. 관련 개념과의 비교

구분OpenMPMPIPthreads
메모리 모델공유 메모리분산 메모리공유 메모리
프로그래밍 난이도낮음 (지시어 삽입)높음 (명시적 통신 코드)높음 (수동 스레드 관리)
확장성단일 노드 내 제한적대규모 클러스터 확장 가능단일 노드 내
통신 방식암묵적(메모리 공유)명시적 메시지 전달암묵적(메모리 공유)

7. 장단점

  • 장점: 기존 순차 코드에 지시어만 추가하면 되어 이식성·생산성이 높음, 점진적 병렬화(incremental parallelism) 가능
  • 단점: 단일 노드(공유 메모리) 범위를 벗어난 확장이 불가, race condition·false sharing 등 동기화 이슈 관리 필요