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, вектор можно разбить на меньшие куски
