Мне нужна подсказка, как реализовать эту функцию Delphi с помощью сборки SSE2 (32 бит). Другие оптимизации также приветствуются. Может быть, можно сказать, какие инструкции можно использовать, поэтому у меня есть отправная точка для дальнейшего чтения.Как оптимизировать эту функцию Delphi с помощью SSE2?
Actual:
const Precision = 10000;
// This function adds all Pixels into one. The pixels are weighted before adding.
// A weight can range from 0 to "Precision". "Size" is typically 10 to 50.
function TFilter.Combine(Pixels: PByte; Weights: PCardinal; const Size: Cardinal): Cardinal;
var
i, R, G, B, A: Cardinal;
begin
B := Pixels^ * Weights^; Inc(Pixels);
G := Pixels^ * Weights^; Inc(Pixels);
R := Pixels^ * Weights^; Inc(Pixels);
A := Pixels^ * Weights^; Inc(Pixels);
Inc(Weights); // goto next weight
for i := 1 to Size - 1 do
begin
Inc(B, Pixels^ * Weights^); Inc(Pixels);
Inc(G, Pixels^ * Weights^); Inc(Pixels);
Inc(R, Pixels^ * Weights^); Inc(Pixels);
Inc(A, Pixels^ * Weights^); Inc(Pixels);
Inc(Weights); // goto next weight
end;
B := B div Precision;
G := G div Precision;
R := R div Precision;
A := A div Precision;
Result := A shl 24 or R shl 16 or G shl 8 or B;
end;
Ожидаемый:
function TFilter.Combine(Pixels: PByte; Weights: PCardinal; const Size: Cardinal): Cardinal;
asm
// Insert fast SSE2-Code here ;-)
end;
I Посмотрите на GR32 и посмотрите, есть ли у вас рутина, в которой вы нуждаетесь. Если нет, то у него есть много оптимизированных SSE2, которые вы могли бы использовать в качестве учебного ресурса. –
Сколько пикселей это объединить сразу? Я спрашиваю, потому что, если число достаточно мало, вы не увидите заметного ускорения из-за всех накладных расходов. Кроме того, значения веса должны быть 32 бита? Будут ли 16 бит содержать их? –
Весовые значения не обязательно должны быть 32 бита, так как они варьируются только до точности 10000 (подходит в 16 бит). –