mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-15 20:49:17 +02:00
improved version of mandelbrot benchmark, uses now sse2 exclusively.
git-svn-id: trunk@9615 -
This commit is contained in:
parent
eddde27b0b
commit
4958973566
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user