浮点处理器的威力

直接上代码:

例子一:

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的,至少是理论上。

点赞