Programování

SIMD Intrinsics nejsou tak děsivé, ale měli bychom je použít?

Je programování na nízké úrovni hřích nebo ctnost? Záleží.

Při programování pomocí vektorového zpracování na moderním procesoru bych v ideálním případě napsal nějaký kód v mém oblíbeném jazyce a běžel by co nejrychleji „automaticky magicky“.

Pokud jste minulý týden nezačali programovat, mám podezření, že víte, že takhle svět nefunguje. Špičkový výkon přichází pouze s námahou. Proto moje otázka: jak nízko bychom měli jít?

Definovány vektorové operace

„Vektorová“ operace je matematická operace, která provádí více než jednu operaci. Přidání vektoru může přidat osm párů čísel namísto běžného přidání, které přidá pouze jeden pár čísel. Zvažte, zda požádat počítač, aby sečetl dvě čísla. Můžeme to udělat pomocí pravidelné instrukce pro přidání. Zvažte, zda požádat počítač, aby k sobě přidal osm párů čísel (výpočet C1 = A1 + B1, C2 = A2 + B2,… C8 = A8 + B8). Můžeme to udělat s vektor přidat instrukci.

Vektorové instrukce zahrnují operace sčítání, odčítání, násobení a další operace.

 SIMD: paralelismus pro vektory

Počítačoví vědci mají vymyslený název pro vektorové instrukce: SIMD nebo „Single Instruction Multiple Data“. Pokud uvažujeme o běžné instrukci přidání jako o SISD (Single Instruction Single Data), kde singl znamená jeden pár datových vstupů, pak vektorový doplněk je SIMD kde násobek může znamenat osm párů datových vstupů.

Rád bych nazval SIMD „ten druhý hardwarový paralelismus“, protože „paralelismus“ v počítačích je tak často považován za pocházející z více jader. Počty jader se neustále zvyšovaly. Počty jader čtyř jsou běžné, 20 a více je běžných v procesorech pro servery a nejvyšší počet procesorů Intel je dnes 72 jader v jednom procesoru Intel® Xeon Phi ™.

Vzrostly také velikosti vektorových instrukcí. Včasné vektorové instrukce, jako například SSE, prováděly až čtyři operace najednou. Špičková vektorová šířka Intelu v AVX-512 provádí až 16 operací najednou.

 Jak nízko bychom měli jít?

S tak velkým výkonem v sázce, kolik práce bychom měli udělat, abychom tento výkon využili?

Odpověď je hodně, a zde je důvod, proč: Čtyři jádra nás mohou maximálně 4x zrychlit. AVX (poloviční velikost AVX-512, ale mnohem běžnější) nás může maximálně zrychlit až 8krát. V kombinaci mohou získat až 32krát. Dělat obojí má velký smysl.

Tady je můj jednoduchý seznam, jak se pokusit využít vektorové instrukce (v pořadí, v jakém bychom se měli pokusit je použít):

 1.     Nejprve zavolejte knihovnu, která dělá práci (nejvyšší v implicitní vektorizaci). Příkladem takové knihovny je Intel® Math Kernel Library (Intel® MKL). Veškerou práci s použitím vektorových pokynů provedl někdo jiný. Omezení jsou zřejmá: Musíme najít knihovnu, která dělá to, co potřebujeme.

2.     Za druhé, použijte implicitní vektorizaci. Zůstaňte abstraktní a napište si to sami pomocí šablon nebo překladačů, které vám pomohou. Mnoho překladačů má přepínače a možnosti vektorizace. Překladače budou pravděpodobně nejpřenosnějším a nejstabilnějším způsobem. Existuje mnoho šablon pro vektorizaci, ale žádná z nich v průběhu času nezažila dostatečné využití, aby byla jasným vítězem (nedávný příspěvek je Intel® SIMD Data Layout Templates [Intel® SDLT]).

3.     Za třetí, použijte explicitní vektorizaci. To se v posledních letech stalo velmi populárním a snaží se vyřešit problém zůstat abstraktní, ale přinutit kompilátor použít vektorové instrukce, pokud by je jinak nepoužil. Klíčovým příkladem je podpora SIMD v OpenMP, kde jsou požadavky na vektorizaci pro kompilátor uvedeny velmi explicitně. Nestandardní rozšíření existují v mnoha překladačích, často ve formě voleb nebo „pragmat“. Pokud se vydáte touto cestou, OpenMP je způsob, jak jít, pokud jste v C, C ++ nebo Fortranu.

4.     Nakonec se utlumte a zašpinte. Použijte vnitřní SIMD. Je to jako montážní jazyk, ale napsaný uvnitř vašeho programu C / C ++. SIMD intrinsics vlastně vypadat jako volání funkce, ale obecně produkují jedinou instrukci (vektorová provozní instrukce, také známá jako instrukce SIMD).

Skutečnost SIMD není zlá; jsou však poslední možností. První tři možnosti jsou vždy udržovatelnější pro budoucnost, když fungují. Když však první tři nesplní naše potřeby, měli bychom určitě zkusit použít vnitřní SIMD.

Pokud chcete začít používat vlastní SIMD, budete mít vážné postavení, pokud jste zvyklí na programování v jazycích sestavení. Většinou je to proto, že si snadněji přečtete dokumentaci, která vysvětluje operace, včetně vynikajícího online průvodce Intelem „Intrinsics Guide“. Pokud jste v tom úplně noví, narazil jsem na nedávný blog („SSE: mind the gap!“), Který má jemnou ruku při zavádění podstaty. Také se mi líbí „Crunching Numbers with AVX and AVX2.“

Pokud knihovna nebo překladač umí dělat to, co potřebujete, vnitřní řešení SIMD nejsou tou nejlepší volbou. Mají však své místo a není těžké je použít, jakmile si na ně zvyknete. Vyzkoušejte je. Výhody výkonu mohou být úžasné. Viděl jsem vnitřní SIMD používané chytrými programátory pro kód, který pravděpodobně žádný kompilátor nevyprodukuje.

I když vyzkoušíme vnitřní SIMD a nakonec necháme práci knihovny nebo kompilátoru, to, co se naučíme, může být neocenitelné při porozumění nejlepšímu využití knihovny nebo kompilátoru pro vektorizaci. A to může být ten nejlepší důvod, proč vyzkoušet vnitřní SIMD příště, když potřebujeme něco, abychom mohli použít vektorové instrukce.

Kliknutím sem si stáhnete 30denní zkušební verzi Intel Parallel Studio XE zdarma

$config[zx-auto] not found$config[zx-overlay] not found