Article View: pl.comp.lang.c
Article #309965Re: Mnożenie i dodawanie 64 bitowych liczb
From: Wojciech Muła
Date: Tue, 05 Nov 2019 12:02
Date: Tue, 05 Nov 2019 12:02
44 lines
3073 bytes
3073 bytes
On Tuesday, November 5, 2019 at 12:31:33 PM UTC+1, Borneq wrote:
> Mam x*y+a+b
> Mnożenie używa intrin.h lub GCC 128 bitów według
> https://stackoverflow.com/questions/28868367/getting-the-high-part-of-64-bit-integer-multiplication
>
> Teraz mam jeszcze dodanie dwóch liczb 64 bitowych do 128 bitowego
> rezultatu złożonego z dwóch zmiennych
> przy dodawaniu albo nie nastąpi przepełnienie albo gdy nastąpi to
> starszy wyraz zwiększamy o 1,
> można zrobić jakąś detekcję, gdy po dodaniu wynik jest mniejszy niż
> każdy ze składników, wystarczy chyba porównać z jednym dowolnym, to
> zwiększamy o 1, nie trzeba by nawet działać na 128 bitach, ale...
> musiałbym użyć if, które chyba od Pentium jest wolne, bo niszczy
> potokowość instrukcji.
> I czy lepiej
> 128+64
> 128+64
>
> czy najpierw zsumować dwa mniejsze:
> 64+64 = 64 + carry
> 128+64+carry
>
> Wolałbym nie robić wstawek w assemblerze, przy mnożeniu się udało, gdy
> korzystam z intrin.h , ale została jeszcze drobnostka dwóch dodawań.
Zamiast gdybać o przedpotopowych Pentiumach warto sprawdzić, co robi
kompilator.
#include <cstdint>
void add(uint64_t a, uint64_t b, uint64_t& lo, uint64_t& hi)
{
hi += uint64_t(__builtin_uaddl_overflow(a, b, &lo));
}
Powyższy kod jest kompilowany przez GCC i clanga do:
add rdi, rsi
mov QWORD PTR [rdx], rdi
adc QWORD PTR [rcx], 0
Kompilator intela generuje dłuższy kod, ale też bez skoków.
w.
Technical Details
Message-ID:
<e5372521-e12e-4b7d-ad7d-f622d65962d9@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!3.eu.feeder.erje.net!feeder.erje.net!news.unit0.net!newsreader4.netcologne.de!news.netcologne.de!peer03.ams1!peer.ams1.xlned.com!news.xlned.com!peer03.am4!peer.am4.highwinds-media.com!peer01.iad!feed-me.highwinds-media.com!news.highwinds-media.com!j16no2075171qtl.0!news-out.google.com!g53ni731qtg.0!nntp.google.com!j16no2075168qtl.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mailReferences:
<5dc15d6b$0$551$65785112@news.neostrada.pl>Show Full Headers
Complete Article Headers
X-Received: by 2002:ac8:66ca:: with SMTP id m10mr17267345qtp.298.1572955362141; Tue, 05 Nov 2019 04:02:42 -0800 (PST) X-Received: by 2002:a81:298e:: with SMTP id p136mr23462776ywp.288.1572955361658; Tue, 05 Nov 2019 04:02:41 -0800 (PST) Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!2.eu.feeder.erje.net!3.eu.feeder.erje.net!feeder.erje.net!news.unit0.net!newsreader4.netcologne.de!news.netcologne.de!peer03.ams1!peer.ams1.xlned.com!news.xlned.com!peer03.am4!peer.am4.highwinds-media.com!peer01.iad!feed-me.highwinds-media.com!news.highwinds-media.com!j16no2075171qtl.0!news-out.google.com!g53ni731qtg.0!nntp.google.com!j16no2075168qtl.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail Newsgroups: pl.comp.lang.c Date: Tue, 5 Nov 2019 04:02:41 -0800 (PST) In-Reply-To: <5dc15d6b$0$551$65785112@news.neostrada.pl> Complaints-To: groups-abuse@google.com Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=131.228.32.166; posting-account=VFwkXwoAAADdT4-lLKRZrMYkTjizGoyn NNTP-Posting-Host: 131.228.32.166 References: <5dc15d6b$0$551$65785112@news.neostrada.pl> User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <e5372521-e12e-4b7d-ad7d-f622d65962d9@googlegroups.com> Subject: Re: Mnożenie i dodawanie 64 bitowych liczb From: Wojciech Muła <wojciech_mula@poczta.onet.pl> Injection-Date: Tue, 05 Nov 2019 12:02:42 +0000 X-Received-Bytes: 3115 X-Received-Body-CRC: 2415754659 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit