たとえば、CUDA アプリケーションのような私のプログラムの GFlops をどのように計算するのだろうかと思っています。
コード内の実行時間と浮動小数点演算の数を測定する必要がありますか? 「logf」のような操作があった場合、それは 1 つのフロップとしてカウントされますか?
実際の浮動小数点演算の数は、コードがどのように記述されているかによって異なります (コンパイラは両方向に最適化できます。つまり、一般的な演算をマージc = (a * 4.0 + b * 4.0);
すると、記述しc = (a + b) * 4.0
たものよりも 1 つ少なくなります。しかし、コンパイラは何かを次のように変換することもできます。その他の操作:
c = a / b;
次のようになる場合があります。
temp = 1 / b;
c = temp * a;
(これは、1/x が y/x よりも「単純」であり、乗算が除算よりも高速であるためです)。
コメントで述べたように、一部の浮動小数点演算 (log、sin、cos など) は、結果を得るために 1 回以上、多くの場合 10 回以上の演算を必要とします。
考慮すべきもう 1 つの要因は、「ロード」と「ストア」です。これらは、コンパイラのコード生成、特定の時点でコンパイラが使用できるレジスタの数などに大きく依存するため、予測が非常に難しい場合があります。ロードとストアが実際にカウントされるかどうかは、物事の見方によって異なります。 、しかしそれらは確かに合計実行時間にカウントされます。処理するデータが大量にあるが、各ステップが非常に単純なc = a + b
場合(たとえばa
、b
とc
がベクトルである場合)、メモリからデータを取得する時間は の実行時間よりも大幅に長くなりadd
ます。一方、それ自体はロードまたはストア操作よりもはるかに長い時間がかかるc = log(a) + log(b);
ため、ほぼ確実に結果のロードおよびストアの時間を「隠す」ことになります。log