Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

CuthillMckee法によるOpenFORMのDIC前処理に関するスレッド並列化

610 views

Published on

2018/4/21に開催された 第72回オープンCAE勉強会@関東(流体など)で発表した資料です。
詳細はFixstars Tech Blogをご覧ください → http://proc-cpuinfo.fixstars.com/2018/06/openfoam/

Published in: Software
  • Be the first to comment

  • Be the first to like this

CuthillMckee法によるOpenFORMのDIC前処理に関するスレッド並列化

  1. 1. CuthillMckee法による OpenFOAMのDIC前処理に関す るスレッド並列化 藤原 巧(伊藤優希、富岡稔、丸石崇史、吉藤尚生) © 2017 Fixstars Corporation, All rights reserved.
  2. 2. 目次  インターンの動機  CuthillMckee法を簡単な問題に適用する(1週間)  OpenFOAMにCuthillMckee法を導入(3日)  KNLを使った計算(1日)  まとめ&今後 1
  3. 3. インターンに入るまで  研究室内でもOpenFOAMのハイブリッド並列化 してみたいという話になる  知り合いにfixstarsのインターンがよかったよと 言われる  これをみる 2 ボドゲ会…?
  4. 4. 並列計算に向けて  どうやらCuthill-Mckee法というものが あるらしいのでそれを実装する  いきなりOpenFOAM上で実装するのは辛い  簡単な問題を解く 8x8なメッシュ上で、 8方向から影響を受ける作用を Cuthill-Mckee法で並列化して ガウスザイデル法で解いてみる 3
  5. 5. 目次  インターンの動機  CuthillMckee法を簡単な問題に適用する – 解く問題について – 疎行列とその取り扱い方(CSR形式) – ヤコビ法とガウスザイデル法、並列化の壁 – Multi Coloring法 – Cuthill-Mckee法, 並列化に向けたCuthillMckee法 – 行列の変換結果 & 確認  OpenFOAMにCuthillMckee法を導入  KNLを使った計算  まとめ&今後 4
  6. 6. 解く問題について 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 5 8x8なメッシュ上 に -1 -1 -1 -1 8 -1 -1 -1 -1 8方向から影響 を受ける作用 を適用した結果 ↑ ある与えられた分布(定数) になるような を探す。
  7. 7. 解く問題について 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 6 8x8なメッシュ上 に -1 -1 -1 -1 8 -1 -1 -1 -1 8方向から影響 を受ける作用 を適用した結果 ↑ ある与えられた分布(定数) になるような を探す。
  8. 8. 解く問題について  8x8 のメッシュ … 長さが64の1次元ベクトル化 7 © 2017 Fixstars Corporation, All rights reserved. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 8x8なメッシュ上 ↑ ある与えられた分布(定数) (未知数) (定数)
  9. 9. 解く問題について 8 8x8なメッシュ上 に -1 -1 -1 -1 8 -1 -1 -1 -1 8方向から影響 を受ける作用 を適用した結果 ↑ ある与えられた分布(定数) になるような を探す。
  10. 10. 解く問題について  行列で表現 – 𝑖: フィルタを番号する中心の セル番号(座標そのものではない!) – 𝑗:フィルタを適用される番号 9 © 2017 Fixstars Corporation, All rights reserved. -1 -1 -1 -1 8 -1 -1 -1 -1 𝑖 (64個) 𝑗(64個) フィルタ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 18,19, 20, 26, 28, 34, 35, 36 が -1 27が8 iは27 𝑨 =
  11. 11. 解く問題について 10 に 8方向から影響 を受ける作用 を適用した結果 ↑ ある与えられた分布(定数) 𝑨 8x8なメッシュ上 になるような を探す。
  12. 12. 解く問題について 11 に 8方向から影響 を受ける作用 を適用した結果 ↑ ある与えられた分布(定数) 𝑨 8x8なメッシュ上 になるような 𝑨𝒙 = 𝑩 を解く問題になる
  13. 13. 解く行列  青: 8  赤: -1 http://proc-cpuinfo.fixstars.com/2016/07/blog-post-html/ 12
  14. 14. 疎行列の取り扱い方  疎行列 … 0がいっぱいあるスカスカの行列 ←→ 密行列  疎行列を普通の配列で格納して計算するのはよくない。 – 疎行列にメモリをO(N^2)かけるのはよくない  疎行列を取り扱うためのデータの格納方法 → 工夫 – 普通の行列… M(i,j) にアクセス – 工夫… [(値の位置, 値の内容), (), ()] のイメージ  CSR形式だと0とそうでない部分を区別可能! スカスカの行列 13
  15. 15. 工夫例: CSR (Compressed Sparse Row)形式  右みたいな行列が与えられたとき、 Value = [a,b,c,d,e,f,g] Column = [0,1,2,0,3,1,3] offset = [0 ,3 ,5,6] offsetは「abc…」 と見ていったときに行が変わるタイミング a,d,f,gのときに行が変わるので、それに対応するindex 0,3,5,6が入っている。 14 0 1 2 3 今回はこれを使っていきます http://www.jicfus.jp/wiki/index.php?CRS%E5%BD%A2%E5%BC%8F
  16. 16. CSR形式に関するライブラリ  boost::numeric::ublas::compressed_matri x<> に対応 15 Value = [a,b,c,d,e,f,g] Column = [0,1,2,0,3,1,3] offset = [0 ,3 ,5,6] 前のページの… Boostの mat.Value_data() mat.index2_data() mat.index1_data()  ベクトルは boost::numeric::ublas::vector<> を使用  疎行列・ベクトル積 boost::numeric::ublas::prod Expression template技法を使っていて一時変数を省略しているらしい
  17. 17. 並列化に向けて  こんな感じのフィルタをかけていくので、 上下左右斜めにある座標のデータに依存。  反復計算をするための2つの方法 – 前のデータのみを使って次の値を更新していく方法…ヤコ ビ法 – 計算済みのデータはその値を使っちゃう方法…ガウスザイ デル法  ガウスザイデル法のほうが計算の収束性が良い! 並列化によって隣接したセルを同時に変更する... お互いに依存しあっているデータを変更し、 計算が不安定に -1 -1 -1 -1 8 -1 -1 -1 -1 16
  18. 18. Multicoloring法  お互いに依存しないように、色分けする  同じ色どうしなら、並列計算してもOK!  色分けして行列を解くということは、 右下のような行列を解くということ  値がとても飛び飛びになる → キャッシュミスが多発  周りの計算されてないノード増加 → 収束性の悪化 → 反復計算の回数が多くなる 17
  19. 19. 行列で見るMultiColoring  で囲った部分が 対角行列  その中では、 𝑖と𝑗は干渉しない  並列化可能 18 © 2017 Fixstars Corporation, All rights reserved.
  20. 20. Cuthill-McKee法  行列をグラフ理論の隣接行列だと思う  次数が少ないノードからスタート  そこからの距離を幅優先探索で求め、 距離ごとにグルーピングする  スタート地点をレベル1, そこから距離が離れる ごとにレベルが1ずつ増える。  Cuthill-Mckee法適用前と収束性は同じ! – 行列の並び替えのコストとの戦い 19
  21. 21. Cuthill-Mckee法 引用 中島研吾 科学技術計算のための マルチコアプログラミング入門 C言語編 第 Ⅱ部:オーダリング http://www.aics.riken.jp/aicssite/wp-content/uploads/2015/05/el_text_sp150305_2C_nakajima.pdf 20
  22. 22. Cuthill-Mckee法の問題点  この処理をすると、散らばっている疎行列を帯行列にま とめることができる(関連が強い点を近くに配置すること ができるため)  並列化をするためには、レベル間での依存関係を取り除 かなければならない  隣接点の隣接点をstd::setに 突っ込んで、同じレベル内 で隣接しないように改良 … 隣接ないようにqueに追加 引用 中島研吾 科学技術計算のための マルチコアプログラミング入門 C言語編 第 Ⅱ部:オーダリング http://www.aics.riken.jp/aicssite/wp-content/uploads/2015/05/el_text_sp150305_2C_nakajima.pdf 21
  23. 23. CuthillMcKee法の実装(並列化)  同じレベル内での隣接点がなく、桂馬飛びのよ うな形に 01 02 03 04 05 06 07 08 03 04 05 06 07 08 09 10 05 06 07 08 09 10 11 12 07 08 09 10 11 12 13 14 09 10 11 12 13 14 15 16 11 12 13 14 15 16 17 18 13 14 15 16 17 18 19 20 15 16 17 18 19 20 21 22 22
  24. 24. Multi-Color法との比較  より帯行列に近いかたちに 23 MultiColor Cutill-Mckee
  25. 25. 対称ガウスザイデル法での残差比較  SymGS, CuthillMckee-SymGSは同じ精度  MultiColorOrderingは収束が遅い 24 © 2017 Fixstars Corporation, All rights reserved.
  26. 26. OSSで公開中  こちらのコードは公開中 25 © 2017 Fixstars Corporation, All rights reserved. https://github.com/fixstars/AlgebraicBlockMulticolorOrdering
  27. 27. 目次  インターンの動機  CuthillMckee法を簡単な問題に適用する  OpenFOAMにCuthillMckee法を導入 – OpenFOAM v.s. 疎行列の格納形式 – DIC前処理の並列化 – 計算条件 – レベルと点の分布 – 実行時間比較  KNLを使った計算  まとめ&今後 26
  28. 28. 解いた問題  計算領域: (x,y,z) = (15.7m, 2m, 6.28m)  分割数: (x,y,z) = (240, 130, 96)  総メッシュ数 = 240 * 130 * 96 ≈ 3 × 106  𝑅𝑒 𝜏 = 110  主流方向 … サイクリック境界 27 x z y cycliccyclic 6.28m 15.7m 2m
  29. 29. 従来研究:OpenFOAMスレッド並列化のための基礎検討 *富岡稔、伊藤優希、丸石崇史、吉藤尚生: OpenFOAMスレッド並列化のための基礎検討(2017)  OpenFOAMはそもそもldu形式 – ldu形式… 下三角(L)、対角(D)、上三角(U)に分解して保 存する  ldu形式では、「疎行列ベクトル積」や 「DIC前処理」が同じアドレスにアクセスする実 装になってしまい、並列化が困難 → CSR形式に* 本インターンシップでは、すでに実装されているCSR形式を使用して、 「Cuthill-Mckee法を用いたDIC前処理の並列化」を実装する 28
  30. 30. OpenFOAMのDIC前処理  DIC前処理の実装 – 𝑨𝒙 = 𝒃 をすばやく解くための前準備 𝒛 = 𝑰 + 𝑫−𝟏 𝑼 −𝟏 𝑰 + 𝑫−𝟏 𝑼 𝑻 −𝟏 𝑫−𝟏 𝒓 を計算する。 29 for (label i=0; i<n; i++) { z[i] = invD[i]*r[i]; } // 前進代入 for (label i=0; i<n; i++) { for (label index = offset[i]; index < offset[i+1]; index++) { const auto j = column[index]; if(j < i) { z[i] -= invD[i] * data[index] * z[j]; } } } Zが相互干渉 富岡稔、伊藤優希、丸石崇史、吉藤尚生: OpenFOAMスレッド並列化のための基礎検討(2017)
  31. 31. OpenFOAMのDIC前処理  DIC前処理はガウスザイデルと同じく 工夫して並列化する必要がある  CuthillMckee, MultiColoring 30 © 2017 Fixstars Corporation, All rights reserved. //後退代入 for (label i=n-1; i>=0; i--) { for (label index = offset[i]; index < offset[i+1]; index++) { const auto j = column[index]; if(i < j) { z[i] -= invD[i] * data[index] * z[j]; } } } zが相互干渉
  32. 32. OpenMP v.s. OpenMPI  OpenMP(スレッド並列) – CuthillMckee法を用いて、DIC前処理を並列化 – それ以外の部分は1並列  OpenMPI(プロセス並列) – 計算領域を分割 – それぞれの領域でプロセスを割り当てて計算 – 領域間の必要なデータはプロセス間通信でやり取り 31 © 2017 Fixstars Corporation, All rights reserved.
  33. 33. 目次  インターンの動機  CuthillMckee法を簡単な問題に適用する  OpenFOAMにCuthillMckee法を導入  KNLを使った計算  今後 32
  34. 34. 今後の予定  OpenMPを用いたスレッド並列と、 従来のMPIのプロセス並列の比較を行いたい – それぞれの処理時間を計測するプロファイラの実装 – すべての処理をスレッド並列化して比較 33 © 2017 Fixstars Corporation, All rights reserved.

×