Delphi中的SSE2优化?
Posted
技术标签:
【中文标题】Delphi中的SSE2优化?【英文标题】:SSE2 optimisation in Delphi? 【发布时间】:2015-10-19 10:44:40 【问题描述】:我知道在 C++ 中您可以使用一些 C++ SSE 内在函数来进行向量计算,但不确定这在最新的 Delphi 编译器中是否可行。
我有一些这样的代码,它们在被多次调用的核心算法中,我想加快这一点。
任何建议将不胜感激。
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;
【问题讨论】:
您可以使用asm
关键字。顺便说一下(像往常一样)最好对一组输入进行操作,这里只有 3 个并行的东西,所以你会浪费一个通道,除非你可以用下一个人来填充它。
编译器没有提供向量算术指令。如果您想要快速矢量代码,请参阅dewresearch.com/delphi。
这是一个在 SSE 中编写的非常简单的函数,为什么不试试呢?您在这里使用数组而不是记录,使您无法使用运算符重载,因此无法使您的算术代码清晰易读。
你能告诉我如何在 delphi 中编写 SSE 吗?我不确定我能不能做对。
这些函数还有多少?我们必须全部编码吗?到目前为止,您在 SSE 上读到了什么?你对asm了解吗?你了解ABI吗?您想支持哪些架构?
【参考方案1】:
速写。注意使用 4 元素类型。
编辑。将movdqu
更改为movups
(非必需)
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;
【讨论】:
以上是关于Delphi中的SSE2优化?的主要内容,如果未能解决你的问题,请参考以下文章