FLOP (строчные буквы обозначают множественное число FLOP, согласно комментарию Martinho Fernandes) относятся к инструкциям с плавающей запятой машинного языка, поэтому зависит от того, сколько инструкций ваш код компилирует до.
Прежде всего, если все эти переменные являются целыми числами, в этом коде нет 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
Таким образом, согласно определению Гейба, внутри цикла есть 4 FLOP (3x add.s
и 1x mul.s
). Есть 5 FLOP, если вы также посчитаете сравнение циклов c.gt.s
. Умножьте это на 10, чтобы получить всего 40 (или 50) FLOP, используемых программой.
Лучший оптимизирующий компилятор может признать, что значение 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 или 32 FLOP в зависимости от того, считаем ли мы сравнения.