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;
var
Cy, Step: double;
x, y, bits,bit: Longint;
function CalculatePoint(Cx, Cy: double): boolean; nostackframe; inline;
const const
Limit: double =4.0; Limit = 4;
zero: double = 0.0;
var var
i: longint; i: longint;
OutOfLimit: boolean; Zr, Zi, Ti, Tr: Double;
Cr, Ci, Zr, Zi, Ti, Tr: Double;
begin begin
Cr := Cx; Ci := Cy; Zr := 0; Zi := 0; Tr := 0; Ti := 0;
Zr := zero; Zi := zero; Tr := zero; Ti := zero; for i := 1 to 50 do begin
i := 0; Zi := 2*Zr*Zi + Cy;
repeat Zr := Tr - Ti + Cx;
Zi := 2*Zr*Zi + Ci;
Zr := Tr - Ti + Cr;
Ti := Zi * Zi; Ti := Zi * Zi;
Tr := Zr * Zr; Tr := Zr * Zr;
inc(i); if (Tr + Ti>=limit) then exit(true);
OutOfLimit := (Tr + Ti>=limit);
until OutOfLimit or (i=50);
if OutOfLimit then
bits := bits xor bit;
end; 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.