Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > pl.comp.programming > #34949

Re: Ile cykli zajmuje mnożenie liczb 64-bitowych?

From Bogdan <bogdan@poczta.invalid>
Newsgroups pl.comp.programming
Subject Re: Ile cykli zajmuje mnożenie liczb 64-bitowych?
Date 2023-05-15 14:00 +0200
Organization A noiseless patient Spider
Message-ID <u3t6tr$32043$1@dont-email.me> (permalink)
References (1 earlier) <u3o5jn$248lr$1@dont-email.me> <ae1c2360-6eb1-47bc-b3e1-9b5b58b8e7f3n@googlegroups.com> <f875c31f-359e-4600-82a1-396a79d88eb7n@googlegroups.com> <u3q9gj$2jdsa$1@dont-email.me> <3c017a78-5635-4b22-b9b7-cfb95b4a8428n@googlegroups.com>

Show all headers | View raw


On 14/05/2023 16:00, osobli...@gmail.com wrote:
> niedziela, 14 maja 2023 o 11:28:17 UTC+2 Bogdan napisał(a):
>> On 13/05/2023 19:43, osobli...@gmail.com wrote:
>>> Swoją drogą mierzę sobie względną szybkość generatorów PRNG za pomocą:
>>>
>>> https://quick-bench.com
>>>
>>> Jedyne sensowne zestawienie, po zliczeniu przez mnie ręcznie liczby cykli na operacje (wynik 22 do 13), które wykonują algorytmy, dostaję, gdy włączam optim=None. Jeżeli zaś włączę OFast xoroshiro dostaje takiego przyspieszenia, że wyprzedza drugi PRNG, według tego benchmarku.
>>>
>>> W samym xoroshiro liczę operację:
>>>
>>> const uint64_t s0 = s[0];
>>>
>>> jako jeden cykl, bo następuje wywołanie zmiennej z tablicy. Ale nie jestem pewien, czy to tak należy szacować.
>> To zależy od poziomu optymalizacji.
>> Bez optymalizacji na samo to wziąłbym 1 cykl na kopię z pamięci do
>> rejestru i 1 na kopię z rejestru do innej pamięci. Ale wspomniany
>> dokument podaje np. 3 cykle na kopiowanie do pamięci, więc nawet to
>> nie jest takie oczywiste.
>> Z optymalizacją jest szansa, że "s0" siedzi w rejestrze, więc
>> wystarczy pewnie 1 cykl na załadowanie.
>> Oczywiście, jeśli s[0] jest ułożone na równym adresie.
>> Oczywiście, jeśli s[0] siedzi w cache, bo jeśli nie, to w najgorszym
>> przypadku mogą być może dziesiątki, jak nie setki cykli na pobranie z
>> głównej pamięci.
>> I pewnie jeszcze różne inne warunki, więc tabelki tabelkami, ale
>> najlepiej albo pomierzyć (RDTSC), albo użyć narzędzi mówiących, co ile
>> potrwa (kiedyś było np. jakieś VTune Analyzer).
>> -- 
>> Pozdrawiam/Regards - Bogdan (GNU/Linux & FreeDOS)
>> Kurs asemblera x86 (DOS, GNU/Linux): http://bogdro.evai.pl
>> Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
>> www.Xiph.org www.TorProject.org Soft(EN): http://bogdro.evai.pl/soft
> 
> Ok, czyli liczę to raczej prawidłowo. Przykładowe szacunki:
> 
> class xoroshiro256plus {
> 
>      uint64_t s[4] = { 5, 11, 13, 99 };
> 
>      static uint64_t rotl(const uint64_t x, int k)
>      {
>          return (x << k) | (x >> (64 - k));
>      }
> 
> public:
>      uint64_t next() noexcept
>      {
>        const uint64_t result = s[0] + s[3]; // 3 cycles
> 
> 	const uint64_t t = s[1] << 17; // 2 cycles
> 
> 	s[2] ^= s[0]; // 4 cycles
> 	s[3] ^= s[1]; // 4 cycles
> 	s[1] ^= s[2]; // 4 cycles
> 	s[0] ^= s[3]; // 4 cycles
> 
> 	s[2] ^= t; // 2 cycles
> 
> 	s[3] = rotl(s[3], 45); // 6 cycles
> 
> 	return result;
>      }
> };
> 
> //Xoroshiro256+ ma 29 cykli.


  Jak już pisałem - to może zależeć od konkretnego modelu procesora... 
Nie tylko od tego, że jest 64-bitowy. I od poziomu optymalizacji.

result = s[0] + s[3];
	// jeśli result idzie do pamięci
	// mov + mov + add + mov = 2+2+1+3
	// mov + add + mov = 2+6+3
	// jeśli result idzie do rejestru
	// mov + mov + add = 2+2+1
	// mov + add = 2+6

const uint64_t t = s[1] << 17;
	// jeśli t idzie do pamięci
	// mov + shl + mov = 2+1+3
	// jeśli t idzie do rejestru
	// mov + shl = 2+1

I tak dalej...

-- 
Pozdrawiam/Regards - Bogdan                     (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux):            http://bogdro.evai.pl
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.Xiph.org www.TorProject.org  Soft(EN): http://bogdro.evai.pl/soft

Back to pl.comp.programming | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Ile cykli zajmuje mnożenie liczb 64-bitowych? "osobli...@gmail.com" <osobliwy.nick@gmail.com> - 2023-05-11 07:28 -0700
  Re: Ile cykli zajmuje mnożenie liczb 64-bitowych? Bogdan <bogdan@poczta.invalid> - 2023-05-13 16:07 +0200
    Re: Ile cykli zajmuje mnożenie liczb 64-bitowych? "osobli...@gmail.com" <osobliwy.nick@gmail.com> - 2023-05-13 10:28 -0700
      Re: Ile cykli zajmuje mnożenie liczb 64-bitowych? "osobli...@gmail.com" <osobliwy.nick@gmail.com> - 2023-05-13 10:43 -0700
        Re: Ile cykli zajmuje mnożenie liczb 64-bitowych? Bogdan <bogdan@poczta.invalid> - 2023-05-14 11:26 +0200
          Re: Ile cykli zajmuje mnożenie liczb 64-bitowych? "osobli...@gmail.com" <osobliwy.nick@gmail.com> - 2023-05-14 07:00 -0700
            Re: Ile cykli zajmuje mnożenie liczb 64-bitowych? Bogdan <bogdan@poczta.invalid> - 2023-05-15 14:00 +0200
          Re: Ile cykli zajmuje mnożenie liczb 64-bitowych? "osobli...@gmail.com" <osobliwy.nick@gmail.com> - 2023-05-14 07:39 -0700
            Re: Ile cykli zajmuje mnożenie liczb 64-bitowych? Bogdan <bogdan@poczta.invalid> - 2023-05-15 14:03 +0200
              Re: Ile cykli zajmuje mnożenie liczb 64-bitowych? "osobli...@gmail.com" <osobliwy.nick@gmail.com> - 2023-05-15 06:10 -0700
                Re: Ile cykli zajmuje mnożenie liczb 64-bitowych? "osobli...@gmail.com" <osobliwy.nick@gmail.com> - 2023-05-15 09:02 -0700
                Re: Ile cykli zajmuje mnożenie liczb 64-bitowych? Wojciech Muła <wojtek.mula@gmail.com> - 2023-05-22 10:30 -0700
                Re: Ile cykli zajmuje mnożenie liczb 64-bitowych? "osobli...@gmail.com" <osobliwy.nick@gmail.com> - 2023-06-02 02:01 -0700
                Re: Ile cykli zajmuje mnożenie liczb 64-bitowych? "osobli...@gmail.com" <osobliwy.nick@gmail.com> - 2023-06-02 05:11 -0700
    Re: Ile cykli zajmuje mnożenie liczb 64-bitowych? "osobli...@gmail.com" <osobliwy.nick@gmail.com> - 2023-05-13 10:34 -0700

csiph-web