Anonymous user
Elementary cellular automaton/Random number generator: Difference between revisions
Elementary cellular automaton/Random number generator (view source)
Revision as of 12:07, 1 August 2019
, 4 years ago→{{header|Pascal}}: inline all together to get next byte doubles speed. ~4/5 cycles per Bit.Needs long wake up to get stable results
(Realize in F#) |
m (→{{header|Pascal}}: inline all together to get next byte doubles speed. ~4/5 cycles per Bit.Needs long wake up to get stable results) |
||
Line 318:
=={{header|Pascal}}==
{{Works with|Free Pascal}}
Using ROR and ROL is as fast as assembler and more portable.<BR>[https://tio.run/##7VZdb@pGEH33r5iHSEAvYJsQ0kBTifBxawmwC6a9bVVFjr3AKmZtrZdwaZS/Xjq7iwPckOThvvQhSHx45szMmbPD7qZBFgZxZZaG263HkzkPljBexeTcahmmuRAibZomYdU1vacpiWhQTfjclE/miHwVtxMRCHIrI26PQpaBWKwTHkfVdRLPMGs1TJamzlxdiGVsPJ45/W6vD32v82QAPJ4Nk4hAl8Tpgj49nrUnw6Hb7YEz8nsDDXA93xk6f7Z9xx2BOyq3B@gwTenqILQ9cD6PIOVJeG0/YfreYNLTgW3P8//wetBxRxN30FPOUdfpPxmrjGQImWyyqaBx1jLChGUCLcvg6zhZsSiDa6j9YFuWpT5a6OLajq9rsNFiPAQczbo3LQg0YUqZaNTRO1uxUNCEwWciOt701qdL0oSdV2xSgrF@J11hNk7ChEcGHLx@oegqH5kGiUQ3oYv6Rq29izB80lwQIBAh07aMOzKnDI1BtpQ0u/6kI6OG7m86BXiCw18I9asq9d/lXvvLKwBFBwFdCVAFAdZULHTFKFFsOMlWMda/1l0WMcibliBbxHBeg0@6gZahwg25XiRacQIOo@JQxBZlMWVk38ChE5PbL1OcGMk8iRaGr1gZR4Q8lBlC96uUl0A/SOJHPNDuYYiyu@NfpSRFmcguSZdMpF2Db11HIyExRQV2x7JOCb7gD8kl7@N5UmQbOvZmg62OAkEfiMOE/H816pUbx4cwYIDDi3PKNij4nGaC8OydLnGsNy5T0@loy807fe@X0tqHgxYfwDSnjCcxCjyHgEWgtJYPL9cB7jawQMxRzqL@@Ul/laQwUj1oj7q61HsCv7EseUevSf5B5IPIB5H/LZHj0/S9nXN/AkxSQiJBMpHv@L5d9i3c8ZzRbgukTTjYUPMNcM2pIDErFp4TwCzhkMn6Gf2HQDKDQrlRLxfgjoqsUNL73@8BX8IqlTguQCSwDu6JNOCJh4A@pqBqu9zdH9RHxcaTcs0QbeVH5qm7lCRvyeCDi4Os@uKc3BXSlZ4vLq9U2Z8rLaXOiQK5Fsfw0qGrEG7CmGSQEg7SiQIXykXfrgirZD5TaFrN2mHYy@Xyg@w@XymqbkVkTviJZfEXBASCQSv/tga2XIndNW3Xukr0TUfN@ilyeWk1CL6aJNjxzNMU4KceXkvHP0s2nATRLrqK5zNec1MakwjkQU2F8cY8Nepqlox63XgpJ16Try4MI@/bgFrNAvvqEuw6vi/rYNuXAOr5Cp9tOWJgX9hGzs04JHNe@y4ydu3H6kXju9hst/@GsziYZ9uKe76tTB7@Aw Try it online!] counting CPU-Cycles 32 vs 31 on Ryzen Zen1 per Byte -> 100Mb/s
<lang pascal>Program Rule30;
//http://en.wikipedia.org/wiki/Next_State_Rule_30;
//http://mathworld.wolfram.com/Rule30.html
{$IFDEF FPC}
{$Mode Delphi}{$ASMMODE INTEL}
{$OPTIMIZATION ON,ALL}
// {$CODEALIGN proc
{$ELSE}
{$APPTYPE CONSOLE}
Line 334:
maxRounds = 2*1000*1000;
rounds = 10;
var
Rule30_State : Uint64;
function GetCPU_Time: int64;
type
TCpu = record
HiCpu,
LoCpu : Dword;
end;
var
Cput : TCpu;
begin
asm
RDTSC;
MOV Dword Ptr [CpuT.LoCpu],EAX
MOV Dword Ptr [CpuT.HiCpu],EDX
end;
with Cput do
result := int64(HiCPU) shl 32 + LoCpu;
end;
procedure InitRule30_State;inline;
Line 356 ⟶ 372:
function NextRule30Byte:NativeInt;
//64-BIT can use many registers
//32-Bit still fast
var
run, prev,next: Uint64;
myOne : UInt64;
Begin
result := (result+result) OR (Rule30_State AND 1);Next_State_Rule_30;▼
myOne := 1;
result := (result+result) OR (Rule30_State AND 1);Next_State_Rule_30;▼
//Unrolling and inlining Next_State_Rule_30 by hand
result := (result+result) OR (Rule30_State AND 1);Next_State_Rule_30;▼
result := (result+result) OR (
next := ROLQword(run,1);
result := (result+result) OR (Rule30_State AND 1);Next_State_Rule_30;▼
Prev := RORQword(run,1);
result := (result+result) OR (Rule30_State AND 1);Next_State_Rule_30;▼
run := (next OR run) XOR prev;
result := (result+result) OR (Rule30_State AND 1);Next_State_Rule_30;▼
result := (result+result) OR (Rule30_State AND 1);Next_State_Rule_30;▼
next := ROLQword(run,1);
Prev := RORQword(run,1);
run := (next OR run) XOR prev;
next := ROLQword(run,1);
Prev := RORQword(run,1);
run := (next OR run) XOR prev;
next := ROLQword(run,1);
Prev := RORQword(run,1);
run := (next OR run) XOR prev;
next := ROLQword(run,1);
Prev := RORQword(run,1);
run := (next OR run) XOR prev;
next := ROLQword(run,1);
Prev := RORQword(run,1);
run := (next OR run) XOR prev;
next := ROLQword(run,1);
Prev := RORQword(run,1);
run := (next OR run) XOR prev;
next := ROLQword(run,1);
Prev := RORQword(run,1);
Rule30_State := (next OR run) XOR prev;
end;
procedure Speedtest;
var
T1,T0 :
i: NativeInt;
Begin
writeln('Speedtest for statesize of ',64,' bits');
//Warm up start
For i :=
Next_State_Rule_30;
T0 := GetCPU_Time;
InitRule30_State;
▲ T0 := time;
For i := maxRounds-1 downto 0 do
NextRule30Byte;
T1 :=
writeln(NextRule30Byte);
writeln(
writeln;
end;
Line 395 ⟶ 449:
writeln('The task ');
InitRule30_State;
For i := 1 to rounds do
write(NextRule30Byte:4);
writeln;
end;
Line 406 ⟶ 460:
end.</lang>
{{out}}
<pre>//compiled 64-Bit
Speedtest for statesize of 64 bits
44
▲cycles per Byte : 78.40
The task
Line 417 ⟶ 469:
<ENTER>
//
Speedtest for statesize of 64 bits
44
▲cycles per Byte : 172.80
The task
220 197 147 174 117 97 149 171 100 151
<ENTER>
=={{header|Perl}}==
|