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-}
var n, x, y, bits,bit: Longint;
Cx, Cy: double;
var n: longint;
TextBuf: array[0..$FFF] of byte;
OutFile: PText;
procedure CalculatePoint; nostackframe;
const
Limit: double =4.0;
zero: double = 0.0;
procedure run;
var
i: longint;
OutOfLimit: boolean;
Cr, Ci, Zr, Zi, Ti, Tr: Double;
begin
Cr := Cx; Ci := Cy;
Zr := zero; Zi := zero; Tr := zero; Ti := zero;
i := 0;
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);
Cy, Step: double;
x, y, bits,bit: Longint;
function CalculatePoint(Cx, Cy: double): boolean; nostackframe; inline;
const
Limit = 4;
var
i: longint;
Zr, Zi, Ti, Tr: Double;
if OutOfLimit then
bits := bits xor bit;
end;
begin
Zr := 0; Zi := 0; Tr := 0; Ti := 0;
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
Val(ParamStr(1), n);
writeln('P4');
writeln(n,' ',n);
Step := 2/n;
for y := 0 to n-1 do
begin
Cy := y * 2 / n - 1;
Cy := y * Step - 1;
bits := 255; bit := 128;
for x := 0 to n-1 do
begin
Cx := x * 2 / n - 1.5;
CalculatePoint;
if CalculatePoint(x * Step - 1.5, Cy) then
bits := bits xor bit;
if bit > 1 then
bit := bit shr 1
else
begin
write(chr(bits));
write(OutFile^, chr(bits));
bits := 255; bit := 128;
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;
begin
OutFile := @Output;
SetTextBuf(OutFile^, TextBuf);
Val(ParamStr(1), n);
writeln(OutFile^, 'P4');
writeln(OutFile^, n,' ',n);
run;
end.