- Код: Выделить всё
- procedure simd_vecs3_sub(a, b:TVector3f; var c:TVector3f);assembler;
быстрее
- Код: Выделить всё
- function simd_vecs3_sub(a, b: TVector3f):TVector3f;assembler;
Причём не просто быстрее а в 2 (два)! раза
Почему?
Модератор: Модераторы
procedure simd_vecs3_sub(a, b:TVector3f; var c:TVector3f);assembler;
function simd_vecs3_sub(a, b: TVector3f):TVector3f;assembler;

procedure simd_vecs3_sub(a, b:TVector3f; var c:TVector3f);assembler; register;
asm
       movq  mm0, [a]
       movq  mm2, [b]
       movd  mm1, [a+8]
       movd  mm3, [b+8]
       pfsub mm0, mm2
       pfsub mm1, mm3
       movq  [c], mm0
       movd  [c+8], mm1
       emms
end;
function simd_vecs3_sub_1(a, b: TVector3f):TVector3f;assembler; register;
asm
       movq  mm0, [a]
       movq  mm2, [b]
       movd  mm1, [a+8]
       movd  mm3, [b+8]
       pfsub mm0, mm2
       pfsub mm1, mm3
       movq  [Result], mm0
       movd  [Result+8], mm1
       emms
end;

movq  [simd_vecs3_sub_1], mm0
movd  [simd_vecs3_sub_1+8], mm1
function geteipasebx : pointer; assembler;
asm
 mov ebx, esp
 ret
end;
 

Тут есть подводный камень - если процедура должна изменять данные, а они еще должны быть ею использованы в оригинальном виде (например такое имеет место при перемножении матриц или матрицы на вектор), то получишь глюки. Причем глюки трудновычислимые, т.к. с виду-то все в порядке.Smile

procedure Transform4Vector4s(var Result: TVector4s; const M: TMatrix4s; const V: TVector4s);
begin
  Result.X := M.M[0, 0] * V.X + M.M[1, 0] * V.Y + M.M[2, 0] * V.Z + M.M[3, 0] * V.W;
  Result.Y := M.M[0, 1] * V.X + M.M[1, 1] * V.Y + M.M[2, 1] * V.Z + M.M[3, 1] * V.W;
  Result.Z := M.M[0, 2] * V.X + M.M[1, 2] * V.Y + M.M[2, 2] * V.Z + M.M[3, 2] * V.W;
  Result.W := M.M[0, 3] * V.X + M.M[1, 3] * V.Y + M.M[2, 3] * V.Z + M.M[3, 3] * V.W;
end;
...
Transform4Vector4s(V, M, V);
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1