Resenim je proste se na HT vys*at! Bylo to dobry jako takovej "falesnej" a levnej multiprocessing v casech, kde dvou-jadro bylo vrcholem nabidky. Dnes kdyz mam k dispozici i pro desktop levne 6-8 jadrove CPU uz HT nepotrebuju.
Pro vps-hosting to samy. Dnes jsou k dispozici levne >20 jadrove CPU, tak proc se trapit s HT a riskovat ze se objevi naka bambilionta verze spectre? Tohle je skratka slepa vetva vyvoje, a budouci generace CPU by mela byt bez HT. Narust vykonu minimalni, nestoji to za ty problemy...
btw, mam tady v praci 2x Xeon 4114 (20 cores + HT). Testoval sem na reseni velkejch soustav rovnic metodou ktera pekne skaluje s poctem CPU. Meril sem celkovej cas, a 20cores+HT bylo o ~3% rychlejsi, nez kdyz sem pouzil jenom 20cores. Naco tedy HT? Na nic! Pohrbit tuhle vec, a jede se dal...
Ta tak. Kdyby vykopli HT a flákající se jednotky použili místo branch prediktoru tak, že se pojedou do rozhodnutí obě větve v rámci dvou pipelines. Pak výkon nezávisí na skoku (volí se jeden nebo druhý zpracovaný výsledek) a vnější pozorovatel vidí načtení cache za podmínkou ať je splněná, nebo ne. A nikdo cizí paralelně s taskem nesdílí stavový informace. A kernel při výměně threadu prostě musí uklidit tak jako tak.
Větvení je problém kvůli pipeline, že se musí zahazovat co už je hotovo. Pokud je pipeline s 10 řezy, zpracovává 10 (mikro) instrukcí. Když se skok vyhodnotí jinak, těch 10 rozpracovaných instrukcí se zahodí. Branch prediktor se snaží tohle zahazování omezit.
Pokud za skokem další skok následuje po >= 10 instrukcích, vystačíš si s dvěma "pipelinama" pro zpracování, protože při další podmínce je už předchozí slepá větev zahozena.
Při < 10 instrukcích by se holt muselo v té větvi interně vložit pár NOPů, ale furt lepší tři NOPy, než zahozených 10 instrukcí.
Průšvih by to byl akorát v případě cyklu s <10 instrukcema, tam by se musel proložit NOPama a výkon by šel trochu dolů. Tam BP dává lepší výsledky.
Tak pokud s bavíme o bezpečnosti, tak právě na tom, jestli se načte/nenačte cache stojí pěkná řádka útoků na CPU. Takže je na výběr - secure mode (= načte se vždycky, ale je to pomalejší a útočník nevidí rozhodnutí), nebo power mode (= NOPy do doby, než bude jistota, že jsou data potřeba).
Samozřejmě, že to není takhle bipolární. Když už data v cache jsou, zůstanou tam do doby, než v cache dojde místo. Takže pokud budu mít 1000 iterací cyklem a načítání až za ním, bez ohledu na BP se začne ládovat cache a pak se na ni nečeká takovou dobu na konci cyklu. Takže i v tom "secure mode" se to v tomhle případě trochu zrychlí.
To je trochu falešné dilema. Spekulovat lze i transakčně, což je nejspíš směr, kam se nové CPU vydají. Do cache se data dostanou až po commitu. Ano, i to bude asi stát něco výkonu a znamená to si pro tento účel část cache vyhradit.
Tak mě napadá, další směr může být exkluzivní cache, jakou má/mělo AMD…
A jak je implementováno sgn() ? Aby to nebylo
int sgn(int x) {
if( x < 0) return-1;
if( x > 0 ) return 1;
return 0;
}
Pak by to byla 8x podmínka + 4x skok do funkce + obecný násobení (celkem drahá operace) + 4x matematická operace. Optimalizace jak od hochů z M$.
Lepší je využít, že
1) Porovnání je odčítání
2) při prohození operandů odčítání dostanu opačný znamínko - rozdíl mezi menším a větším
3) MSB je znamínko a pro záporný číslo je 1
if( ( (max - pos) | (pos - min) ) & (1 << (8 * sizeof(int) - 1) ) ) rychlost = 0;
2x odečítání v roli porovnání (první je číslo, který má být větší), sloučeno ORem (na ničem kromě MSB nám u mezivýsledku nezáleží), ANDem vybrán bit pro znamínko (za ANDem je konstanta, kterou vybleje kompilátor - 1 << 31 nebo 1 << 63 podle velikosti INTu), takže 4x rychlá aritmetická/logická instrukce + 1x čtení konstanty + 1 skok při nenulovým MSB. Nazdar.
Proč tak komplikovaně? msb se dá otestovat porovnáním s nulou
if( ( (max - pos) | (pos - min) ) < 0 ) rychlost = 0;
a kód je stejný - sub, sub, or, cmov.
Ale stejně je lepší nesnažit se přechytračit překladač. Tohle
if( pos > max ) rychlost = 0;
if( pos < min ) rychlost = 0;
vede na skoro stejný kód, akorát místo oru je tam druhý cmov. A aspoň je na první pohled jasné, co to dělá.
Za normálních okolností to udělá sám překladač - Compiler Explorer
Nesmysl. To je totéž jako tvrdit, že stejně nesmíš v ČR jezdit víc než 130, tak se všem autům vyndá z jednoho hrnce píst, aby to nikoho ani nenapadlo. Hardware prostě umožňuje efektivnější využití hardwaru a tím zvýšení výkonu výměnou za snížení bezpečnosti, takže ať si každý zvolí co mu s ohledem na jeho potřeby vyhovuje. Samozřejmě je lepší informovaný souhlas a jako výchozí bezpečnější nastavení, ale je kokotina to zatrhnout natvrdo jen proto, že jseš paranoidní a nechceš, aby v NSA viděli jak ti jdou miny a na jaký porno koukáš.
Sice fajn myšlenka, ale problém je, že tady to přepnout prostě nejde.
Prodali ti bezpečnostní dveře, který sice odolají střelbě ze samopalu, ale nemají kvůli rychlejšímu otevírání zámek (hledání klíčů a strkání do dírky přece zdržuje) a ten se ani nedá doinstalovat. Tak se na ně montují petlice a když chceš zamknout zevnitř, musíš napřed ven oknem, odemknout a vrátit se oknem dovnitř. Což je mnohem pomalejší, než kdyby tam ten zámek dli rovnou.
A momentálně vývojáři přemýšlí, jak udělat do dveří díru, skrz kterou bys dosáhl na zámek u té petlice, aniž by utrpěla neprůstřelnost.
Jenomže oni to tak udělali proto, že to zákazníci chtěli, a pořádný dveře odmítali kupovat. Fakt pochybuju, že by IT a následně prakticky všechno bylo tam kde to teď je bez toho, že by posledních 20 let byly k dispozici dostupný procesory. Myslíš, že by v každý rodině byla SPARCstation a každej člen rodiny by měl v kapse SPARCphone, a jupíci by si před roštěnkama ve školní jídelně šudlali iSPARCmini?
Bylo by to na úrovni katolickýho školství v době Jiráskova Temna.
2MasoxCZ: A samozrejme taky fungujou, protoze v CPU se sdili prakticky vse. V dalsim kroku se totiz bude resit, ze vsechny CPU pristupujou do stejny RAM. A kupodivu, si tam kazdej jeden muze precist a zapsat co chce a kam chce. A pak se s prekvapenim zjisti, ze to vsechno pouziva jeden disk, o kterym plati totez.
Hyperthreading nie je urceny pre ulohy, ktore jednostranne vytazuju len urcity typ vypoctovyvh jednotiek v CPU ako je riesenie rovnic (FPU jednotky). HT vylepsuje celkovy vykon systemu, kde bezi mix rozlicnych uloh, ktore rovnomerne vyzivalju rozlicne typy jednotiek (FPU, integer, load/store...), vtedy sa da dosiahnut navysenie vykonu o 30-50%.
Je samorejme, ze "skutocne" jadro je ovela lepsie ako to z HT a suhlasim s tym, ze v pripade dostupnosti viacjadrovych procesorov straca HT postupne zmysel. Napriklad POWER8 procesor podporuje SMT8 (to je IBM nazov pre HT - Symetric Multithreading s 8 threadmi na core) ale da sa to v systeme (v AIXe) za chodu menit na SMT4, SMT2 alebo sa da HT uplne vypnut a administrator tak moze odladit vykon systemu podla uloh ktore tam bezia.
POWER9 sa uz dodava v dvoch verziach alebo s SMT8 alebo s maximalne podporovanym SMT4, ktory ma ale na cipe 2x viac jadier ako verzia s SMT8.
Tak mi rekni, jak dokaze beznej uzivatel vytizit cpu s 10 cores + HT? Samotne efektivni vyuziti 10 jader neni tak jednoduche, to musi byt aplikace specielne napsana a nekdy to ani nejde.
Tak naco ma byti na cpu s 10 cores jeste HT? Ja bych bral radsi 12cores bez HT za stejnou cenu (coz by snad plochou cipu mohlo byti +/- na stejno)...
Běžný uživatel nevytíží ani deset jader. Chyba byla, že si vůbec takový procesor koupil. Zda to má nebo nemá HT na té chybě nic nezmění.
Tolik jader a ještě s HT si bude pořizovat někdo, kdo provozuje třebas virtuálky nebo webový server, který v jednu chvíli obsluhuje desítky požadavků. Prostě na něco, co samo o sobě obnáší desítky vláken, každé dělající něco jiného nebo v jinou chvíli.
Na paralelní výpočty je lepší maximalizovat počet jader * frekvence. HT pomůže jen v hodně specifických paralelních úlohách, které vyžadují jednotky, které jsou skutečně zdvojené (příkladem budiž zpracování textu). Jenže většina zátěže půjde po věcech jako jsou FPU a tam na sebe ta vlákna budou čekat, protože FPU je pomalejší než jedno vlákno. A obvykle jich tam není tolik, aby to upočítalo vlákna dvě.