Помогнете на компилатора да векторизира

Това е безплатен превод на скорошната ми публикация в английската версия на Intel Software Network. Така че тези, които харесват Виктория Жислина повече от vikky13, които вече са видели тази публикация, могат веднага да прочетат първия и последния абзац, които не са в оригинала.

— Здравейте на всички, имам нужда от преводач от български на C++ програмен код. Ами, тоест аз пиша задача, а преводачът имплементира нейното решение на C++. Къде може да се намери такъв? Ако не за C, може би има за други езици?

- Да, вика се началникът на отдела за развитие. Пишеш задача на български - даваш я на подчинените и готово, кодът е готов! Поне в C, поне в Delphi, поне в Java. Проверих, че работи!

Казват, че това не е шега, а истински въпрос във форум на програмист. Казват също, че човек е много по-умен от машината, което означава, че може да й помогне, като сподели ума си. Но има много случаи, когато това определено не си струва да се прави. Резултатът ще бъде обратен на очаквания.

И резултатът ще бъде доста неочакван. Списъкът на асемблера в изхода на компилатора безспорно показва, че разгънатият цикъл НЕ може да се векторизира. Компилаторът генерира SSE инструкции, но само скаларни, а не векторни. Но останалите данни - „опашката“, съдържаща само 1-3 елемента от данни в неразширен цикъл, се векторизират според пълната програма!

Ако премахнем разгръщането на цикъла: ... и погледнем отново към асемблера (няма да ви плаша с него), ще открием, че цикълът вече е напълно векторизиран за всички типове данни, което несъмнено повишава производителността.

Заключение :Повече работа, по-малко продуктивност. По-малко работа, повече. Иска ми се винаги да е така.

Имайте предвид, че Microsoft Compiler, Visual Studio 2010 и 2008 сКлючът /arch:SSE2 НЕ векторизира горния код, разгънат или свит. Кодът, който той създаде, е много подобен както на външен вид, така и на производителност и в двата случая. Тоест, ако за компилатора на Intel разгръщането на цикъла е вредно, то за Microsoft е просто безполезно :).

Но какво ще стане, ако все пак искате цикълът да се развива - скъпо ви е като памет, но искате и векторизация?

След това използвайте прагмите на компилатора на Intel, както е показано по-долу:#pragma simd#pragma novector