Összehasonlítás úszó vs kettős - verem túlcsordulás az orosz
TL; DR. lebegnek. mint várható volt, gyorsan megduplázódik. így ha a munka nagy mennyiségű adat, és van elég lebegőpontos számok. akkor válassza ki az úszó. Ha a lebegőpontos számok nem elég, akkor a választást kicsi - dupla. Ha nincs semmilyen igénnyel - válaszd ki semmit, látod a különbséget.
Én, mint annak tagja vita, úgy döntött, hogy írd meg a választ. Ahhoz, hogy megértsük, mi lesz a teljesítmény, úgy döntöttem, hogy először tanulni néhány elmélet, erre írtam az alábbi kódot:
Amelyhez a következő szerelő (gcc):
Ez nem a teljes kimenetet, de elég információt. Mi érdekli itt két utasítás: addss. addsd - mindegyik egy SIMD utasításokat az úszó (az első) és a kettős. Az első gondolat - meg kell keresni a kézikönyvet ott lehet leírni, ami gyorsabb? Ez a kézikönyv. de egy felületes vizsgálat azt mutatta, hogy a válasz nem kaptam - ítélve egy kézikönyvet, ezeket az utasításokat kell végrehajtani ugyanilyen gyorsan. Rendben van. Hagyjuk így, és próbálja összegyűjteni az előző kódot AVX2 a stúdióban, megkapjuk a következő ASM:
Kód gyakorlatilag nem változott, kivéve, hogy a művelet ismertté vált vaddsd és vaddss. Nem kaptam a kézi Ezen parancsok, úgy vélem, hogy a helyzet ott is hasonló az is, hogy korábban láttuk.
Egy másik fontos tényező, hogy lebegnek, hogy terjessze elő a saját kisebb hatást gyakorol a készpénz: a ez kétszer kevesebb, mint, hogy a terhelést a cache kisebb lesz. Így nem keresztre feszítették és festés többet kap a következő következtetés, amely, mint egy egész, azonnal jut eszembe: úszó gyorsabb, mint kétszerese.
Továbbra is kipróbálni a gyakorlatban, erre használjuk a következő kódot:
Természetesen a mérések meglehetősen egyszerű, de az érvelés meglehetősen felületes (nem törekszem a teljes vizsgálat, abban a pillanatban nincs ideje rá), de még ez azt mutatja, hogy az emberek azt állítják, hogy az alapértelmezett kell választani két-, és hogy a kettős gyorsan úszó - rossz.
És még egy tesztet, ahol szoktam intrinsiki kiszámításához az összeg (nem tudom használni őket a legjobb út, de ez olyan, amilyen - a másik nem tudom):
Ezzel a kóddal, ugyanazon a gépen, kapok a növekedés 2,3-2,5-szer.
Jó válasz, de felmerül a kérdés. Például, hogy miért jutunk növekedés csak x1.2-1.3, tekintettel arra, hogy a művelet, tudjuk kezelni 8 float s és 4 db. Az ötlet a különbség legyen x2, de nem látom. Sőt, a vizsgálat a C # (szintén elég egyszerű), mutatott különbséget a teljesítmény kevesebb, mint 1%, hanem javára az úszó. és eredményeinek összehasonlításával egyszerű műveletekkel, azaz Nem használjuk a visszatérő függvények dupla. Ez a különbség arra késztet, hogy úgy vélik, hogy a GCC nem használja a legoptimálisabb utasításokat biztosít cross-platform. - Msztyiszlav Pavlov január 18 '16 at 11:24
„Miért kap a növekedés csak x1.2-1.3, tekintettel arra, hogy a művelet, tudjuk kezelni 8 floatov és 4 dupla?” - @ MstislavPavlov, valószínűleg ez az, hogy nekem a kérdést, bár @ixSci elvileg azt mondta. Nézd meg újra az AFM. Itt alapvetően parancsok dolgozó memória. Kívül a cache nagyon lassú csapat. Sőt, ha most úgy nem a sebesség a felül úszó # 47; kettős vektorok és a sebesség a letöltések a cache. Én az ő válaszul a kód utolsó teszt csak hibázott, hogy milyen hatással van az eredményre a cache. - mega január 18 '16 at 11:48
„Ha kizárja a szándékos” hiba „a különbség még kevésbé lesz, értem rendesen?” - gróf magad: az utolsó előtti eredmény - már hiba nélkül. Csak @avp nem mondom, ha annak jellemzőit RAM. hanem azt, hogy eredményei jobbak, ezért tettem az utolsó „ravasz” teszt. @ixSci megteheti ugyanezt a vizsgálatot az utolsó példa. - mega január 18 '16 at 12:49
Alapján azonos architektúra, azt lehet mondani, hogy az úszó-művelet gyorsabb, legalább 2-szer. Például: egy 128-bit vektor regiszter illeszkedik 2 vagy 4 dupla úszó. Miért legalábbis - mert a készítmény a vektorok tarthatja többletköltségeket kell értékelni az azonos arányban. Az itt kiválasztott nyelvet kicsit függ, hanem - a fordító a minőség optimizatsiionnyh algoritmusok alapján bevonásával SSE. - mega január 18 '16 at 04:47