- Код: Выделить всё
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);
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7