eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingIle cykli zajmuje mnożenie liczb 64-bitowych?
Ilość wypowiedzi w tym wątku: 15

  • 1. Data: 2023-05-11 16:28:08
    Temat: Ile cykli zajmuje mnożenie liczb 64-bitowych?
    Od: "o...@g...com" <o...@g...com>

    Znalazłem dwa źródła:

    http://www.phys.ufl.edu/~coldwell/MultiplePrecision/
    fpvsintmult.htm

    https://stackoverflow.com/questions/21819682/is-inte
    ger-multiplication-really-done-at-the-same-speed-as-
    addition-on-a-modern

    W jednym piszą, że to jest 20 cykli. W drugim 2-4 cykle (dla liczb 32-bitowych, dla
    64-bitowych będzie dwa razy więcej?). Chcę zgrubnie oszacować liczbę cykli
    przypadającą na dwa różne algorytmy. Na przykład:

    https://prng.di.unimi.it/xoroshiro128plusplus.c

    Ale w drugim algorytmie mam mnożenie dwóch uint64_t. I nie wiem ile cykli mniej
    więcej przyjąć.


  • 2. Data: 2023-05-13 16:07:51
    Temat: Re: Ile cykli zajmuje mnożenie liczb 64-bitowych?
    Od: Bogdan <b...@p...invalid>

    On 11/05/2023 16:28, o...@g...com wrote:
    > Znalazłem dwa źródła:
    >
    > http://www.phys.ufl.edu/~coldwell/MultiplePrecision/
    fpvsintmult.htm
    >
    > https://stackoverflow.com/questions/21819682/is-inte
    ger-multiplication-really-done-at-the-same-speed-as-
    addition-on-a-modern
    >
    > W jednym piszą, że to jest 20 cykli. W drugim 2-4 cykle (dla liczb 32-bitowych, dla
    64-bitowych będzie dwa razy więcej?). Chcę zgrubnie oszacować liczbę cykli
    przypadającą na dwa różne algorytmy. Na przykład:
    >
    > https://prng.di.unimi.it/xoroshiro128plusplus.c
    >
    > Ale w drugim algorytmie mam mnożenie dwóch uint64_t. I nie wiem ile cykli mniej
    więcej przyjąć.


    Być może to nieoczywiste, ale jaka architektura? Na amd64 mnożenie
    liczb 64-bitowych (czyli o wielkości rejestru) będzie zapewne o wiele
    szybsze, niż na systemach 32-bitowych, o 16-bitowych nie wspominając.

    We floating point może bym nie szedł, bo może być utrata precyzji, no
    i trzeba konwertować.

    Tak czy siak, pierwszy link z wyszukiwarki zapytanej o "intel
    instruction latencies", zakładając, że jednak chodzi o architekturę
    x86/x64: www.agner.org/optimize/instruction_tables.pdf.
    Wybieram losowo procesor Haskell: MUL: czas: 3-4 cykli,
    przepustowość: 0,5-1 instrukcji na cykl.

    Najlepiej pobierz dokument i wybierz stosowny procesor.


    --
    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


  • 3. Data: 2023-05-13 19:28:55
    Temat: Re: Ile cykli zajmuje mnożenie liczb 64-bitowych?
    Od: "o...@g...com" <o...@g...com>

    sobota, 13 maja 2023 o 16:10:00 UTC+2 Bogdan napisał(a):
    > On 11/05/2023 16:28, o...@g...com wrote:
    > > Znalazłem dwa źródła:
    > >
    > > http://www.phys.ufl.edu/~coldwell/MultiplePrecision/
    fpvsintmult.htm
    > >
    > > https://stackoverflow.com/questions/21819682/is-inte
    ger-multiplication-really-done-at-the-same-speed-as-
    addition-on-a-modern
    > >
    > > W jednym piszą, że to jest 20 cykli. W drugim 2-4 cykle (dla liczb 32-bitowych,
    dla 64-bitowych będzie dwa razy więcej?). Chcę zgrubnie oszacować liczbę cykli
    przypadającą na dwa różne algorytmy. Na przykład:
    > >
    > > https://prng.di.unimi.it/xoroshiro128plusplus.c
    > >
    > > Ale w drugim algorytmie mam mnożenie dwóch uint64_t. I nie wiem ile cykli mniej
    więcej przyjąć.
    > Być może to nieoczywiste, ale jaka architektura? Na amd64 mnożenie
    > liczb 64-bitowych (czyli o wielkości rejestru) będzie zapewne o wiele
    > szybsze, niż na systemach 32-bitowych, o 16-bitowych nie wspominając.
    >
    > We floating point może bym nie szedł, bo może być utrata precyzji, no
    > i trzeba konwertować.
    >
    > Tak czy siak, pierwszy link z wyszukiwarki zapytanej o "intel
    > instruction latencies", zakładając, że jednak chodzi o architekturę
    > x86/x64: www.agner.org/optimize/instruction_tables.pdf.
    > Wybieram losowo procesor Haskell: MUL: czas: 3-4 cykli,
    > przepustowość: 0,5-1 instrukcji na cykl.
    >
    > Najlepiej pobierz dokument i wybierz stosowny procesor.
    >
    >
    > --
    > 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

    Interesuje mnie głównie architektura 64-bitowa, ale też GPU. Co do tabeli - te 3-4
    cykle to jest dla liczb 32-bitowych? Mam zakładać, że dla 64-bitowych będzie to samo,
    czy dwa razy więcej?


  • 4. Data: 2023-05-13 19:34:32
    Temat: Re: Ile cykli zajmuje mnożenie liczb 64-bitowych?
    Od: "o...@g...com" <o...@g...com>

    Ok, widzę, że dla 64-bitowych liczb to też jest 4-5 cykli.


  • 5. Data: 2023-05-13 19:43:31
    Temat: Re: Ile cykli zajmuje mnożenie liczb 64-bitowych?
    Od: "o...@g...com" <o...@g...com>

    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ć.


  • 6. Data: 2023-05-14 11:26:42
    Temat: Re: Ile cykli zajmuje mnożenie liczb 64-bitowych?
    Od: Bogdan <b...@p...invalid>

    On 13/05/2023 19:43, o...@g...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


  • 7. Data: 2023-05-14 16:00:10
    Temat: Re: Ile cykli zajmuje mnożenie liczb 64-bitowych?
    Od: "o...@g...com" <o...@g...com>

    niedziela, 14 maja 2023 o 11:28:17 UTC+2 Bogdan napisał(a):
    > On 13/05/2023 19:43, o...@g...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.


  • 8. Data: 2023-05-14 16:39:04
    Temat: Re: Ile cykli zajmuje mnożenie liczb 64-bitowych?
    Od: "o...@g...com" <o...@g...com>

    niedziela, 14 maja 2023 o 11:28:17 UTC+2 Bogdan napisał(a):
    > On 13/05/2023 19:43, o...@g...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.

    To jest to samo co niejakie load/store time? Jeżeli w algorytmie mam:

    k = k + x;

    To dobrze rozumiem, że mam liczyć to jako 4 cykle? Bo jeden cykl na pobranie k, drugi
    cykl na pobranie x, trzeci cykl na dodawanie i czwarty cykl na przypisanie wyniku do
    k?


  • 9. Data: 2023-05-15 14:00:58
    Temat: Re: Ile cykli zajmuje mnożenie liczb 64-bitowych?
    Od: Bogdan <b...@p...invalid>

    On 14/05/2023 16:00, o...@g...com wrote:
    > niedziela, 14 maja 2023 o 11:28:17 UTC+2 Bogdan napisał(a):
    >> On 13/05/2023 19:43, o...@g...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


  • 10. Data: 2023-05-15 14:03:13
    Temat: Re: Ile cykli zajmuje mnożenie liczb 64-bitowych?
    Od: Bogdan <b...@p...invalid>

    On 14/05/2023 16:39, o...@g...com wrote:
    > niedziela, 14 maja 2023 o 11:28:17 UTC+2 Bogdan napisał(a):
    >> On 13/05/2023 19:43, o...@g...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.
    >
    > To jest to samo co niejakie load/store time? Jeżeli w algorytmie mam:
    >
    > k = k + x;
    >
    > To dobrze rozumiem, że mam liczyć to jako 4 cykle? Bo jeden cykl na pobranie k,
    drugi cykl na pobranie x, trzeci cykl na dodawanie i czwarty cykl na przypisanie
    wyniku do k?


    Zależy od konkretnego modelu procesora i od poziomu optymalizacji. I
    od rozmiaru zmiennych, i od cache, i od ułożenia w pamięci.
    Jeśli 'k' jest 64-bitowe, to:

    1) MOV 'k' z pamięci do rejestru = 2, MOV 'x' z pamięci do rejestru =
    2, ADD = 1, potem ewentualne czekanie na wynik, potem MOV nowej
    wartości do pamięci = 3.

    2) MOV 'x' z pamięci do rejestru = 2, ADD 'x' do 'k' w pamięci z
    rejestru = 6.

    Najlepiej mierzyć fizycznie, co jest najszybsze.
    Jak mierzenie jest trudne, to można chociaż zobaczyć, jakie
    instrukcje kompilator generuje (z różnymi poziomami optymalizacji i
    wyboru architektury docelowej) i dopiero mając je, wziąć tabele czasów
    instrukcji i liczyć.

    --
    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

strony : [ 1 ] . 2


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: