Вопрос

Скажем, у меня есть 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 OPS; Если вы запустите петлю 10 раз, вы сделали 30 OPS.

Обратите внимание, что при измерении MIPS ваша петля будет более 3 инструкций, поскольку он также включает в себя нагрузки и магазины, которые измерение флопса не учитываются.

Другие советы

Провалиться Стенды за плавающие операции в секунду. Если вы имеете дело с целыми числами, у вас нет операций с плавающей запятой в вашем коде.

Плакаты сделали это понятно, что флопы (подробные здесь) обеспокоены плавающей точкой (в отличие от целых) операций в секунду, Так что вам нужно не только посчитать, сколько операций вы выполняете, но в какой период времени.

Если «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

Так что согласно определению Габе, внутри цикла есть 4 шлепанта (3x add.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 сравнение внутри цикла (MutiPlied на 10, дает вам 20 или 30 флот), плюс 1 умножение и 1 добавление вне цикла. Таким образом, ваша программа теперь занимает 22 или 32 шлепанца в зависимости от того, посчитаем ли мы сравнение.

Это целое число или переменная с плавающей точкой? Если это целое число, то ваша петля может не содержать провалов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top