Мои потребности в анализе производительности софта на x86 покрывают три тула. Один из них — Vtune XE знаком, наверное, всем, кто сталкивался с оптимизацией.
Второй тул, к сожалению, не столь широко известнен. Он уже упоминался на Хабре в контексте оптимизации AVX кода, но область его применения несколько шире.
Иногда после того, как Vtune нашел самый главный хотспот (а зачастую, разработчик и так его знает), возникает потребность приложить некоторые усилия для уменьшения числа тактов, которые тратятся на его исполнение. Уже почти три года я использую для анализа производительности таких небольших, но критичных участков кода Intel Architecture Code Analyzer.
Пользоваться им просто, вот рекурсивный алгоритм всего лишь из 6 шагов:
1. В соответствующем .c/.cpp файле включается
#include «iacaMarks.h»,
2. dll/so библиотеки IACA кладутся в доступное системе место,
3. в исходник добавляются макросы
IACA_START, IACA_END
соответственно, перед началом и после окончания оптимизируемого кода. Например,
IACA_START for (int i = 0; i < len/32; i++) { reg2 = _mm_load_si128((__m128i*)src + i*2); reg3 = _mm_load_si128((__m128i*)src + i*2 + 1); reg1 = reg0; reg0 = reg3; reg3 = _mm_alignr_epi8(reg3, reg2, 16 - 1); reg2 = _mm_alignr_epi8(reg2, reg1, 16 - 1); _mm_store_si128((__m128i*)dst + i*2, reg2); _mm_store_si128((__m128i*)dst + i*2 + 1, reg3); } IACA_END
4. Компилируем любимым компилятором (надеюсь, это ICC, но с GCC или MSVC тоже проблем не будет) со всеми обычно используемыми оптимизациями (кроме PGO, к сожалению). Линковать весь проект не надо, достаточно одного объектника.
5. Потом в командной строке скормим тулу получившийся объектник:
iaca -64 -arch IVB -cp DATA_DEPENDENCY -mark 0 -o output.txt ssecpy.obj
Параметры для IACA следующие:
-64 — означает 64-битный код. Можно и -32.
-arch IVB— показывает IACA, что нужно анализировать производительность этого кода на Ivy Bridge. Другие возможные значения: nehalem, westmere, SNB.
-analysis LATENCY просит IACA показать, какие инструкции находятся на критическом путе для данных (т.е. какие инструкции нужно соптимизировать, чтобы результат работы этого кода вычислялся быстрее). Другое возможное значение: -cp THROUGHOPUT просит IACA показать, какие инструкции «затыкают» конвеер процессора.
-mark 0 говорит IACA проанализировать все помеченные маркерами участки кода. Если задать -mark n, IACA будет анализировать только n-ый размеченный участок кода.
6. Много думаем над результатом, делаем изменения в коде (каюсь, на этом этапе зачастую я просто бездумно переставляю инструкции местами и смотрю, что получилось) повторяем шаги 4-6 пока не надоест.
Теперь об ограничениях. Несмотря на то, что в выводе тула будут упомянуты u-ops и execution ports, IACA не является симулятором — он выполняет статический анализ. Например, если в анализируемом коде встречается команда условного перехода, IACA считает, что переход не происходит. Он также считает, что миссов в L1D и L1I, и тем более выше не бывает. Некоторые инструкции он не поддерживает и просто пропускает, в выводе на их месте появится "!".
Недавно на сайте появилась версия 2.0.1 с поддержкой анализа кода для SNB и IVB. В документации более подробно описано, как им пользоваться, и приведены несколько примеров типичных оптимизаций, которые можно найти при помощи IACA. Говорят, работает под Linux, Windowx, Mac OS X, но последнее я лично не проверял.
Автор: izard