/ The Blog of Jinho Ko / Computer science / Programming / Systems

·

2 min read

OpenMP

By Jinho Ko

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 삽입
  • #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 library

Other references

Data race detection for OpenMP

last modified June 2, 2024
comments powered by Disqus

© Copyright 2024. Jinho Ko. All rights reserved. Last updated: June 02, 2024.