.[ ČeskéHry.cz ].
floaty a optimalizace
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Popelnice
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
mar



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 24. duben 2015, 02:01:30    Předmět: floaty a optimalizace Odpovědět s citátem

Po nějaké době jsem narazil opět na něco nečekaného (konkrétně u gcc 4.9.2).
Bavím se o x86 a kódu, co používá legacy FPU (se stackem) a porovnání dvou floatů na rovnost.
Překladač měl hodnotu cachovanou v FPU registru (po nějaké jiné operaci) a porovnával s čerstvě vytaženým floatem.
Problém byl v tom, že hodnota v registru měla interně vyšší přesnost a proto porovnání na selhalo.
Takové agresívní optimalizace pak můžou nadělat spoustu škody.
Vlastně se to netýká přímo C++, totéž se teoreticky může stát i v jakémkoliv JITu.
Nemyslím si ani, že by byl problém přeladače - prostě byly implicitně nastavené agresívní optimalizace
(zkoušel jsem CLion + MinGW a divil jsem se, proč mi testovací projekt běží v release ~100x pomaleji, než v debugu Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Slappy



Založen: 31. 07. 2009
Příspěvky: 169
Bydliště: Zilina

PříspěvekZaslal: 24. duben 2015, 07:25:21    Předmět: Odpovědět s citátem

Neviem ako vy, ale my sme sa ucili v skole zakladne pravidlo ze floaty (resp. desatinne cisla) sa na rovnost NEPOROVNAVAJU (citujem, vratane velkych pismen).

Pri floatoch sa moze robit len < resp. > a vzdy treba spravit nejaku povolenu odchylku Epsilon.
_________________
Skinovane instalatory pre NSIS a Inno Setup, zdarma pre SK/CZ projekty: www.graphical-installer.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Radis



Založen: 29. 03. 2014
Příspěvky: 235

PříspěvekZaslal: 24. duben 2015, 07:48:32    Předmět: Odpovědět s citátem

No jasne, taky maruv prispevek nejak nechapu. Ty jako porovnavas floaty pomoci ==, a kdyz ti to nefunguje, tak je to podle tebe kvuli agresivnim optimalizacim? Smile To snad ne.

Tohle je snad jedna z prvnich programatorskych lekci...
kód:

    float x = 0.1;
    if (x * 6 == 0.6) {
      printf("surprise!");
    }


Ale mozna jsme te se slappym jen spatne pochopili, muzes to nejak dovysvetlit? Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 24. duben 2015, 07:54:30    Předmět: Odpovědět s citátem

Nám to říkali taky...

Když už je to tady... Floaty jsou vůbec velká legrace, nevíte někdo něco o tom, jestli ten standard definuje i deterministický výpočet? Jestli dva stroje spočtou stejný výsledek při běhu stejného programu, co je nastavený /fp:strict... Nikde jsem nenašel kloudnou odpověď, všichni říkají "no asi ne" a "spočte to co nejpřesněji může".

Řeším to třeba kvůli multiplayeru/replayi, jak moc se na takové floaty spolehnout. Máme v týmu i radikála, který prohlásil, že do herních stavů by floaty vůbec nedával a pozice řešil celočíselně nebo přes fixed-point.
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 24. duben 2015, 09:32:14    Předmět: Odpovědět s citátem

slappy: samozřejmě máš pravdu, jistota je kulomet Smile
pointa je ta, že tento typ optimalizací je velmi nebezpečný. Pokud pominu nekonzistenci (pokud přidám pár FPU operací, tak porovnání projde,
nemluvě o tom, že to může rozbít pečlivě navržené numerické výpočty, které vyžadují konzistenci.
radis: opět jsi naprosto nepochopil, o čem mluvím (proč mě to nepřekvapuje Smile ale tak hlavně, že rozdáváš lekce Wink
kód:

func(Vec3 u)
{
    u.Normalize();
    // never triggers
    if ( u == cached ) {
        return;
    }
    cached = u;
    // ... something expensive ...
}

micky: pokud máš /fp:strict, máš zaručenou konzistenci a nemusíš se bát
EDIT: pro zaručení přenositelnosti by ti měl stačit defaultní fp:precise


Naposledy upravil mar dne 24. duben 2015, 12:44:35, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Radis



Založen: 29. 03. 2014
Příspěvky: 235

PříspěvekZaslal: 24. duben 2015, 10:45:12    Předmět: Odpovědět s citátem

mar: Jasne. Moje lekce je: Mile deti, takhle dopadnete, kdyz nebudete ve skole davat pozor a budete porovnavat floaty. Pak budete psat na fora neco o agresivnich optimalizacich Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 24. duben 2015, 12:47:29    Předmět: Odpovědět s citátem

Podla mna je otazka na "standard" a deterministicky vypocet v kontexte "programu" s "/fp:strict" divna.

Jednotlive INSTRUKCIE s floatami (alebo s cimkolvek) su samozrejme deterministicke a vysledky su vzdy konzistentne.

Optimalizujuci prekladac ale moze operacie preusporiadat a pozmenit tak, ako to uzna za vhodne (podla nejakych nastaveni) a kazdemu je jasne, ze floatove operacie su zavisle na poradi -> vysledky budu rozne.

Ak sa bavime o hrach, tak sa floaty nikdy priamo neporovnavaju -> je nam to jedno (ci sa vertex vykresli na pozicii o 0.001 m vedla alebo farba bude o 0.002 jasnejsia) Razz
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 24. duben 2015, 13:34:33    Předmět: Odpovědět s citátem

To jo, v grafice to fakt většinou jedno je, leda by to s sebou neslo nějaké artefakty.

Spíš mi jde o herní stav, kdy kvůli drobné odchylce se pak sepne nějaký trigger a všechno od té chvíle bude probíhat už velmi odlišně. Jen jsem natrefil na zvěsti, že program nemusí vyjít stejně na AMD a Intelu, tak jsem to předhodil zdejším lvům, jestli o tom něco neví... tady totiž ví všechno Twisted Evil
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1561

PříspěvekZaslal: 24. duben 2015, 13:50:38    Předmět: Odpovědět s citátem

V MinGW je bug, kdy identický kód dává jiné výsledky na FPU a SSE. Je to dané ořezáním přesnosti (některé operace a mezivýsledky se provádějí ve větší přesnosti, než jsou pak výsledky). Je to starý bug, ale nikdo pořádně neví, jak ho rozumně řešit, tak je tam furt. Teď ho nemůžu najít, ale někde v jejich trackeru je. Možná ten tvůj problém s tím souvisí. Řešení je vykašlat se na FPU a používat SSE, které je navíc rychlejší.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
mar



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 24. duben 2015, 15:58:42    Předmět: Odpovědět s citátem

frca: ano, to je přesně ten případ (z mého pohledu ale spíš featura, tj. nebezpečná optimalizace).
SSE jsem původně taky očekával, ale disassembly bylo proti Smile
Nicméně jsem to v tomto případě "vyřešil" pomocí epsilonu, každopádně z mého pohledu bych byl rád, kdyby toto nekonzistentní chování nebylo defaultně zapnuté (ale od toho jsou compiler switche).

Co se týká rendereru, jak psal micky - tam je ti to opravdu jedno, desetinné místo sem nebo tam, who cares dokud to vypadá rozumně.
Ale jsou i jiné oblasti (třeba DT/convex hull), kde je potřeba mít robustní geometrické predikáty (pokud se chceš vyhnout perturbaci), abys dostal správný výsledek ve 100% případů,
ne jen v 99% jako s ne tak úplně všespásným epsilonem (a zároveň srovnatelně rychle).
Pro Shewchukovy expansions (=n floatů s posunutými exponenty, jejijchž virtuální suma dává exaktní výsledek) je naprosto kritické, aby mezivýpočty měly předem danou přesnost a chování (rounding) a bylo možné počítat s danou chybou
(a aby fungoval adaptivní výpočet).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 24. duben 2015, 21:49:45    Předmět: Odpovědět s citátem

Omlouvám se, že posílám jen link - https://randomascii.wordpress.com/2013/07/16/floating-point-determinism/
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 25. duben 2015, 09:54:19    Předmět: Odpovědět s citátem

Díky moc, tohle jsem myslím ještě nečetl.
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 27. duben 2015, 09:38:27    Předmět: Odpovědět s citátem

K tomu porovnávání floatů bez epsilonu: někdy se to hodí. Co třeba tohle?
kód:

float x = INVALID_VALUE;
MoznaZmenX(&x);

if (x == INVALID_VALUE)
...zmenilo se


Neříkám, že to nejde udělat jinak, ale už jsem něco podobného někdy použil.


Může to selhat kvůli tomu, co psal mar?
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1561

PříspěvekZaslal: 27. duben 2015, 10:20:23    Předmět: Odpovědět s citátem

Ne, toto neselže. Teda pokud INVALID_VALUE není NaN Wink
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 27. duben 2015, 10:22:27    Předmět: Odpovědět s citátem

:-D jasně

assert((INVALID_VALUE == INVALID_VALUE) && "don't use NaN");
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Popelnice Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna