質問
私は擬似的なものであるCプログラムを持っているとします:
For i=0 to 10
x++
a=2+x*5
next
この(1 [x ++]+1 [x * 5]+1 [2+(x+5))] * 10 [ループ]、30フロップのフロップ数はありますか?フロップが何であるかを理解するのに苦労しています。
...]は、「オペレーション」のカウントをどこから取得しているかを示しています。
解決
フロップ測定の目的のために、通常、加算と乗算のみが含まれます。部門、往復、四角い根、超越機能のようなものは、単一の操作として含めるには高すぎますが、負荷や店舗は些細なことです。
言い換えれば、ループ本体には2つの追加と1つの乗算が含まれているので、 x
各ループイテレーションは3つのOPです。ループを10回実行すると、30のOPSを実行しました。
MIPを測定する場合、フロップ測定がカウントされない負荷やストアも含まれているため、ループは3つ以上の命令になることに注意してください。
他のヒント
フロップ 1秒あたりの浮動操作の略です。整数を扱っている場合、コードに浮動小数点操作がありません。
ポスターは、フロップを明らかにしました(詳細 ここ)フローティングポイント(整数とは対照的に)操作に関心がある 毎秒, 、そのため、実行している操作の数を数える必要があるだけでなく、どの期間にも操作する必要があります。
「x」と「a」がフロートである場合、コード内の操作の数をカウントしようとしていますが、オブジェクトコードをチェックして、実際に使用されているフローティングポイント命令の量を確認する必要があります。 。たとえば、「A」がその後使用されない場合、最適化コンパイラがそれを計算することを気にしないかもしれません。
また、一部のフローティング操作(追加など)は他の操作(乗算など)よりもはるかに高速である可能性があるため、フロートの追加のループは、同じマシン上のフロートマルチプレイのみのループよりも多くのフロップで実行できます。
フロップ(小文字は、Martinho Fernandesのコメントごとにフロップの複数形を示しています)は、マシン言語の浮動点の命令を指しているため、コードがコンパイルする命令の数に依存します。
まず、これらの変数がすべて整数である場合、このコードにはフロップがありません。ただし、言語がこれらの定数と変数のすべてを単一の精度の浮動小数点変数として認識していると仮定しましょう(単一の精度を使用すると、定数を容易に負荷するようになります)。
このコードは(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つのフロップがあります(3x add.s
そして1x mul.s
)。ループの比較もカウントすると、5つのフロップがあります c.gt.s
. 。プログラムで使用されている合計40(または50)のフロップで、これに10を掛けます。
より良い最適化コンパイラは、 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のフロップを与えます)に加えて、ループの外側に1つの乗算と1つの追加があります。したがって、プログラムは、比較をカウントするかどうかに応じて、22または32のフロップを取ります。
xは整数ですか、それともフローティングポイント変数ですか?整数の場合、ループにはフロップが含まれていない場合があります。