対象プログラム | 粒子フィルタ法による長期潮位変動解析プログラム |
アプリケーション名 | SLDECOMP |
チューニング方法 | 足し合わせ処理で非ゼロ成分のみを加算するように変更、内部ループにおける配列要素アクセス順序を連続的になるよう変更、可能な部分においてメモリの領域コピーを参照コピーに変更。 |
成果 | 計算速度が5.3倍になった。 |
粒子フィルタ法による長期潮位変動解析プログラム(SLDECOMP)の速度を改善
プロジェクトの背景
お客様は数十年分の月次潮位データからプレート運動と関連の深い地殻運動を抽出することを目的とするアルゴリズムの研究を行っています。本事例ではその研究で利用される粒子フィルタ法を用いた時系列解析プログラムのパフォーマンスを改善しました。オリジナルのコードはFortran言語で記述されており既にMPIで並列化されたコードでした。また既にスケーラビリティにも優れており、ノード数/コア数の増加に応じて総計算時間が短くなる状況でしたが、本事例ではそこから更なる改善を試みました。
プロジェクトの結果
プログラム内で負荷の高い部分を中心に改善を行い、スケーラビリティを犠牲にすることなくパフォーマンスを大幅に(5.3倍)改善しました。
詳細
まずプログラムを複数の処理領域に分けてパフォーマンスを測定しました。パフォーマンスの測定にあたっては通常計算時の100分の1の反復数で行いました。計測の結果からある特定の部分(処理領域番号23)がボトルネックであることが特定できました。当該処理部分は2つの繰り返し処理から構成される処理であり、更なる調査の結果そのうちの一つの繰り返し処理で最も時間がかかっていることが特定できました。 (図1)
この最も時間のかかっている部分は、多数の数値の合計を求める部分でしたが、計算の都合上多くのゼロ成分が加算対象となっていました。これについて非ゼロ成分のみが加算対象になるような改変を行ったところ、パフォーマンスが大きく改善されました。 (図2)
この改善により処理領域24と25の実行時間が相対的に大きなものとなったので次に処理領域24に着目しました。 処理領域24は複数の繰返し処理により配列データをアクセスして行くものでしたが、内側ループ内のいくつかの箇所で配列要素への参照が非連続的に行われている事がわかりました。キャッシュをより効率的に活用するために、これらについてはメモリ上でより連続的にアクセスされるような変更を行いました。 その結果、処理領域24の実行時間を約40%削減することができました。 (図3)
次に処理領域25で行われている処理に着目しました。そこでは純粋な配列コピーが行われている事がわかり改善の余地があると思われたので、配列のポインタを定義し配列の参照コピーを行うように変更しました。その結果処理領域25の実行時間はほぼゼロとなり更なるパフォマンスアップが達成されました。(図4)
これらのすべての改善により、全体的なパフォマンスはオリジナルコードの約5.3倍となりました。
最後にこれらの変更を行ったことによってスケーラビリティーが犠牲になっていないかどうかを検証しました。いくつかの異なるノード数/コア数での処理時間を計測し、スケーラビリティーに新たな問題が生じていない事を確認しました。
以上
さらに詳しくお知りになりたい場合は、日本NAG株式会社 コンサルティンググループご相談窓口 https://www.nag-j.co.jp/nagconsul/toiawase.htm (あるいはメール:consul@nag-j.co.jp)までお問い合わせください。