直接上代码:
例子一:
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的,至少是理论上。