Article View: pl.comp.programming
Article #217890Re: Ile cykli zajmuje mnożenie liczb 64-bitowych?
From: osobli...
Date: Fri, 02 Jun 2023 09:01
Date: Fri, 02 Jun 2023 09:01
70 lines
5787 bytes
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-mailReferences:
<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