このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
初めまして。アルバイトの富岡(稔)です。2019年4月に弊社で開催された第75回オープンCAE勉強会@関東(流体など)【大崎】で発表をしてきました。これはその報告記事です。
取り組んでいる背景などについては過去の記事を読んでいただければと思いますが、この取り組みの目標はOpenFOAMというソフトウェアをスレッド並列化にて高速化することでした。前回の発表までで、ボトルネックになると考えられる行列演算(疎行列ベクトル積とDIC前処理)はそれぞれ、
を行うことによりスレッド並列化が可能であるということが分かっていました。
高速化に先んじて、時間比較を行うためのプロファイラを作成しました。また、OpenMPを用いて実際にスレッド並列化を行うことで、処理の高速化に取り組みました。
スレッド並列化を行う前に、プロファイラを用いて実行時間の計測を行い、どこがボトルネックなのかを確認しておきます。計測にはオープンCAE学会がベンチマークとして作成したチャネル流問題を使用しました。
実行設定・環境は以下の通りです。
これを見ると、PCGが全体の実行時間の大部分を占めていることが分かります。なので、当分の間はPCGの高速化に専念すればよさそうです。また、想定していた通り行列演算に時間がかかっていることも確認できます。
それでは、スレッド並列化を行うことで高速化を試みます。並列化の対象は以下の通りです。
OpenMPを用いてスレッド並列化を行いました。この際、疎行列ベクトル積およびDIC前処理を並列化するために、疎行列形式の変換およびCuthill-McKee法の処理を追加で行っています。また、Cuthill-McKee法の結果を用いて行列の並び替えを行うことにより、DIC前処理の高速化を試みています。
実装の詳細についてはスライドを見てもらうとして、ここにはその結果のみを記します。スレッド数を変えて計測したときの、PCG全体の結果と、処理ごとの最大の高速化率は以下の通りです。
処理 | DDR4 | MCDRAM |
---|---|---|
疎行列ベクトル積 | x25 | x68 |
DIC前処理 | x6.7 | x10 |
WAXPBY | x19 | x67 |
sumMag | x31 | x45 |
sumProd | x21 | x44 |
これらから分かることをまとめると、
となります。
ちなみに、フラットMPI並列だとどのくらいの高速化率なのか気になる人もいると思うので記しておくと、DDR4で32倍、MCDRAMで84倍でした。スレッド並列化でもこれくらい速くすることが目標となるわけですが、現状だと全然足りてないですね。
個々の処理を見ると十分に高速化できているものもありますが、一部の処理(DIC前処理・Cuthill-McKee法)がボトルネックとなり、全体でみるとまだまだ高速化が必要なのが現状です。そのため、今後も引き続き高速化に取り組んでいきます。
keisuke.kimura in Livox Mid-360をROS1/ROS2で動かしてみた
Sorry for the delay in replying. I have done SLAM (FAST_LIO) with Livox MID360, but for various reasons I have not be...
Miya in ウエハースケールエンジン向けSimulated Annealingを複数タイルによる並列化で実装しました
作成されたプロファイラがとても良さそうです :) ぜひ詳細を書いていただきたいです!...
Deivaprakash in Livox Mid-360をROS1/ROS2で動かしてみた
Hey guys myself deiva from India currently i am working in this Livox MID360 and eager to knwo whether you have done the...
岩崎システム設計 岩崎 満 in Alveo U50で10G Ethernetを試してみる
仕事の都合で、検索を行い、御社サイトにたどりつきました。 内容は大変参考になりま...
Prabuddhi Wariyapperuma in Livox Mid-360をROS1/ROS2で動かしてみた
This issue was sorted....