说我有一个伪装的C程序是:

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

30拖鞋(1 [x ++]+1 [x * 5]+1 [2+(x+5))] * 10 [loop]的拖鞋数量是30 flops吗?我很难理解什么是翻牌。

请注意,[...]指示我从哪里获得“操作”的计数。

有帮助吗?

解决方案

为了进行拖船的测量,通常仅包括添加和乘法。诸如分区,倒数,方形和超越功能之类的东西太昂贵了,无法作为单一操作包括,而诸如负载和商店之类的东西太微不足道。

换句话说,您的循环主体包含2个添加和1个乘积,因此(假设 x 是浮点)每个循环迭代是3个操作;如果您运行了10次循环,则完成了30个操作。

请注意,在测量MIPS时,您的循环将超过3个说明,因为它还包括Flops测量不计数的负载和商店。

其他提示

拖鞋 代表每秒浮动操作。如果您要与整数打交道,那么您的代码中没有任何浮点操作。

海报清楚地表明了拖鞋(详细 这里)关注浮点(与整数相对)操作 每秒, ,因此您不仅必须计算您执行的操作,而且还必须在什么时间内进行。

如果“ x”和“ a”是浮子,那么您正在做一个很好的尝试来计算代码中的操作数量,但是您必须检查对象代码以确保实际使用了多少数量的浮点指令。例如,如果不随后使用“ A”,则优化编译器可能不会费心计算它。

同样,某些浮动操作(例如添加)可能比其他浮动操作要快得多(例如乘法),因此,只有浮点添加的循环可以比仅在同一台计算机上的float乘坐循环更多地运行。

Flops(小写字母s表示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 和1倍 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个比较(由10个杂音给您20或30个拖鞋),再加上1个乘法和1个乘法和1次添加。因此,您的程序现在需要22或32个失败,具体取决于我们是否计算比较。

X是整数还是浮点变量?如果是整数,那么您的循环可能不包含任何拖鞋。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top