首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > 云计算 >

加法跟乘法一样快?

2014-02-22 
加法和乘法一样快???#include #include using namespace stdvoid main(){LONG inf

加法和乘法一样快???


#include <iostream>

#include <windows.h>
using namespace std;

void main()
{
LONG in;
float a = 7;
float b = 8;
float c = 0;
again:

cin>>in ;

DWORD T = GetTickCount();
for(int i = 0 ;i <= 1000000000 ;i++)
{
c = a + b;
}
cout<< GetTickCount() - T <<endl;


T = GetTickCount();

for(int i = 0 ;i <= 1000000000 ;i++)
{
c = a * b;
}
cout<< GetTickCount() - T <<endl;


if( in == 1 )
{
goto again;
}
}

测试了3次结果都是差不多,加和乘的时间都差不多,为什么呢?
很多的文章都说加减可以直接无视,不计算在时间里面.
[解决办法]
1. 你这个循环中有i的自加操作,还有比较操作。这两个会对结果产生影响的。
2. 现代CPU通常含有浮点运算加速器。通常所说的浮点运算FLOP,指一次浮点乘或者一次浮点加。可见这两者的差别已经在减小了。
[解决办法]
书上是说的乘法是多周期指令,理论上比单周期指令的加法要长,但你用的是浮点数,计算时用的是浮点处理器,时间差距会缩小(现在已经有很多单周期乘法的处理器了),再考虑到每次判断i时浪费的指令流水,时间差距又会缩小,再考虑你调用的GetTickCount(),这个好像是根据时间片来算的,多少会跟实际的时间有出入,所以。。。
[解决办法]
引用:
Quote: 引用:

1. 你这个循环中有i的自加操作,还有比较操作。这两个会对结果产生影响的。
2. 现代CPU通常含有浮点运算加速器。通常所说的浮点运算FLOP,指一次浮点乘或者一次浮点加。可见这两者的差别已经在减小了。

1。因为两段代码都有循环,所以是一样的。

但是循环本身的代价比加法乘法要大多了,使得加法和乘法的区别可以忽略不计。
[解决办法]
查了一下intel给的优化手册,在乱序执行引擎上port0进行单精度的浮点数乘法是4个时钟周期,双精度的是5个时钟周期.在port1上的浮点数加灞时钟周期是3.操作的吞吐量都是1.

另一方面需要参考一下<深入理解计算机系统>,先看看怎么测试出操作时钟周期,再作比较.主要是扩大并行度,使得CPU被充分利用,否则结果被其它地方的瓶颈所掩盖.

热点排行