Mikhail писал(а):Вижу, но это же смешно при таком коде от этого толку - ноль
аха. Желаете векторизацию.
ещё в 2008 году FPC умел так:
- Код: Выделить всё
- function f : double;
 var
 d1,d2,d3 : array[0..1] of double;
 begin
 d1:=d2*d3;
 end;
с ключиками: -Sv -Cfsse2, работает как раз SSE дружелюбно

но вектора принимаются только 2 x double, либо 4 x single - под размер xmm.
Всё остально ведёт к internal compiler error.
Добавлено спустя 29 минут 43 секунды:
результат выглядит как-то так:
- Код: Выделить всё
- const n = 4;
 type
 TMtxElType = single;
 TMatrix = array[0..n-1, 0..n-1] of TMtxElType;
 procedure PivotMatrix(const a: TMatrix; out b: TMatrix);
 begin
 ...
 end;
 procedure MulMatrix(const a, b: TMatrix; out c:TMatrix);
 var
 i,j,k: Integer;
 br: TMatrix;
 begin
 i:=0;
 PivotMatrix(b, br);
 for i:=0 to n-1 do
 c[i]:=a[i]*br[i];
 end;
компилируем с
- Код: Выделить всё
- fpc -al -CfSSE3 -Sv -OoREGVAR demomatrix2.pas
на выходе получаем:
- Код: Выделить всё
- # [47] for i:=0 to n-1 do
 movl $0,%edx
 decl %edx
 .balign 4,0x90
 .Lj17:
 incl %edx
 # [48] c[i]:=a[i]*br[i];
 movl %edx,%eax
 shll $4,%eax
 movl %edx,%ecx
 shll $4,%ecx
 movdqu (%ebx,%eax),%xmm0
 mulps -64(%ebp,%ecx),%xmm0
 movl %edx,%eax
 shll $4,%eax
 cmpl $3,%edx
 jl .Lj17
не то? соответственно при больших значениях n, вектор можно разбить на меньшие куски




