マルチCPUシステム上で微分方程式を解くFortranプログラムのパフォーマンスを測定するよう依頼されました。私の雇用主は、FLOP/s(1秒あたりの浮動小数点演算数)を測定し、その結果をベンチマーク(リンパック) しかし、FLOP が何であるかを誰も説明できないので、それが正しい方法であるとは確信していません。
FLOP が正確には何なのかについて調べてみたところ、かなり矛盾した答えがいくつかありました。私が得た最も一般的な答えの 1 つは、「1 FLOP = 加算と乗算の演算」でした。これは本当でしょうか? もし本当なら、物理的に、それは正確には何を意味するのでしょうか?
最終的にどの方法を使用するにしても、スケーラブルである必要があります。コードのバージョンによっては、数百万の未知数を持つシステムを解決し、実行に数日かかります。
私の場合 (私の場合の概要は、数百の CPU で数日間にわたって大量の算術計算を何度も繰り返す Fortran コード) でパフォーマンスを測定する他の効果的な方法は何でしょうか?
ベストアンサー1
何を測定するかを正確に理解していれば、これはパフォーマンスを測るかなり適切な指標です。
FLOPS は、その名前が示すように、1 秒あたりの浮動小数点演算数です。FLOP を構成する正確な数値は CPU によって異なります (たとえば、一部の CPU は加算と乗算を 1 つの演算として実行できますが、他の CPU は実行できません)。つまり、パフォーマンスの尺度としてはハードウェアにかなり近い値になります。つまり、1) 特定のアーキテクチャで理想的な FLOPS を計算するにはハードウェアを知る必要があり、実際に浮動小数点演算がいくつ含まれているかを把握するにはアルゴリズムと実装を知る必要があります。
いずれにせよ、これは CPU をどれだけ有効活用しているかを調べるのに便利なツールです。CPU の理論上のピーク パフォーマンスを FLOPS で知っていれば、CPU の浮動小数点ユニットをどれだけ効率的に使用しているかを計算することができます。浮動小数点ユニットは、効率的に活用するのが難しいことが多いものです。CPU が実行可能な FLOPS の 30% で実行するプログラムには、最適化の余地があります。70% で実行するプログラムは、基本的なアルゴリズムを変更しない限り、それほど効率は上がらないでしょう。あなたのような数学を多用するアルゴリズムの場合、これはパフォーマンスを測定する標準的な方法です。プログラムの実行にかかる時間を単純に測定することもできますが、これは CPU によって大きく異なります。ただし、プログラムの CPU 使用率が (ピーク FLOPS カウントに対して) 50% の場合、これはやや安定した値です (CPU アーキテクチャがまったく異なる場合はそれでも異なりますが、実行時間よりはずっと安定しています)。
しかし、「私のCPUはXGFLOPSの性能があるのに、実際にはその20%程度のスループットしか達成できていない」と知ることは、とても高性能ソフトウェアにおける貴重な情報。他の浮動小数点演算よりも多くの処理が要求され、FP ユニットが効率的に動作しなくなります。FP ユニットが作業の大部分を占めるため、ソフトウェアに問題があることになります。
「私のプログラムはX分で実行されます」と測定するのは簡単です。それが受け入れられないと感じる場合は、「30%削減できるかどうか」と考えることもできますが、知る正確にどれだけの作業が行われているか、CPU がピーク時にどれだけの能力を持っているかを把握しない限り、それが可能かどうかはわかりません。CPU が 1 秒あたりにこれ以上の命令を実行できるかどうかさえわからないのに、これを最適化するためにどれだけの時間を費やしたいですか?
CPUのFPユニットが効率的に利用されなくなるのは、FP演算間の依存関係が多すぎる、または分岐が多すぎるなどして効率的なスケジューリングが妨げられるなどして簡単に起こります。そして、それが実装の妨げになっている場合は、必要それを知る必要があります。「FP スループットが得られていないので、CPU が FP 命令を発行する準備ができているときに、コードの他の部分によって FP 命令が使用できないようになっているのは明らかです」ということを知っておく必要があります。
なぜパフォーマンスを測定する他の方法が必要なのでしょうか? 上司に言われたとおりに FLOPS 数を計算するだけでは何が問題なのでしょうか? ;)