什么算作翻牌?

时间:2010-08-28 22:01:47

标签: architecture flops

假设我有一个伪计划的C程序:

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

对于30 FLOPS,这个(1 [x ++] + 1 [x * 5] + 1 [2+(x + 5))] * 10 [循环]的FLOP数量是多少?我无法理解翻牌是什么。

注意[...]表示我从“。”获取“操作”的计数。

5 个答案:

答案 0 :(得分:7)

FLOPS代表每秒浮动操作。如果您正在处理整数,那么您的代码中没有任何浮点运算。

答案 1 :(得分:7)

出于FLOPS测量的目的,通常仅包括加法和乘法。像分裂,倒数,平方根和超越函数这样的东西太昂贵而不能作为单一操作包含在内,而诸如装载和存储之类的东西太过微不足道了。

换句话说,你的循环体包含2个加法和1个乘法,所以(假设x是浮点数)每个循环迭代是3个操作;如果你运行循环10次,你就完成了30次操作。

请注意,在测量MIPS时,您的循环将超过3条指令,因为它还包括FLOPS测量不计算的加载和存储。

答案 2 :(得分:3)

海报已经明确表示FLOPS(详细的here)关注浮点(而不是整数)操作每秒,所以你不仅要计算多少您正在执行的操作,但在什么时间段内。

如果“x”和“a”是浮点数,那么您正在尝试计算代码中的操作数,但是您必须检查目标代码以确保浮点指令的数量是多少实际上是用的。例如,如果随后未使用“a”,则优化编译器可能不会为计算它而烦恼。

此外,一些浮动操作(例如添加)可能比其他操作(例如乘法)快得多,因此仅浮动添加的循环可以比在同一台机器上仅浮动的循环多运行FLOPS。

答案 3 :(得分:2)

FLOP(小写s表示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

因此根据Gabe的定义,循环内有4个FLOP(3x add.s和1x mul.s)。如果您还计算循环比较c.gt.s,则有5个FLOP。将此乘以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,具体取决于我们是否计算比较。

答案 4 :(得分:1)

x是整数还是浮点变量? 如果它是一个整数,那么你的循环可能不包含任何翻转。