首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >德尔福的SSE2优化?

德尔福的SSE2优化?
EN

Stack Overflow用户
提问于 2015-10-19 10:44:40
回答 1查看 974关注 0票数 1

我知道在C++中您可以使用一些c++ SSE内部函数来进行向量计算,但不确定这在最新的Delphi编译器中是否可行。

我有一些类似这样的代码,它们在被多次调用的核心算法中,我想加快速度。

如有任何建议,将不胜感激。

代码语言:javascript
复制
type
  Vector = array [1..3] of Single;
  VectorInt = array [1..3] of Integer;

function TSomeCalculation.getCubePosRound(const xyz: Vector): VectorInt;
begin
  // Self.RESINV and Self.RangeMin are type of Vector     
  Result[1] := Round((xyz[1] - Self.RangeMin[1]) * Self.RESINV[1]);
  Result[2] := Round((xyz[2] - Self.RangeMin[2]) * Self.RESINV[2]);
  Result[3] := Round((xyz[3] - Self.RangeMin[3]) * Self.RESINV[3]);
end;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-19 12:59:20

速写。注意使用4种元素类型.

编辑.movdqu改为movups (不是必需的)

代码语言:javascript
复制
type
  Vector = array [0..3] of Single;
  VectorInt = array [0..3] of Integer;
...
var
  Form1: TForm1;
  Vec: Vector;
  VecI: VectorInt;
  RESINV: Vector;
  RangeMin: Vector;


procedure TForm1.Button6Click(Sender: TObject);
begin
  vec[0] := 10;
  vec[1] := 12;
  vec[2] := 14;
  vec[3] := 16;
  RangeMin[0] := 4.2;
  RangeMin[1] := 5.2;
  RangeMin[2] := 6.2;
  RangeMin[3] := 7.2;
  RESINV[0] := 0;
  RESINV[1] := 1.1;
  RESINV[2] := 2.2;
  RESINV[3] := 3.3;
  vecI := getCubePosRound(vec);
end;

function Tform1.getCubePosRound(const xyz: Vector): VectorInt;
asm
  movups xmm1, [xyz]   //load 16 bytes unaligned
  movups xmm2, [RangeMin]
  movups xmm3, [RESINV]
  subps xmm1, xmm2  //subtract packed singles
  mulps xmm1, xmm3  //multiply 
  cvtps2dq xmm0, xmm1 //rounded according to MXCSR register
  movdqu [Result], xmm0 //store 16 bytes
end;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33212404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档