Programowanie równoległe z wykorzystaniem architektury Haswell [zamknięty]

Chcę się dowiedzieć o programowaniu równoległym z wykorzystaniem mikroarchitektury procesora Intela Haswell. O używaniu SIMD: SSE4. 2, AVX2 w asm / C / C++ / (jakieś inne langy)?. Czy możesz polecić książki, tutoriale, Zasoby Internetowe, kursy?

Dzięki!

Author: Boris Ivanov, 2014-01-05

1 answers

Wydaje mi się, że musisz nauczyć się programowania równoległego w ogóle na CPU. Zacząłem przyglądać się temu około 10 miesięcy temu, zanim kiedykolwiek użyłem SSE, OpenMP lub intrinsics, więc pozwól mi podać krótkie podsumowanie niektórych ważnych pojęć, których się nauczyłem i kilka przydatnych zasobów.

Istnieje kilka technologii obliczeń równoległych, które można zastosować: MIMD, SIMD, równoległość na poziomie instrukcji, wielopoziomowy cahces i FMA. Z Haswellem jest również komputer na IGP.

Zalecam wybranie tematu takiego jak mnożenie macierzy lub zbiór Mandelbrota. Obie firmy mogą korzystać ze wszystkich tych technologii.

MIMD

Przez MIMD mam na myśli obliczenia przy użyciu wielu fizycznych rdzeni. Polecam do tego OpenMP. Przejdź przez ten samouczek http://bisqwit.iki.fi/story/howto/openmp/#Abstract a następnie użyj tego jako odniesienia https://computing.llnl.gov/tutorials/openMP / . dwa najczęstsze problemy korzystanie z MIMD są warunki race i fałszywe dzielenie się. Śledź OpenMP na tak reguarly.

SIMD

Wiele kompilatorów potrafi zrobić auto-wektoryzację, więc przyjrzałbym się temu. Auto-wektoryzacja MSVC jest dość prymitywna, ale GCC jest naprawdę dobra.

Ucz się wewnętrznych. Najlepszym źródłem wiedzy o tym, co robi wewnętrzny jest http://software.intel.com/sites/landingpage/IntrinsicsGuide/

[[2]} kolejnym wielkim zasobem jest Agner Fog ' s vectorclass . 95% pytań na SO ON SSE / AVX można odpowiedzieć patrząc na kod źródłowy vectorclass. Na dodatek możesz użyć vectorclass dla większości SIMD i nadal uzyskać pełną prędkość i pominąć iskrobezpieczne. Wiele osób używa SIMD nieefektywnie. Przeczytaj o Array of Structs (aos) i Struct of Arrays (SOA) oraz Array of struct of Arrays (AOSOA). Zajrzyj również do Intel strip mining Obliczanie produktu matrycy jest znacznie wolniejsze z SSE niż z prosta-algorytm [[2]}Zobacz pracę doktorską Ingo Walda dla ciekawego sposobu implementacji SIMD w ray tracingu. Ten sam pomysł zastosowałem w zestawie Mandelbrota, aby obliczyć 4 (8) pikseli na raz za pomocą SSE (AVX).

Przeczytaj również artykuł "rozszerzenie języka C-podobnego do przenośnego programowania SIMD" autorstwa Walda http://www.cdl.uni-saarland.de/papers/leissa_vecimp_tr.pdf aby uzyskać lepszy pomysł, jak korzystać z SIMD.

FMA

FMA3 JEST NOWY OD Haswell. To jest tak nowe, że nie ma wiele dyskusji na ten temat na tak jeszcze. Ale ta odpowiedź (na moje pytanie) jest dobra Jak używać instrukcji Fused Multiply-Add (FMA) z SSE/AVX . FMA3 podwaja szczytowe flopy, więc potencjalnie mnożenie macierzy jest dwa razy szybsze Na Haswella w porównaniu do Ivy Bridge.

Zgodnie z ta odpowiedź najważniejszym aspektem FMA nie jest fakt, że to jedna instrukcja zamiast dwóch, aby zrobić mnożenie i dodawanie to "(praktycznie) nieskończona precyzja wyniku pośredniego."Na przykład implementacja podwójnego-podwójnego mnożenia bez FMA wymaga 6 mnożenia i kilku uzupełnień, podczas gdy w przypadku FMA to tylko dwie operacje.

Równoległość poziomu instrukcji

Haswell ma 8 portów, do których może wysyłać μ-ops (choć nie każdy port może przyjmować ten sam mirco-op; zobacz ten AnandTech review ). Oznacza to, że Haswell może wykonać, na przykład dwa 256-bitowe ładunki, jedno 256-bitowe store, dwie 256-bitowe operacje FMA, jedna dodawanie skalarne i skok stanu w tym samym czasie (sześć μ-ops na cykl zegara).

W większości przypadków nie musisz się tym martwić, ponieważ robi to CPU. Istnieją jednak przypadki, w których Twój kod może ograniczyć potencjalną równoległość poziomu instrukcji. Najczęściej jest to zależność przenoszona w pętli. Poniższy kod ma zależność przenoszoną pętlą

for(int i=0; i<n; i++) {
    sum += x(i)*y(i);
}

Sposobem na naprawienie tego jest rozwinięcie pętli i wykonanie częściowego Sum

for(int i=0; i<n; i+=2) {
    sum1 += x(i)*y(i);
    sum2 += x(i+1)*y(i+1);
}
sum = sum1 + sum2;

Wielopoziomowe pamięci podręczne:

Haswell ma do czterech poziomów pamięci podręcznej. Pisanie kodu w celu optymalnego wykorzystania pamięci podręcznej jest moim zdaniem najtrudniejszym wyzwaniem. Jest to temat, z którym nadal zmagam się najbardziej i czuję się najbardziej ignorantem, ale w wielu przypadkach poprawa wykorzystania pamięci podręcznej daje lepszą wydajność niż jakakolwiek inna technologia. Nie mam na to wielu zaleceń.

Musisz dowiedzieć się o zestawach i pamięci podręcznej linie (i krok krytyczny) oraz na systemach NUMA o stronach. Aby dowiedzieć się trochę o zestawach i krytycznym kroku, zobacz Agner Fog ' s http://www.agner.org/optimize/optimizing_cpp.pdf A to dlaczego transpozycja macierzy 512x512 jest znacznie wolniejsza niż transpozycja macierzy 513x513?

Innym bardzo przydatnym tematem dla pamięci podręcznej jest blokowanie pętli lub kafelkowanie. Zobacz moją odpowiedź (tą z najwyższymi głosami) na jaki jest najszybszy sposób na transpozycję macierzy w C++? na przykład.

Komputer na IGP (z Iris Pro) .

Wszystkie procesory konsumenckie Haswell (Haswell-E nie jest jeszcze dostępny) mają IGP. IGP wykorzystuje co najmniej 30% krzemu do ponad 50%. To wystarczy dla co najmniej 2 więcej rdzeni x86. Jest to marnowany potencjał obliczeniowy dla większości programistów. Jedynym sposobem na zaprogramowanie IGP jest OpenCL. Intel nie ma sterowników OpenCL Pro dla Linuksa więc można zrobić tylko z Windowsem (nie jestem pewien jak dobry Implementacja tego przez Apple). Programowanie sprzętu Intel IGP (np. Iris Pro 5200) bez OpenCL .

Jedną z zalet Iris Pro w porównaniu do Nvidii i AMD jest to, że Podwójna zmiennoprzecinkowa jest tylko jedna czwarta prędkości pojedynczej zmiennoprzecinkowej z Iris Pro (jednak fp64 jest włączony tylko w obliczeniach bezpośrednich, a nie w OpenCL). NVIDIA i AMD (ostatnio) tak bardzo osłabiają podwójną zmiennoprzecinkową, że dzięki temu GPGPU Double floating point computing nie jest zbyt skuteczne na swoich kartach konsumenckich.
 26
Author: Z boson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:19