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.

DIC-PCGソルバーのpimpleFoamに対する時間計測と高速化

369 views

Published on

DIC-PCGソルバーのpimpleFoamに対する時間計測と高速化

Published in: Software
  • Be the first to comment

  • Be the first to like this

DIC-PCGソルバーのpimpleFoamに対する時間計測と高速化

  1. 1. DIC-PCGソルバーの pimpleFoamに対する 時間計測と高速化 富岡 稔, 澤原 雅隆, 藤原 巧, 𠮷藤 尚生
  2. 2. 目次 前回までの復習 – 目標 – 疎行列形式の変更 – Cuthill-McKee法による並列化の実装 時間計測 さらなる高速化 まとめ・今後の予定 © 2019 Fixstars Corporation, All rights reserved. 1
  3. 3. 目次 前回までの復習 – 目標 – 疎行列形式の変更 – Cuthill-McKee法による並列化の実装 時間計測 さらなる高速化 まとめ・今後の予定 © 2019 Fixstars Corporation, All rights reserved. 2
  4. 4. 目標 OpenFOAMのスレッド並列化を行いたい – メニーコア環境だとハイブリッド並列の方が フラットMPIよりも有利 OpenFOAMはそのままではスレッド並列 化が困難であるため、コードに手を加える 必要がある © 2019 Fixstars Corporation, All rights reserved. 3
  5. 5. 疎行列形式の変更 並列化のために「lduMatrix形式」から 「CSR形式」に変更 CSR形式を用いることで、疎行列ベクト ル積(SpMV)をスレッド並列化可能に © 2019 Fixstars Corporation, All rights reserved. 𝑈 𝐿 𝐷 A lduMatrix形式 CSR形式 OpenFOAMスレッド並列化のための基礎検討 (http://proc-cpuinfo.fixstars.com/2018/02/openfoam-thread/) 4
  6. 6. Cuthill-McKee法 CSR形式でもDIC前処理はデータの依存性 により並列化が不可能 Cuthill-McKee(CM)法により依存を排除し、 DIC前処理をスレッド並列化可能に © 2019 Fixstars Corporation, All rights reserved. Cuthill-McKee法 CuthillMckee法によるOpenFOAMのDIC前処理に関するスレッド並列化 (http://proc-cpuinfo.fixstars.com/2018/06/openfoam/) 5
  7. 7. 目次 前回までの復習 – 目標 – 疎行列形式の変更 – Cuthill-McKee法による並列化の実装 時間計測 さらなる高速化 まとめ・今後の予定 © 2019 Fixstars Corporation, All rights reserved. 6
  8. 8. 時間計測  これまではプロファイラが未実装 – 実行時間の比較ができていない  プロファイラを実装し、オープンCAE学会がベンチ マークとして作成したチャネル流問題[1]を使用して 時間を計測  設定 – solver: pimpleFoam – 5ステップだけ計算  環境 – Xeon Phi 7210 (64コア, 256スレッド)  OpenFOAM (Foundation版) Git-ID:16b559c1 © 2019 Fixstars Corporation, All rights reserved. [1] OpenFOAM Benchmark Test for Channel Flow (Re_tau=110), https://gitlab.com/OpenCAE/OpenFOAM-BenchmarkTest/tree/master/channelReTau110 7
  9. 9. 時間計測(変更なし版) 結果 PCGの実行時間が大部分を占めている – PCGのみに着目すればよい © 2019 Fixstars Corporation, All rights reserved. 8 0 100 200 300 400 500 600 700 800 900 1000 1100 1200 CoreLoop pEqn PCG CoreLoop pEqn PCG DDR4 MCDRAM 実行時間[s] 全体の実行時間 UEqn pEqn PCG 疎行列ベクトル積 DICcalcReciprocalD DIC前処理 WAXPBY normFactor sumMag sumProd
  10. 10. スレッド並列化の前に… スレッド並列化する前に、フラットMPI 並列ではどれくらい高速化できるのか確認 DDR4では32倍, MCDRAMでは84倍 – スレッド並列でもこれくらい速くすることが 目標 9 © 2019 Fixstars Corporation, All rights reserved. プロセス 数 DDR4 MCDRAM 実行時間[s] 高速化率 実行時間[s] 高速化率 1 208 x1 210 x1 64 9.3 x22 5.5 x38 128 6.5 x32 2.5 x84 256 18 x12 11 x19
  11. 11. CSR化 疎行列形式をlduMatrix形式からCSR形式 に変更した際に、実行時間に変化があるか を確認 © 2019 Fixstars Corporation, All rights reserved. 𝑈 𝐿 𝐷 A lduMatrix形式 CSR形式 10
  12. 12. 時間計測 DIC前処理の実行時間が増加 © 2019 Fixstars Corporation, All rights reserved. 11 0 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 lduMatrix形式 CSR形式 lduMatrix形式 CSR形式 DDR4 MCDRAM 実行時間[s] PCG 疎行列ベクトル積 DICcalcReciprocalD DIC前処理 WAXPBY normFactor sumMag sumProd (other)
  13. 13. 行列のデータの持ち方を変更 DIC前処理の実行時間が増加してしまった アクセスパターンの違いが原因? – lduMatrix形式では全ての要素が連続アクセス – CSR形式では行列全体を持っているため一部 のアクセスが連続でない CSR形式において上三角部分と下三角部 分も別に保持し、それを使用 © 2019 Fixstars Corporation, All rights reserved. A L 12
  14. 14. 変更結果 lduMatrix形式と同程度になった © 2019 Fixstars Corporation, All rights reserved. 13 0 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 変更前 変更後 変更前 変更後 lduMatrix形式 CSR形式 lduMatrix形式 CSR形式 DDR4 MCDRAM 実行時間[s] PCG 疎行列ベクトル積 DICcalcReciprocalD DIC前処理 WAXPBY normFactor sumMag sumProd (other)
  15. 15. スレッド並列化 SpMVおよびDIC前処理は並列化可能 – SpMV: CSR化 – DIC前処理: CSR化 + CM法 OpenMPを用いてスレッド並列化 OpenMPの設定は明記されていない場合は デフォルト(256スレッド) © 2019 Fixstars Corporation, All rights reserved. 14
  16. 16. 0 100 200 300 400 500 600 700 800 900 1000 lduMatrix形式 CSR化のみ 並列化 lduMatrix形式 CSR化のみ 並列化 DDR4 MCDRAM 実行時間[s] PCG 疎行列ベクトル積 DICcalcReciprocalD DIC前処理 WAXPBY normFactor sumMag sumProd CuthillMcKee (other) 時間計測 スレッド並列化によるSpMVおよびDIC前 処理の高速化を確認 © 2019 Fixstars Corporation, All rights reserved. 15 DIC 前処理 x3.3 SpMV x11.4 DIC 前処理 x3.4 SpMV x13.5 CM法 CM法
  17. 17. 目次 前回までの復習 – 目標 – 疎行列形式の変更 – Cuthill-McKee法による並列化の実装 時間計測 さらなる高速化 まとめ・今後の予定 © 2019 Fixstars Corporation, All rights reserved. 16
  18. 18. スレッド数の調整 スレッド数を変えたときにSpMVおよび DIC前処理の実行時間が変化するかを 確認 (単位[s]) スレッド数によって、実行時間が大きく 異なる場合があるため、調整が必要 © 2019 Fixstars Corporation, All rights reserved. スレッド数 DDR4 MCDRAM SpMV DIC前処理 SpMV DIC前処理 64 17.6 123.6 13.8 122.7 128 21.0 108.7 17.7 105.7 256 27.8 160.8 23.7 152.1 17
  19. 19. 行列の並び替え DIC前処理を行う際に、アクセスする行列 の要素が飛び飛びになっている – キャッシュミスを誘発 並び替えを行って実行時間の変化を確認 © 2019 Fixstars Corporation, All rights reserved. 18
  20. 20. 行列の並び替え CSR形式の場合は、行ごとに列番号を変 換しながらコピーを行えばよい 行列をL, D, Uに分けた後で並び替えを 行うと、L, Uが三角行列にならないことに 注意 © 2019 Fixstars Corporation, All rights reserved. 1 a b A 2 B 3 c d C 4 D 5 3 c d B C 4 D 5 b 1 a A 2 並び替え 19
  21. 21. ベクトルの並び替え 前処理行列を𝑀とおくと、前処理は以下の 式で表される 𝑧 = 𝑀−1 𝑟 並び替えた前処理行列 𝑀′ = 𝑃𝑀𝑃 𝑇 を用い ると、前処理は以下の通りに計算できる 𝑧 = 𝑀−1 𝑟 = 𝑃 𝑇 𝑀′ 𝑃 −1 𝑟 = 𝑃 𝑇 𝑀′−1 𝑃𝑟 1. 𝑟′= 𝑃𝑟 2. 𝑧′ = 𝑀′−1 𝑟′ 3. 𝑧 = 𝑃 𝑇 𝑧′ ベクトルの並び替えの処理も追加で必要 © 2019 Fixstars Corporation, All rights reserved. 20
  22. 22. 行列の並び替えの結果 実行時間の変化を確認 (単位[s]) DIC前処理の変更前後の最短の実行時間は それぞれ105秒と39秒 – 約2.7倍の高速化 © 2019 Fixstars Corporation, All rights reserved. スレッド数 DDR4 MCDRAM DIC前処理 CM法 DIC前処理 CM法 変更前 変更後 変更前 変更後 変更前 変更後 変更前 変更後 64 123.6 61.7 95.5 112.8 122.7 39.4 103.3 119.2 128 108.7 80.5 94.1 110.0 105.7 50.8 99.8 118.2 256 160.8 164.6 97.4 110.5 152.1 91.9 103.1 120.6 21
  23. 23. DDR4 vs. MCDRAM 変更前は実行時間にあまり差がなかったが、 高速化によって差が大きくなった 22 © 2019 Fixstars Corporation, All rights reserved. 0 20 40 60 80 100 120 140 160 180 DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM 64 threads 128threads 256 threads 64 threads 128 threads 256 threads 変更前 変更後 実行時間[s] DIC前処理
  24. 24. ほかの部分の並列化 ボトルネックだった部分が高速化されたこと によって、ほかの部分が重くなってきた – WAXPBY – リダクション演算(sumMag, sumProd) これらを並列化する © 2019 Fixstars Corporation, All rights reserved. 23 0 100 200 300 400 500 600 700 800 900 1000 lduMatrix形式 CSR化のみ 並列化 lduMatrix形式 CSR化のみ 並列化 DDR4 MCDRAM 実行時間[s] PCG 疎行列ベクトル積 DICcalcReciprocalD DIC前処理 WAXPBY normFactor sumMag sumProd CuthillMcKee (other)
  25. 25. WAXPBYの並列化 WAXPBY: 𝐰 = 𝑎𝒙 + 𝑏𝒚 という形で表され る計算 ループ間に依存関係がないため並列化可能 © 2019 Fixstars Corporation, All rights reserved. for (int i = 0; i < n; i++) { w[i] = a * x[i] + b * y[i] } #pragma omp parallel for for (int i = 0; i < n; i++) { w[i] = a * x[i] + b * y[i] } 24
  26. 26. WAXPBYの並列化の結果 並列化後の平均実行時間を確認 高速化率 – DDR4: x19 – MCDRAM: x67 © 2019 Fixstars Corporation, All rights reserved. 25 スレッド数 DDR4 [ms] MCDRAM[ms] 1 25.961 26.139 64 1.339 0.440 128 1.342 0.387 256 1.539 0.493
  27. 27. WAXPBYの並列化の結果 並列化後の平均実行時間を確認 高速化率 – DDR4: x19 – MCDRAM: x67 © 2019 Fixstars Corporation, All rights reserved. 26 0 5 10 15 20 25 30 DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM 1 thread 64 threads 128 threads 256 threads 平均実行時間[ms] WAXBPY
  28. 28. リダクション演算の並列化 リダクション演算の例として内積がある 内積(𝑠 = 𝒙 𝑇 𝒚)は以下のように計算できる このような計算を並列化するには、リダク ション指示節を用いればよい © 2019 Fixstars Corporation, All rights reserved. double s = 0.0; for (int i = 0; i < n; i++) { s += x[i] * y[i] } double s = 0.0; #pragma omp parallel for reduction(+:s) for (int i = 0; i < n; i++) { s += x[i] * y[i] } 27
  29. 29. リダクション演算の並列化の結果 © 2019 Fixstars Corporation, All rights reserved. sumMag sumProd DDR4 x31 x25 MCDRAM x47 x56 並列化後の平均実行時間を確認 高速化率 28 スレッド数 sumMag sumProd DDR4[ms] MCDRAM[ms] DDR4[ms] MCDRAM[ms] 1 14.907 14.962 18.402 18.267 64 0.480 0.317 0.727 0.325 128 0.565 0.343 0.780 0.364 256 1.253 1.137 1.380 1.101
  30. 30. リダクション演算の並列化の結果 © 2019 Fixstars Corporation, All rights reserved. sumMag sumProd DDR4 x31 x25 MCDRAM x47 x56 並列化後の平均実行時間を確認 高速化率 29 0 2 4 6 8 10 12 14 16 18 20 DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM 1 thread 64 threads 128 threads 256 threads 平均実行時間[ms] sumMag sumProd
  31. 31. SpMVの高速化率について SpMVが MCDRAM-256スレッド でも13倍 しか速くなっていないのはおかしい 計測範囲内に含まれていた updateMarixIntefaces(...)(未並列)が原因 分けて計測した時のSpMVの高速化率 30 © 2019 Fixstars Corporation, All rights reserved. スレッド数 DDR4 MCDRAM 64 x24 x34 128 x25 x43 256 x24 x68
  32. 32. 現状のスレッド並列化の結果 スレッド並列化の結果 PCG全体の高速化率 – DDR4: x4.3, MCDRAM: x4.8 © 2019 Fixstars Corporation, All rights reserved. 31 0 100 200 300 400 500 600 700 800 900 1000 変更前 64 threads 128 threads 256 threads 変更前 64 threads 128 threads 256 threads DDR4 MCDRAM 実行時間[s] PCG 疎行列ベクトル積 Cuthill-McKee法 DICcalcReciprocalD DIC前処理 WAXPBY normFactor reorderVector sumMag sumProd updateMatrixInterfaces (other)
  33. 33. 現状のスレッド並列化の結果 個別の高速化率 – DIC前処理があまり速くなっていない 並列化前にはなかったCM法が、実行時間 のかなりの割合を占めている © 2019 Fixstars Corporation, All rights reserved. DDR4 MCDRAM SpMV x25 x68 DIC前処理 x6.7 x10 WAXPBY x19 x67 sumMag x31 x45 sumProd x21 x44 (理想高速化率) x32 x84 32
  34. 34. 目次 前回までの復習 – 目標 – 疎行列形式の変更 – Cuthill-McKee法による並列化の実装 時間計測 高速化 まとめ・今後の予定 © 2019 Fixstars Corporation, All rights reserved. 33
  35. 35. まとめ プロファイラを作成し、実行時間を計測した ボトルネックであるPCGのSpMVおよびDIC 前処理をスレッド並列化した。それに加えて 様々な高速化も行った – SpMVは最大68倍の高速化 – DIC前処理は最大10倍の高速化 DIC前処理とCM法がボトルネックとなり、 PCG全体の高速化率は4.8倍にとどまった – まだまだ高速化が必要 © 2019 Fixstars Corporation, All rights reserved. 34
  36. 36. 今後の予定 CM法の実行時間短縮 – 疎行列の構造が変化しない場合は最初の1回の 結果を使い回す – 差分更新が可能かを調査・検討 – CM法自体の高速化(並列化) © 2019 Fixstars Corporation, All rights reserved. 35
  37. 37. 今後の予定 DIC前処理の高速化 – 前処理を行う度にベクトルの並び替えを行っ ており、ここでも時間がかかっている – 代わりにPCGの最初と最後にベクトルの並び 替えを行うような実装に変更する • 𝐴𝒙 = 𝒃 ⇔ 𝐴′ 𝒙′ = 𝒃′ (𝐴′ = 𝑃𝐴𝑃 𝑇, 𝒙′ = 𝑃𝒙, 𝒃′ = 𝑃𝒃) – 高速化率は10倍→16倍に改善されるはず – 理想高速化率は84倍なのでそれでも足りてな い。さらなる高速化方法を調査する © 2019 Fixstars Corporation, All rights reserved. 前処理全体[s] 並び替え[s] 39.7 14.1 (36%) 36

×