★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
並列計算を考える
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
CAE(解析)の計算を高速にするにはいくつかの方法が考えられます。 列挙すると
・ 解析ソルバーのアルゴリズムを再設計して高速化する。
・ 1CPUで高速なコンピュータを準備する。
・ 多くのCPUに対応した並列計算処理を行う。
に大きく分けられるかと思います。
しかしソフトウェアの変更は自作のソルバーであれば良いですが、ベンダー提供のソフトウェアだと簡単にはいきません。また1CPUの性能向上もハードベンダーに依存することであり、ユーザとしては変えることが難しいことになります。 最後に残された方法は並列計算を行うことにより高速化を行うことになります。 ここでは、この並列化についてその幾つかの方法をご説明いたします。
−並列化の歴史−
並列化の歴史は大きく分けて以下の図のようになるかと思います。 この説明以外に1990年前後にnCUBEやMasParのようにMPPと言われた多くのCPUを接続した計算サーバーが作られましたが、いつの間にか消え去ってしまったようです。
解析の計算では最初は1CPUでの計算でしたが1980年代からマルチスレッドを利用した共有メモリー環境での並列化が始まりました。
これが1980年代から1990年代での並列化です。 そしてマルチスレッドの並列化も1990年代の中頃に出たOpenMPによる標準化により、アプリケーションの作成が非常に楽になりました。今でもマルチスレッドのアプリケーションは使われておりますが、CPU数が多くなった場合にオーバーヘッドがかかり性能が伸びなくなります。マルチスレッドのアプリケーションでの並列化は、せいぜい4〜8CPUでの並列計算が一般的です。
1990年頃にPVM、MPIの仕様ができノードを越えた並列計算が可能になりました。 具体的に市販のアプリケーションで採用されるようになった2000年頃からはMPIによるアプリケーションが主流になりました。 理由としては大きなモデルだと並列度が伸びて32CPU、64CPUといった大規模並列計算でもリニアに計算性能が伸びてきたためです。
その次には2000年代の後半からGPUを利用した並列化が脚光を浴びるようになりました。理由としては
GPUは非常に沢山のコアを持っている
価格がコンピュータを購入することに比べると非常に安い
プログラミングツールとしてCUDA等が現れてプログラミングが楽になった
が考えられます。 ただデータ転送がPCIである為にCPUとGPUとの間でのデータ転送を効率的に行わないと性能が発揮できません。 これはプログラミング技術やアルゴリズムの設計に依存するところが大きいと思われます。
以上より、現在の並列アプリケーションの主流はMPIによる分散並列が主流で安定しております。次はGPUがどのくらい使いものになるかが楽しみな状況です。
|
−マルチスレッドによる並列化−
マルチスレッドのアプリケーションはメモリーを共有して同じメモリーを複数のCPUがお互いにデータを壊さないようにして計算をする並列計算です。具体的にはFortranのDO文、Cのfor文でソルバーが使う行列を複数のCPUで分担して計算しております。
複数のCPUが一つのジョブの指示を受けて計算を並行して行います。
|
以下の例に示すようにプログラミングは簡単です。どこに計算の負荷がかかっているか判れば簡単に並列化ができます。ただ変数が独立でないと並列化できないので注意が必要です。 もっと簡単に並列化する方法はコンピュータベンダーやコンパイラベンダーがLAPACKやBLASのライブラリを並列化して販売しているので、ユーザはデータの準備と後処理をシリアル自分で作成し、並列部分はライブラリを使うことにより信頼性が高く、性能の良い並列アプリケーションを作成することができます。
|
−MPIによる並列化−
MPI(Message Passing Interface)による並列化はユーザから見たプログラムは一つですが起動をかけると、複数のジョブが自動生成されて並行して実行されます。プログラムを作成する人はデータから
いくつのジョブを生成するか
データをどのように分割するか
といったことをプログラム上に組み込んであげます。 これにより領域分割、周波数分割といった具合にデータを分割して独立した別個のジョブを生成して実行することができます。
この為にジョブはMPIの管理下にあれば一つのコンピュータの上で6つ生成することも、複数のコンピュータで一つずつ6台のコンピュータに分けて実行することも可能です。 この分散方法はMPIの実装により異なりますがMicroSoftのMPIだと –machinefile 、 -host 、 -hosts 等を指定して実行するコンピュータを指定することになります。 またどのコンピュータで幾つのジョブを実行するかも指定できます。
良く耳にすることですがSMPマシンではMPIで作った分散アプリケーションを実行できないと思われている方もいるようですが、8CPU(8コア)あるマシン一つでMPIのジョブを流して8並列の実行をすることが可能です。無駄なことですが8CPU(8コア)のコンピュータで16並列を流すことも可能です。 しかしシステムの効率的な運用から考えた時はお勧めではありません。またコンピュータがファイルサーバーやジョブ管理をしている場合は、その分、コンピュータの負荷を少なくするようにジョブ数を減らしてあげる必要があります。
|
以下の例に示すのがサンプルのプログラミングです。非常に簡単に書いているので問題も多々ありますが雰囲気をつかんで頂くには十分かと思います。実行は
mpirun -np 8 -machinefile hosts.list test_app
とした場合、hosts.list のファイルで指定した各コンピュータで8つのジョブを実行します。 プログラム上では当然一つのプログラムでデータを分割して各コンピュータに割り振り、全ての計算が終了したら各コンピュータからデータを集めて一つの意味のあるデータに変換してあげる必要があります。
|
−GPUによる並列化−
GPUコンピューティングによる並列化が注目を集めております。東工大のTUBAMEが多くのGPUを搭載して計算性能を上げており、中国や他の国のスーパーコンピュータでも優れた性能を発揮しております。 GPUはワークステーションやサーバーに搭載して448コアで並列計算を行うことが可能です。 ここ数年の旬なスーパーコンピュータの要素技術です。 多くのCAEのアプリケーションベンダーがGPUの利用を調査・検討を進めております。
システムの構成イメージ
|
||||
|