浮点处理器的威力
来源:互联网 发布:网络没问题起凡打不开 编辑:程序博客网 时间:2024/05/09 22:25
直接上代码:
例子一:
procedure TForm1.Button5Click(Sender: TObject);
var
i: Integer;
dTime: Cardinal;
v, i1, i2: Cardinal;
f, f1, f2: Double;
begin
dTime := GetTickCount;
v := 4101031988;//012824101;
f := v;
for i := 0 to 100000000 - 1 do
begin
//{
//代码段A
i1 := v div 100;
i2 := v mod 100;
//}
{
//代码段B
f1 := f / 100;
f2 := frac(f1) * 100;
i1 := Trunc(f1);
i2 := Trunc(f2);
//}
end;
dTime := GetTickCount - dTime;
Memo1.Lines.Add(Format('%u = %u * 100 + %u', [v, i1, i2]));
Memo1.Lines.Add(Format('Elapsed: %d ms.', [dTime]));
end;
我们都知道:CPU在进行整数运算时速度是最快的。但是,如果让你猜一下,你觉得代码段A和B谁的速度快呢?
同样的代码,我们改成64位数来看看:
例子二:
procedure TForm1.Button5Click(Sender: TObject);
var
i: Integer;
dTime: Cardinal;
v, i1, i2: Int64; //此处不同
f, f1, f2: Extended; //此处不同
begin
dTime := GetTickCount;
v := 4101031988012824101; //此处不同
f := v;
for i := 0 to 100000000 - 1 do
begin
//{
//代码段A
i1 := v div 100;
i2 := v mod 100;
//}
{
//代码段B
f1 := f / 100;
f2 := frac(f1) * 100;
i1 := Trunc(f1);
i2 := Trunc(f2);
//}
end;
dTime := GetTickCount - dTime;
Memo1.Lines.Add(Format('%u = %u * 100 + %u', [v, i1, i2]));
Memo1.Lines.Add(Format('Elapsed: %d ms.', [dTime]));
end;
我们稍微改变了一点点内容,再来猜一下,谁的速度更快呢?
揭晓答案吧:
在我的电脑上,例子二在32位下浮点运算几乎比整数运算快4倍,其他情况下无论例子一还是例子二浮点运算也都比整数运算快。唯一的问题是由于浮点数的精度问题,结果后三位是错误的。
这段代码纯粹是测试例子,认真思考的话,有意义的启发是:
1.在不超出浮点运算精度的情况下进行整除优化是可行的。
2.从这个简单的例子中我们就可以很容易想象到现代GPU的运算威力。
3.从理论上说GPU是有可能完全替代CPU的,至少是理论上。
- 浮点处理器的威力
- X86处理器浮点数操作的问题
- 发挥缓存的威力,提高代码效率,及如何实现16位浮点数
- 使能S3C6410的VFP,浮点协处理器
- 使能S3C6410的VFP,浮点协处理器
- ARM处理器的浮点运算单元(FPU)
- 分区的威力(翻译)
- EnumChildWindows的威力
- 二锅头的威力
- EnumChildWindows的威力
- bat的威力
- 李开复:算法的威力
- 李开复:算法的威力
- 复利的威力
- 腾讯的威力
- 分区的威力(翻译)
- WSAAsyncSelect的威力
- 单元测试的威力
- 几条判断Linux服务器是否被入侵的技巧
- getMenuInflater().inflate unreachable statement
- 关于“天价房的分析”
- Mybatis 连表查询,返回结果封装为Map
- 脑洞大开的插画师,每幅都戳到我诡异的笑点
- 浮点处理器的威力
- flex 图表ColumnChart能够点击数据获得该数据x轴,与y轴坐标
- AS不能创建安卓工程问题
- 操纵文件类
- Java_Map常见方法
- Linux多线程编程之线程互斥锁
- 异常处理
- 清华大学视频课件:基于Linux的C++(自主模式)
- 数组(基本)