improved version of mandelbrot benchmark, uses now sse2 exclusively.

git-svn-id: trunk@9615 -
This commit is contained in:
Vincent Snijders 2008-01-02 15:18:25 +00:00
parent eddde27b0b
commit 4958973566

View File

@ -9,59 +9,64 @@ program mandelbrot;
{$FPUTYPE SSE2}{$I-} {$FPUTYPE SSE2}{$I-}
var n, x, y, bits,bit: Longint; var n: longint;
Cx, Cy: double; TextBuf: array[0..$FFF] of byte;
OutFile: PText;
procedure CalculatePoint; nostackframe; procedure run;
const
Limit: double =4.0;
zero: double = 0.0;
var var
i: longint; Cy, Step: double;
OutOfLimit: boolean; x, y, bits,bit: Longint;
Cr, Ci, Zr, Zi, Ti, Tr: Double; function CalculatePoint(Cx, Cy: double): boolean; nostackframe; inline;
const
begin Limit = 4;
Cr := Cx; Ci := Cy; var
Zr := zero; Zi := zero; Tr := zero; Ti := zero; i: longint;
i := 0; Zr, Zi, Ti, Tr: Double;
repeat
Zi := 2*Zr*Zi + Ci;
Zr := Tr - Ti + Cr;
Ti := Zi * Zi;
Tr := Zr * Zr;
inc(i);
OutOfLimit := (Tr + Ti>=limit);
until OutOfLimit or (i=50);
if OutOfLimit then begin
bits := bits xor bit; Zr := 0; Zi := 0; Tr := 0; Ti := 0;
end; for i := 1 to 50 do begin
Zi := 2*Zr*Zi + Cy;
Zr := Tr - Ti + Cx;
Ti := Zi * Zi;
Tr := Zr * Zr;
if (Tr + Ti>=limit) then exit(true);
end;
{$FPUTYPE X87} CalculatePoint := false;
end;
begin begin
Val(ParamStr(1), n); Step := 2/n;
writeln('P4');
writeln(n,' ',n);
for y := 0 to n-1 do for y := 0 to n-1 do
begin begin
Cy := y * 2 / n - 1; Cy := y * Step - 1;
bits := 255; bit := 128; bits := 255; bit := 128;
for x := 0 to n-1 do for x := 0 to n-1 do
begin begin
Cx := x * 2 / n - 1.5; if CalculatePoint(x * Step - 1.5, Cy) then
bits := bits xor bit;
CalculatePoint;
if bit > 1 then if bit > 1 then
bit := bit shr 1 bit := bit shr 1
else else
begin begin
write(chr(bits)); write(OutFile^, chr(bits));
bits := 255; bit := 128; bits := 255; bit := 128;
end; end;
end; end;
if bit < 128 then write(chr(bits xor((bit shl 1)-1))); if bit < 128 then write(OutFile^, chr(bits xor((bit shl 1)-1)));
end; end;
end;
begin
OutFile := @Output;
SetTextBuf(OutFile^, TextBuf);
Val(ParamStr(1), n);
writeln(OutFile^, 'P4');
writeln(OutFile^, n,' ',n);
run;
end. end.