OpenMP

スレッド並列をする

  • OpenACC: OpenMPのGPU版

  • fork: thread生成

  • join: thread消滅
    多少オーバーヘッドがある
    変数のattribute

  • 共有変数: スレッド同士で共有

  • プライベート変数: スレッド毎独立

デフォルトで共有変数

pragmaの直後のループ変数はデフォルトでプライベート

並列処理部分を並列領域と呼ぶ

Reduction節

  • 排他制御: atomicにしてくれる

reduction (+: a) : ループ中はスレッド変数で最後に勝手に集約してくれる

Section節

依存しない処理を並列でやりたい時とかもしかしたら使うかも

排他制御

計算コストが高い: 排他なので

#pragma omp critical <scope>

データ依存性(data race)

複数スレッドが同一アドレスからraad/writeするとおかしくなる

  • ループの順番で変わってしまう
  • ループによらないrace ⇒ aをthread privateにすれば良い

Untitled

データ依存性特性

  • write → read: フロー依存性
  • read → write: 反依存性
  • write → write: 出力依存性
    • lastprivate
  • read → read: なし

リダクションが使えることがある

Untitled

  • デフォルトだと全てのスレッドを使うので共有サーバーだと迷惑をかかるかも
  • section は可読性著しく落ちる
  • 配列を用意してスレッドごとに使って足し合わせるみたいにすると可読性が落ちる

参考文献