疑似的に次のようなCプログラムがあるとします。
For i=0 to 10
x++
a=2+x*5
next
このためのFLOPSの数は(1 [x ++] + 1 [x * 5] + 1 [2 +(x + 5))] * 10 [loop]、30 FLOPSの場合ですか?フロップが何であるか理解するのに苦労しています。
[...]は、「操作」のカウントをどこから取得しているかを示していることに注意してください。
疑似的に次のようなCプログラムがあるとします。
For i=0 to 10
x++
a=2+x*5
next
このためのFLOPSの数は(1 [x ++] + 1 [x * 5] + 1 [2 +(x + 5))] * 10 [loop]、30 FLOPSの場合ですか?フロップが何であるか理解するのに苦労しています。
[...]は、「操作」のカウントをどこから取得しているかを示していることに注意してください。
FLOPS測定の目的で、通常は加算と乗算のみが含まれます。除算、逆数、平方根、超越関数などはコストがかかりすぎて1つの演算として含めることができませんが、ロードやストアなどは簡単すぎます。
つまり、ループ本体には2つの加算と1つの乗算が含まれているため、(x
浮動小数点であると仮定して)各ループの反復は3opsです。ループを10回実行すると、30回の操作が完了します。
MIPSを測定する場合、FLOPS測定ではカウントされないロードとストアも含まれるため、ループは3命令を超えることに注意してください。
FLOPSは、1秒あたりの浮動操作を表します。整数を扱っている場合は、コードに浮動小数点演算はありません。
ポスターは、FLOPS(ここで詳しく説明します)が1秒あたりの浮動小数点(整数ではなく)演算に関係していることを明らかにしているため、実行している演算の数だけでなく、どの期間で実行しているかをカウントする必要があります。
「x」と「a」がfloatの場合、コード内の操作の数を数えることを試みていますが、オブジェクトコードをチェックして、実際に使用されている浮動小数点命令の量を確認する必要があります。 。たとえば、「a」が後で使用されない場合、最適化コンパイラはそれを計算するのに煩わされない可能性があります。
また、一部の浮動演算(加算など)は他の演算(乗算など)よりもはるかに高速である可能性があるため、float加算のみのループは、同じマシン上でfloat乗算のみのループよりもはるかに多くのFLOPSで実行できます。
FLOP(小文字のsは、Martinho Fernandesのコメントによると、複数のFLOPを示します)は、機械語の浮動小数点命令を参照しているため、コードがコンパイルされる命令の数によって異なります。
まず、これらの変数がすべて整数である場合、このコードにはFLOPはありません。ただし、言語がこれらの定数と変数をすべて単精度浮動小数点変数として認識すると仮定します(単精度を使用すると、定数のロードが容易になります)。
このコードは(MIPSで)コンパイルできます:
Assignment of variables: x is in $f1, a is in $f2, i is in $f3.
All other floating point registers are compiler-generated temporaries.
$f4 stores the loop exit condition of 10.0
$f5 stores the floating point constant 1.0
$f6 stores the floating point constant 2.0
$t1 is an integer register used for loading constants
into the floating point coprocessor.
lui $t1, *upper half of 0.0*
ori $t1, $t1, *lower half of 0.0*
lwc1 $f3, $t1
lui $t1, *upper half of 10.0*
ori $t1, $t1, *lower half of 10.0*
lwc1 $f4, $t1
lui $t1, *upper half of 1.0*
ori $t1, $t1, *lower half of 1.0*
lwc1 $f5, $t1
lui $t1, *upper half of 2.0*
ori $t1, $t1, *lower half of 2.0*
lwc1 $f6, $t1
st: c.gt.s $f3, $f4
bc1t end
add.s $f1, $f1, $f5
lui $t1, *upper half of 5.0*
ori $t1, $t1, *lower half of 5.0*
lwc1 $f2, $t1
mul.s $f2, $f2, $f1
add.s $f2, $f2, $f6
add.s $f3, $f3, $f5
j st
end: # first statement after the loop
したがって、Gabeの定義によれば、ループ内には4つのフロップ(3xadd.s
と1x mul.s
)があります。ループ比較も数えると、5つのフロップがありますc.gt.s
。これに10を掛けると、プログラムで使用される合計40(または50)フロップになります。
a
より優れた最適化コンパイラは、の値がループ内で使用されていないことを認識する可能性があるため、の最終値を計算するだけで済みますa
。次のようなコードを生成する可能性があります
lui $t1, *upper half of 0.0*
ori $t1, $t1, *lower half of 0.0*
lwc1 $f3, $t1
lui $t1, *upper half of 10.0*
ori $t1, $t1, *lower half of 10.0*
lwc1 $f4, $t1
lui $t1, *upper half of 1.0*
ori $t1, $t1, *lower half of 1.0*
lwc1 $f5, $t1
lui $t1, *upper half of 2.0*
ori $t1, $t1, *lower half of 2.0*
lwc1 $f6, $t1
st: c.gt.s $f3, $f4
bc1t end
add.s $f1, $f1, $f5
add.s $f3, $f3, $f5
j st
end: lui $t1, *upper half of 5.0*
ori $t1, $t1, *lower half of 5.0*
lwc1 $f2, $t1
mul.s $f2, $f2, $f1
add.s $f2, $f2, $f6
この場合、ループ内に2つの加算と1つの比較があり(10を掛けると20または30 FLOPになります)、さらにループ外に1つの乗算と1つの加算があります。したがって、比較をカウントするかどうかに応じて、プログラムは22または32FLOPを取ります。
xは整数ですか、それとも浮動小数点変数ですか?整数の場合、ループにフロップが含まれていない可能性があります。