V rámci simulácie kvantových obvodov pomocou multi-terminálnych binárnych rozhodovacích diagramov (MTBDDs) sme vyskúšali niekoľko floating-point implementácií pre reprezentáciu zložiek komplexných čísel v listových uzloch, ktoré reprezentujú komplexnú amplitúdu.
Napríklad pre Grover-50 obvod:
F128 quadruple: 21.5s
F80 long double: 7.93s
F64 double: 3.93s
F32 float: odchylka celkovej pravdepodobnosti od 1 bola vysoká (akumulovaná fp chyba), výsledok nevalidný
Pre najväčší Grover obvod, kedy odchylka bola menšia ako 10% pri F32 (Grover-31):
F128 quadruple: 0.193s
F80 long double: 0.157s
F64 double: 0.115s
F32 float: 0.112s
Pre Quantum-Counting obvod:
F128 quadruple: 1185s
F80 long double: 992s
F64 double: 549s
F32 float: opäť nevalidné
Nazdar! Prosim te, pro nas pomalejsi: risc-v ma na praci s temito "rozsirenymi" decimal typy specialni instrukce,a gcc je pouziva?
Ovsem intel ne. a dochazi tam bud k emulaci, nebo se se proste pouzije "obycejny" decimal, nebo "rozsireny" ? S tim ze gcc tam pouze vola tu emulaci a ta si rozhodne co delat pozdeji?
Ptam se, protoze na jedne strane pises ze intel a dalsi to maji podporovane, ale na druhe strane jen u riscu zminujes instrukce. U intelu zminujes "ze se tam cosi vola". Navic internet (pri heldnai vykonu techto vypoctu jak se tu kdosi ptal), tvrdi, ze quadruple-precision floating-point typically ma 4x - 60x pomalejsi vypocty nez double-precision (64-bit) `due to lack of native hardware support on most CPUs` .
A jak je na tom slavny aarch64? Diky!
Pokud není HW podpora v CPU, tak může být podpora v novém mikrokódu CPU nebo překladači zdrojových kódů (jako v dávných dobách byla např. SW emulace FPU). V případě C/C++ může překladač rozhodnout použít horší přesnost, aby to bylo aspoň trochu rychlé, protože specifikace long cokoli akorát říká, že to má být delší (nebo rovno?) než verze bez long.
4. 3. 2026, 15:25 editováno autorem komentáře
Zdar, no my taky musíme pracovat, na rozdíl od vás ve Velké modré :-)
Je to takto: ten typ __float128 je podporovaný z pohledu C (!!!) jen na některých platformách, ale patří sem i Intel, ARM i RISC-V (takže většina světa je s tím v pohodě, na druhou stranu to ovšem nepojede řekněme na M68k). Ovšem podpora v tomto kontextu znamená, že to můžeš použít ve zdrojácích. Interně se to bude počítat čistě v SW voláním subrutin (to bylo v tom assemblerovským výpisu). Pokud vím, tak jen na RISC-V je ten typ podporovaný nativně, tj. například __float128+__float128 se přeloží do jediné instrukce.
Ono taky se už pár let neprogramuje v assembleru. Takže proč prodražovat hardware. Mimochodem zrovna ARM už v počátcích řešil to, že kompilace C/C++ prokládala load operace s ostatními, protože trvaly 2 cykly, tak aby byly "za jeden cykl" tím, že je udělá o 1 cykl dopředu. Tedy už v počátcích ARMu by musel assembler programátor řešit věci specifické pro danou platformu (tehdy aby měl výkon). x86 je víc highlevel a nemusel a víc toho řešil sám uvnitř v mikrokódu.
Je to emulovano softwarove, mikrokod x86-64 toto aktualne neda ze dvou duvodu: za prve na to nejsou k dispozici/v dosahu 128 bit registry (rax atd. nejdou skladat po dvojicich, FPU ma 80 bitu, SSE... nejsou dotazene k FPU) a za druhe FPU aritmetika je 80bitova a jeji rozsireni na 128 by potrebovalo docela dost kremiku navic (predevsim gon. fce apod.) - mikrokodem rozsirena presnost mantisy je vzhledem k moznostem mikrokodu nerealna.
SW emulace napr. v gcc pouziva libquadmath knihovnu, kde funkce sleduji pattern:
1. Natahnuti operandu z pameti do dvojic 64-bit registru (treba rdx:rax)
2. Dekompozice znamenkoveho bitu, exponentu a mantisy v prac. registrech
3. Provedeni operace (treba u scitani komparace exponentu, shift mantisy, soucet, vypocet exponentu, normalizace
4. Repack znamenka, exponentu a mantisy do 128 bitu
5. Ulozeni do pameti
Treba takova sw emulace i jen scitani __addtf3(__float128, __float128) se vsemi pozadovanymi zaokrouhlenimi, NANy, +/- zero atd. spotrebuje nekolik set instrukci, takze muze byt az cca 100x pomalejsi nez double add v FPU.
Jeste horsi je to u goniometrickych funkci, kde je to postaveno na tabulkach a vypoctu Cebysevovych polynomu (a tady to dost brzdi docela dost soucinu 128bit * 128bit).
Ale existuji i ruzne "triky", např. takova odmocnina si prvni odhad vypocita v FPU v double a zbytek se dojede iterativne Newton-Raphsonem.