Použití instrukcí SSE, SSE2, AVX v GCC

pupek

Použití instrukcí SSE, SSE2, AVX v GCC
« kdy: 25. 01. 2019, 08:34:33 »
mate nejake zkusenosti s pouzivanim instrukci SSE, AVX v gcc?
napr. maticove operace.
rychlost; nebo pouzivat radeji CUDA, OpenCL ?
« Poslední změna: 25. 01. 2019, 09:04:42 od Petr Krčmář »


gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:pouzivani instrukci SSE, SSE2, AVX
« Odpověď #1 kdy: 25. 01. 2019, 08:53:43 »
Je nějaký důvod autovektorizaci nepoužít, když programuješ maticové operace?

JSH

Re:Použití instrukcí SSE, SSE2, AVX v GCC
« Odpověď #2 kdy: 25. 01. 2019, 09:25:16 »
mate nejake zkusenosti s pouzivanim instrukci SSE, AVX v gcc?
napr. maticove operace.
rychlost; nebo pouzivat radeji CUDA, OpenCL ?
Nějaké zkušenosti by byly. Akorát na tvůj dotaz je hodně těžké radit.

Co použít vychází kompletně z toho, co chceš vůbec dělat. Některé problémy se vektorizovat takřka nedají a u jiných to znamená kompletně překopat datové struktury. U gpgpu platí úplně to samé.

Jestli ti jde jen o maticové operace, tak bych doporučoval se vybodnout na vlastní implementaci a použít třeba Eigen.

pupek

Re:Použití instrukcí SSE, SSE2, AVX v GCC
« Odpověď #3 kdy: 25. 01. 2019, 09:37:13 »
mate nejake zkusenosti s pouzivanim instrukci SSE, AVX v gcc?
napr. maticove operace.
rychlost; nebo pouzivat radeji CUDA, OpenCL ?
Nějaké zkušenosti by byly. Akorát na tvůj dotaz je hodně těžké radit.

Co použít vychází kompletně z toho, co chceš vůbec dělat. Některé problémy se vektorizovat takřka nedají a u jiných to znamená kompletně překopat datové struktury. U gpgpu platí úplně to samé.

Jestli ti jde jen o maticové operace, tak bych doporučoval se vybodnout na vlastní implementaci a použít třeba Eigen.

dik za ten odkaz na eigen.

RDa

  • *****
  • 2 699
    • Zobrazit profil
    • E-mail
Re:Použití instrukcí SSE, SSE2, AVX v GCC
« Odpověď #4 kdy: 25. 01. 2019, 10:02:25 »
V GCC se tohle pouziva skrze intrinsics, takze staci includovat  mmintrin.h / xmmintrin.h / emmintrin.h - pro mmx, sse, sse2 a pak kazda instrukce je pristupna jako jednotlive funkce, kdyz to neprezenete s poctem registru, tak se vam to prelozi vlastne 1:1 do asm.

Pokud potrebujete jen high level operace nad maticema.. tak se podivejte po nejake knihovne co tu optimalizaci za vas udelala,
viz prehled zde: https://en.wikipedia.org/wiki/Comparison_of_linear_algebra_libraries


Jenda

Re:Použití instrukcí SSE, SSE2, AVX v GCC
« Odpověď #5 kdy: 25. 01. 2019, 12:55:02 »
Používám Volk (http://libvolk.org/, mimochodem zdrojáky jsou čitelné a dá se inspirovat) a dělal jsem pár věcí přes intrinsics. Intel má na zkoumání hezké klikátko https://software.intel.com/sites/landingpage/IntrinsicsGuide/.

BaldSlattery

Re:Použití instrukcí SSE, SSE2, AVX v GCC
« Odpověď #6 kdy: 25. 01. 2019, 13:53:30 »
OpenCL je generické API pro CPU i GPU. Na CPU smysl nemá, to už je lepší psát přímo, například AVX512 výkon zvyšuje brutálně, zvlášť když se použije ICC. GPU může být u některých úloh značně rychlejší, ale má-li vlastní RAM, je třeba počítat s latencí (podle rychlosti směrnice). Obecně je většinou nejlepší použít prostě nějakou knihovnu, která je optimalizovaná a použije nejrychlejší implementaci podle dostupné technologie (AVX2/512 apod.).