Skąd mam wiedzieć, czy mój kod jest wektoryzowany przez kompilator?

9

Jak zilustrowano w odpowiedzi Jeda Browna na Koszty wyszukiwania w porównaniu z obliczeniami , użycie wektoryzowanych vs niewektoryzowanych operacji zmiennoprzecinkowych skutkuje znacznie szybszym kodem. Wiele współczesnych kompilatorów twierdzi, że może wykonywać automatyczną wektoryzację. Jak mogę z powodzeniem wektoryzować, które części mojego kodu?

Matthew Emmett
źródło

Odpowiedzi:

10

Z kompilatora Intel każdej nowoczesnej rocznika, -O3 -vec-report3. Trzeci poziom optymalizacji gwarantuje, że próbuje wektoryzować, a raport wektorowy powie ci, co robi.

Strona GNU na temat wektoryzacji mówi, że jest domyślnie włączona na poziomie optymalizacji 3, ale nie mogę znaleźć odpowiednika raportu vec.

Bill Barth
źródło
Dziękuję za szybką odpowiedź. Nie wiedziałem o -vec-report3. Czy masz preferencje kompilatora, jeśli chodzi o tego typu rzeczy (automatyczna wektoryzacja)?
Matthew Emmett
Kompilatory Intel są naprawdę dobre, ale tylko dla układów Intel. Musisz tylko dodać wszystkie właściwe pragmy (#pragma ivdep jest najłatwiejszy) GCC 4.7 jest znacznie lepszy, ale patrząc na jakiś kod z kolegą nadal ma błędy (jak brak wektoryzacji w pragmach openmp).
aterrel
1
Radziłbym dokładnie sprawdzić, jak kompilator Intel radzi sobie z wektoryzacją układów AMD. Nie jestem w 100% pewien, że stare problemy wciąż istnieją.
Bill Barth
2
@BillBarth Tak, nadal problem. Zobacz zawiadomienie o optymalizacji (w wielu miejscach, np. Software.intel.com/sites/products/collateral/hpc/compilers/… ). AMD wygrał bitwę sądową, wymagając od Intela ujawnienia, że ​​są antykonkurencyjne, a nie do powstrzymania ich. en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler#Criticism Agner Fog na obejściach: agner.org/optimize/blog/read.php?i=49
Jed Brown
@JedBrown, na pewno SSE jest nadal dziwne, ale jaka jest historia z AVX? Te linki wskazują, że wszystko powinno być w porządku (ponieważ obie firmy wdrażają AVX), ale nie przetestowałem tego na maszynie Bulldozer.
Bill Barth
8

W kolekcji kompilatorów GNU masz opcję -ftree-vectorizer-verbose=ngdzie njest liczba od 0 do 6, która wypisze informacje podobne do icc/ ifort.

Pedro
źródło
5

W kompilatorach GNU dodanie -Wa,-ahl=asm.szrzuci wygenerowany kod zestawu do asm.s.

W przypadku kompilatorów Intela dodanie -fcode-asm -Faasm.szrzuci wygenerowany kod do asm.s.

Następnie możesz sprawdzić kod zestawu i poszukać operacji wektorowych na liczbach zmiennoprzecinkowych.

Matthew Emmett
źródło
Całkowicie się zgadzam, że sprawdzanie danych wyjściowych zestawu jest jedynym niezawodnym sposobem ustalenia, czy kod jest wektoryzowany. Nic nie wymaga od kompilatorów uczciwości w zakresie roszczeń do wektoryzacji kodu.
Jeff