1. 並列化
2. 検証
2.1 verification
2.2 validation
3. おわりに
1. 並列化
前回並列計算機について紹介し、主にハードウェア構成の違いに起因する二種類の並列化手法、プロセス並列とスレッド並列について言及しました。ここではこれら二種類の並列化手法についてもう少し詳しく説明します。
プロセス並列は並列化の単位がプロセスと呼ばれる実行単位で、各プロセスはそれぞれ独自のメモリ空間を持っており、互いに他プロセスのメモリ空間へのアクセスは自由にはできません(図1を参照)。他プロセスのメモリ空間へアクセスする場合は、データ転送と呼ばれる手続を明示的に行なう必要があります。例えば富士通の XPFortran (VPP-Fortran の後継) では配列を各プロセスに分割しますが、その時に袖 (overlap) と呼ばれるオプションを設定することで、それぞれ分割された配列に対して、隣の配列の値を持つための袖と呼ばれる重複領域を持たせることができます。その上でプログラム中において明示的に overlapfix 関数を呼び出すことで袖部のデータ更新、つまりデータ転送を行ないます。また、より一般的なデータ転送機能も用意されています。並列化ライブラリである MPI ではもっと直接的に MPI_send、MPI_recv といったデータ転送用の関数を用いてユーザーが明示的にデータ転送を行なう必要があります。

図1:プロセス並列
一方スレッド並列は並列の単位がプロセスの中のスレッドという単位になります。スレッドはプロセスの中に複数生成され、プロセス内のメモリ空間を共有することができます。そのためスレッド並列の場合、各スレッドは単一のメモリ空間に自由にアクセスすることができるためスレッドが担当するメモリ空間、それによって考慮しなくてはならないデータ転送といった事を考える必要はありません。勿論必要に応じて各スレッドにローカルなメモリ空間を利用することもできます。例えば Doループをスレッド分割 (並列) する場合は、ループ変数(イタレータ)はローカル変数、つまりそれぞれのスレッドで別の値を持たせないとループが正常に廻らなくなります。
スレッド並列の特長としてプログラムの一部分だけの並列化が可能です。このため既存プログラムの並列化を行なう際に、実行負荷が高いところから順次スレッド並列化を行なうことができ、そういった並列化の途中でもプログラムの実行が可能です。そのためある意味並列化作業がやりやすいと言えます。プロセス並列ではこういった芸当は非常に難しく、特に HPF や XPFortran といったデータ、手続分割型である並列Fortranを用いた場合、プログラム全体の並列化が一通り完了するまではプログラムを実行させることはできません。つまり、実行させながらの並列化が不可能ということになります。

