Что считается флопом? - PullRequest
       14

Что считается флопом?

7 голосов
/ 29 августа 2010

Скажем, у меня есть программа на C, которая на псевдоишах:

For i=0 to 10
    x++
    a=2+x*5
next

Является ли количество FLOP для этого (1 [x ++] + 1 [x * 5] + 1 [2+ (x + 5))] * 10 [цикл] для 30 FLOPS? У меня проблемы с пониманием, что такое флоп.

Обратите внимание, что [...] указывают, откуда я получаю счет за "операции".

Ответы [ 5 ]

7 голосов
/ 29 августа 2010

Для целей измерений FLOPS обычно включаются только сложения и умножения. Такие вещи, как деление, обратные значения, квадратные корни и трансцендентные функции, слишком дороги, чтобы включать их в качестве одной операции, в то время как такие вещи, как загрузка и хранение, слишком тривиальны.

Другими словами, ваше тело цикла содержит 2 сложения и 1 умножение, поэтому (при условии x является плавающей точкой) каждая итерация цикла составляет 3 операции; если вы запустите цикл 10 раз, вы совершите 30 операций.

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

7 голосов
/ 29 августа 2010

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

3 голосов
/ 29 августа 2010

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

Если «x» и «a» являются числами с плавающей точкой, вы делаете хорошую попытку подсчитать количество операций в вашем коде, но вам нужно проверить объектный код, чтобы убедиться, какое количество инструкций с плавающей запятой на самом деле используются. Например, если «a» впоследствии не используется, оптимизирующий компилятор может не беспокоиться о его вычислении.

Кроме того, некоторые операции с плавающей запятой (например, сложение) могут выполняться намного быстрее, чем другие (например, умножение), поэтому цикл только операций добавления с плавающей запятой может выполняться с гораздо большим числом FLOPS, чем цикл только операций умножения с плавающей запятой на той же машине.

2 голосов
/ 29 августа 2010

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 в зависимости от того, считаем ли мы сравнения.

1 голос
/ 29 августа 2010

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

...