🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.programming
Article #217890

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

#217890
From: osobli...
Date: Fri, 02 Jun 2023 09:01
70 lines
5787 bytes
poniedziałek, 22 maja 2023 o 19:30:31 UTC+2 Wojciech Muła napisał(a):
> On Monday, May 15, 2023 at 6:02:33 PM UTC+2, osobli...@gmail.com wrote: 
> > Swoją drogą jak biorę wartości z tych tabel: 
> > 
> > https://www.agner.org/optimize/instruction_tables.pdf 
> > 
> > Mam brać pod uwagę sumę Ops i Latency?
> Pytałeś już o to dwa lata temu. I nie, ops i latency to dwie **kompletnie** różne rzeczy - przeczytaj dokładnie opisy kolumn. 

Fakt, wtedy chodziło mi tylko o rzędy wielkości, bo nie miałem pojęcia ile to w ogóle zajmuje. Dzisiaj porównuję mój kod z różnymi wersjami xoroshiro:

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

> Można teoretycznie oszacować throughput małego kawałka kodu (np. na https://uica.uops.info), można nawet oszacować dolne ograniczenie latency ze ścieżki krytycznej. 

Nie wiem, czy czegoś podobnego nie robi Godbolt:

https://godbolt.org/z/7rxMdKerz

[1]    [2]    [3]    [4]    [5]    [6]    Instructions:
 1      5     0.50    *                   movq	_ZL1s.0(%rip), %rcx
 1      5     0.50    *                   movq	_ZL1s.3(%rip), %rdx
 1      1     0.50                        leaq	(%rdx,%rcx), %rax
 1      1     0.50                        rolq	$23, %rax
 1      1     0.25                        addq	%rcx, %rax
 1      5     0.50    *                   movq	_ZL1s.1(%rip), %rsi
 1      1     0.25                        movq	%rsi, %rdi
 1      1     0.50                        shlq	$17, %rdi
 1      5     0.50    *                   movq	_ZL1s.2(%rip), %r8
 1      1     0.25                        xorq	%rcx, %r8
 1      1     0.25                        xorq	%rsi, %rdx
 1      1     0.25                        xorq	%r8, %rsi
 1      1     1.00           *            movq	%rsi, _ZL1s.1(%rip)
 1      1     0.25                        xorq	%rdx, %rcx
 1      1     1.00           *            movq	%rcx, _ZL1s.0(%rip)
 1      1     0.25                        xorq	%rdi, %r8
 1      1     1.00           *            movq	%r8, _ZL1s.2(%rip)
 1      1     0.50                        rolq	$45, %rdx
 1      1     1.00           *            movq	%rdx, _ZL1s.3(%rip)
 3      7     1.00                  U     retq

> Między Tobą a ISA jest kompilator, runtime, system operacyjny i wg mnie warto mierzyć czas wykonania dla dużej liczby iteracji, eksprymentując z ustawieniami kompilatora.

Tak to obecnie mierzę. Kompiluję z takimi flagami g++ -o test benchmarks_PRNGs.cpp -Wall -Wextra -O3 -fno-unroll-loops. No i coś tam mi wychodzi. Wyniki różnią się od tych z Godbolt. Wydaje mi się, że ze względu na mnożenie w moich generatorze niewiele tutaj można zrobić (przyspieszyć). Tym bardziej, że, jeśli porównuję wyniki xoroshiro i PCG-DXSM:

static __uint128_t LCG_state = 123456789;

uint64_t next_PCG(void)
{
    LCG_state = LCG_state * 0xda942042e4dd58b5 + 1;
    uint64_t hi = LCG_state >> 64;
    uint64_t lo = LCG_state;

    lo |= 1;
    hi ^= hi >> 32;
    hi *= 0xda942042e4dd58b5ULL;
    hi ^= hi >> 48;
    hi *= lo;
    return hi;
}

To dostaję podobne wyniki do prof. Vigny https://prng.di.unimi.it. PCG jest jakieś 1,5 razy wolniejszy. Zastanawiam się jeszcze tylko, czy mnożenie można jakoś zoptymalizować. Twórczyni PCG Melissa O'Neil pisała gdzieś, że w jej pomiarach PCG jest tylko nieznacznie wolniejszy od xoroshiro. Tutaj:

https://github.com/numpy/numpy/pull/13163#issuecomment-496030958

wyszło komuś z Numpy, że na Linuxie PCG jest tylko nieznacznie wolniejszy od xoroshiro, a na Windowsie różnica jest ponad dwukrotna. Prędkość zależna od platformy?

> Od wielu lat używam tego zestawu makr do mierzenia cykli: https://github.com/WojciechMula/toys/blob/master/000helpers/benchmark.h. Możesz zobaczyć w tym repo jak z tego korzystać, np. tutaj: https://github.com/WojciechMula/toys/blob/master/avx512-varuint/benchmark.cpp#L41 

Dzięki, ale nie wiem jak tego użyć.
Technical Details
Message-ID: <6a8dcb5d-1aff-42f6-8819-2e0a4b39e615n@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!2.eu.feeder.erje.net!feeder.erje.net!border-1.nntp.ord.giganews.com!nntp.giganews.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
References: <986309a4-5abd-46de-9d99-25bf51ba6144n@googlegroups.com> <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> <c25f6d1d-8b3f-4abb-9f95-cc4f4e355474n@googlegroups.com> <u3t721$32043$2@dont-email.me> <cf5f9f4f-8639-46ab-ad27-1c3f5ea78c47n@googlegroups.com> <b924d147-7384-4c59-bf13-8080061a15b8n@googlegroups.com> <91561a72-2a65-44c8-ad6f-9a23697afc27n@googlegroups.com>

Show Full Headers
Complete Article Headers
X-Received: by 2002:a05:620a:1727:b0:75b:137f:e05f with SMTP id az39-20020a05620a172700b0075b137fe05fmr478971qkb.5.1685696515815;        Fri, 02 Jun 2023 02:01:55 -0700 (PDT)
X-Received: by 2002:a05:6902:1882:b0:ba8:6422:bbec with SMTP id cj2-20020a056902188200b00ba86422bbecmr1485917ybb.4.1685696515350; Fri, 02 Jun 2023 02:01:55 -0700 (PDT)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!2.eu.feeder.erje.net!feeder.erje.net!border-1.nntp.ord.giganews.com!nntp.giganews.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: pl.comp.programming
Date: Fri, 2 Jun 2023 02:01:55 -0700 (PDT)
In-Reply-To: <91561a72-2a65-44c8-ad6f-9a23697afc27n@googlegroups.com>
Injection-Info: google-groups.googlegroups.com; posting-host=92.67.160.10; posting-account=5sNFBgoAAAAxlae8lv99mPyGsDs6ynwB
NNTP-Posting-Host: 92.67.160.10
References: <986309a4-5abd-46de-9d99-25bf51ba6144n@googlegroups.com> <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> <c25f6d1d-8b3f-4abb-9f95-cc4f4e355474n@googlegroups.com> <u3t721$32043$2@dont-email.me> <cf5f9f4f-8639-46ab-ad27-1c3f5ea78c47n@googlegroups.com> <b924d147-7384-4c59-bf13-8080061a15b8n@googlegroups.com> <91561a72-2a65-44c8-ad6f-9a23697afc27n@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <6a8dcb5d-1aff-42f6-8819-2e0a4b39e615n@googlegroups.com>
Subject: Re: Ile cykli zajmuje mnożenie liczb 64-bitowych?
From: "osobli...@gmail.com" <osobliwy.nick@gmail.com>
Injection-Date: Fri, 02 Jun 2023 09:01:55 +0000
Lines: 93
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit