Intro. to OpenMP - Tim Mattson (Intel)
link: https://m.youtube.com/playlist?list=PLLX-Q6B8xqZ8n8bwjGdzBJ25X2utwnoEG
Concurrency vs Parallelism
- Concurrency : 여러 task이 비순차적으로 돌아가도록 하는 것
- Parallelism : 같은 시간대에 돌아가는 것
- parallelism은 concurrency의 일부임
Fork-Join Parallelism
- A fundamental construct of OpenMP
- main thread 외에 n-1개의 thread를 fork하고 이후에 다시 main thread로 join하는 기법
- nested fork-join도 가능함
pthread
- POSIX Thread의 약자로 유닉스계열 POSIX 시스템에서 병렬적으로 작동하는 소프트웨어를 작성하기 위하여 제공하는 low-level API
- OpenMP에서는 기본적으로 이 pthread api를 wrapping함.
Library
- 사용자가 num_threads 설정한다고 무조건 그 만큼이 생기는 것은 아님.
- 이와 관련된 Policy가 무엇인지?
Performance
- Data access 관해서 잘못 짜면 false sharing이 아주 심하게 생길 수 있음.
- False sharing은, 내가 write하는 data를 다른 core에서 동시에 write하고자 할 때 remote cache line을 invalidate하는 protocol임. 이 때문에 cache miss가 아주 떨어짐.
- 해결책으로는, 1.Padding(데이터 영역을 L1 cache line 단위로(e.g. 64B) 분리하는 방법)과, 나아가서 2. Memory align하는 방식이 있음 (use posix_memalign).
Synchronization
- High level sync
- Critical
- Barrier
- Atomic
- Ordered
- Low level sync
- Flush
- Locks (simple/nested)
- 관련된 #omp
- #pragma omp barrier
- #pragma omp critical
- #pragma omp atomic
- atomic 연산이 가능한 경우에 atomic하게 작동하고, 아닌 경우에는 critical과 동일하게 행동함.
- tight loop 안에 넣어놓으면 난리 남.
Work Sharing
- Loop Construct / Section constructs / single constructs / task constructs
- Loop construct
- #pragma omp parallel 안에, #pragma omp for 을 넣어야 함.
- Compiler가 직접 하지는 scheduling을 하지는 못함(2013년 기준..)
- Scheduling
- schedule(static [,chunk])
- schedule(dynamic [,chunk])
- runtime scheduling (use task queue)
- schedule(runtime)
- env variable을 통해 runtime 시 static / dynamic 의 policy를 결정할 수 있음.
- schedule(auto)
- trust compiler
- #pragma omp parallel for 도 가능함
Reduction
- #pragma omp parallel for reduction (+:ave)
- 각 thread는 해당 시점에서 ave 변수의 data를 copy받고, 나중에 reduction construct에 정의된대로 알아서 merge해줌.
Barrier
- omp parallel for에는 기본적으로 barrier이 있음.
- 쓰고 싶지 않으면, omp parallel for nowait를 쓰면 됨.
Master
- #pragma omp master
- master을 하나 지정해서 logic을 수행.
- master를 지정하는 policy?
- 다른 놈들이 기다려야 하면 barrier 삽입
- master을 하나 지정해서 logic을 수행.
- #pragma omp single = master + barrier
Sections / Section
- pragma omp sections 안에 여러 개의 pragma omp section 이 있음.
Runtime Library Routines
- omp_set_num_threads()
- omp_get_num_threads()
- parallel 영역 밖에서는 1 리턴함.
- 값 제대로 보려면 parallel 영역 안에서 해야 함.
- omp_get_thread_num()
- omp_get_max_threads() ; 이 이상 allocate해줄 수 없다!
- bool omp_in_parallel() ; am i in parallel?
- omp_set_dynamic() ; set/unset dynamic mode
- bool omp_get_dynamic()
- omp_num_procs()
Usage Guide
- OpenMP 5.1 Cheatsheet
Other references
Data race detection for OpenMP