以上をまとめると表1 のようになります。この様にプロセス並列とスレッド並列はそれぞれ特長を有しています。更にはプロセス並列とスレッド並列を組み合わせたハイブリッド並列も可能であり、一般的には使用する計算機のハードウェアに依存するにしてもどの並列化手法を用いるのかは充分検討する必要があります。
表1:プロセス並列とスレッド並列の比較
項目
|
プロセス
|
スレッド
|
|
|
|
メモリ空間
|
独立
|
共有
|
変数
|
ローカル
|
ローカル
グローバル
|
マシン
|
分散メモリ
共有メモリ
|
共有メモリ
|
プログラムの並列化
|
全体
|
一部でも可
|
データ転送
|
明示的
|
無
|
言語
|
並列 Fortran
(コンパイラ)
MPI
(ライブラリ)
|
自動並列
(コンパイラ)
OpenMP
(コンパイラ)
|
2. 検証
前回、「1. CFD とは」の最期に言及した様に、数値シミュレーションでは、物理現象をモデル化して計算機を用いて計算結果を得るまでのそれぞれの段階で、様々な誤差が混入します。こららの誤差が本質的な影響を及ぼさなければ問題ないわけですが、流体の様な非線形性が強い現象ではそうはいきません。数値シミュレーションにおいては、計算して得られた結果が常に実際の物理現象と本質的に同じ現象を再現しているかという懸念がかならず付きまといます。そのため計算結果を理論解や実験/観測データと比較することで充分な検証を行なうことが非常に重要となります。検証には得られた計算結果が数値解として正しいか、つまり与えられた基礎方程式が正しく解けているかを確認する verification と、実際の物理現象として正しいか、言いかえると物理現象を正しくモデル化しているかを確認する validation とがあり、数値シミュレーションの計算結果の信頼性を確立する上ではこれら verification と validation の両方が非常に重要となります。
CFD における verification としては、様々なものがありますが、最も一般的で重要なのは格子収束性です。本来連続な偏微分方程式の時空間分布を有限幅の計算格子、時間刻で離散化することによって計算を行なっています。素姓の良い(言いかえれば consistent な) 離散化手法を使っていれば、この有限幅を無限に小さくすることで元の連続な偏微分方程式に近づけることができます。つまり粗い格子 (離散化の有限幅が大きい) の解よりも細かい格子の解の方がより元の偏微分方程式の解に近づくことになります。現実問題としては、計算機のメモリと処理速度、さらには結果を得るまでの時間といった制約から無限に細かな格子を使うことは不可能です。そのため、適当な粗さの格子で解析を行うことになるため、得られた結果がどの程度の近似になっているかは常に注意する必要があります。そのため、ある粗さの計算格子で得られた計算結果と、倍に細かくした (三次元だと x,y,z 方向にそれぞれ2倍で合計8倍) 格子で得られた計算結果を比較して、求めたい物理量に差がない、もしくは要求精度以下の差であることを確認するといった方法が良く行なわれます。
現実問題として流体の数値解析では、計算結果は計算格子に大きく影響を受けます。格子点数が違う場合はもとより、同じ格子点数でも格子の質の違いによって解が大きく異ることもあります。ここでいう格子の質とは直交性、隣接する格子点間隔の比、格子の曲率などで、定量的に評価することが難しく、経験的に判断されています。一般に良い計算格子というのは見た目が奇麗な格子と言われています。
2.2 validation
計算結果と実験/観測データとを比較することで計算結果が正しいかどうかを検証します。一昔前は計算結果と実験データ (例えば風洞の計測データ) と比較して、両者が合っていれば良として、差があれば計算の方に問題があると言われていました。しかしながら、最近の CFD 技術の進歩とともに CFD の信頼性も向上し、両者の比較に於いて一方的に計算に問題があるという状況から相互に問題点を検討する様になり、時には実験に問題があるという指摘を行なえるまでになってきました。勿論、CFD にもまだまだ課題 (例えば、乱流、大剥離、層流から乱流への遷移など) が残されていますが、ある状況下では風洞と同じか、状況によっては風洞以上の信頼性を持つようになりました。と言うのも風洞もある意味知りたい現象を模擬しているため、何らかの誤差要因が存在することを免れないためです。風洞実験では模型であったり、実際なら存在しない風洞壁があったりと、実物の航空宇宙機の飛翔環境とは異った環境であり、本来計測したい現象とは異った条件でのデータを計測している事になります。ですから、風洞も CFD と同じように本来知りたい現象に対して少なからず誤差要因を抱えています。とは言うものの、風洞が実際に取扱っているのはあくまで現実の物理現象であるため、CFD と比べれば遥かに信頼できるものであることには変りありません。そういった意味で風洞データが正しいとして計算結果の検証に使われて来ましたが、今や CFD も風洞も同程度の精度* を持つようになりました。そのため、従来の計算と実験といった相対する立場からの一方的な比較から、相互検証、更にはお互いのメリットを活かして相互補間することでお互いの信頼性向上と、風洞/CFD 連携による新しい取組が試みられています。
*実際問題どの程度の精度かと言うと、航空機の巡航状態での抵抗係数の推算では CFD も風洞も大体10カウント (1カウント=0.0001)程度の誤差があります。
1カウントは例えば大型の旅客機では抵抗係数の約 0.4 %に相当し、ペイロードに換算すると 450Kg 程度になります。
3. おわりに
CFD 技術の発達にともない、研究のための CFD からツールとしての CFD という性格が強く意識されるようになりました。基礎的な流体現象の解明にも使われますが、その多くは実際の物作りにおける設計、解析ツールとして幅広く活用されるようになりました。設計と言えば最近では最適化に関する研究が盛んに行なわれています。最適化、数値シミュレーション、計算機という三種の神器がまさに最新の設計技術を支えていると思います。そういった工学的な観点からすると CFD が目指すべきものの一つは最適化のための CFD (ちょっと土俵が違うものを敢えて並べていますが) ではないないかと考えています。
|