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にすれば良い

データ依存性特性
- write → read: フロー依存性
- read → write: 反依存性
- write → write: 出力依存性
- lastprivate
- read → read: なし
リダクションが使えることがある

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