Я могу профилировать счетчик команд моей библиотеки C ++ с помощью Vtune, используя событие INST_RETIRED.ANY.
Какие виды анализа или события могут использоваться в профилях с точки зрения количества сложений целых чисел / чисел с плавающей запятой, умножений, делений и т. Д.?
(TL: Dr): Я не думаю, что вы можете делать все, что вы хотите с перфокартами. Смотрите конец этого ответа для возможного способа использования бинарных инструментов
Также обратите внимание, что imul
это не дорогая операция, и FP mul чуть дороже, чем add. например на Скайлэйке, mulps
, addps
, а также fma
у всех одинаковая производительность (пропускная способность, задержка, мопы и выбор портов выполнения). На pre-Skylake, add был с меньшей задержкой, но и с половинной пропускной способностью, так как есть выделенный блок add.
Это не столько, что может сделать VTUNE, сколько счетчики производительности оборудования. например эта таблица перфронтных событий из линукса появился oprofile, когда я искал перф счетчики Sandybridge. Также этот более полный список для Linux perf
. Если аппаратное обеспечение может считать это, я предполагаю, что VTUNE может показать это вам, как только вы найдете правильное имя.
Протестируйте эти счетчики на простом коде с известным поведением, чтобы убедиться, что они работают так, как вы ожидаете, когда вы уже знаете, что делает код.
Я только посмотрел, что поддерживает Sandybridge. Я предполагаю, что у Haswell / Skylake тоже есть эти события и, вероятно, больше. Вы не сказали, какой у вас процессор, поэтому я не собираюсь проверять их все.
Pre-SnB не имеет столь широкого выбора счетчиков производительности, IIRC. Intel значительно улучшила счетчики производительности в SnB, наряду с другими значительными изменениями в ядре. Достаточно большой, что обычно считается новым семейством микроархитектур, отдельным от семейства P6 (PPro-Nehalem).
Я не думаю, что вы можете отличить целочисленное прибавление от целочисленного муль, или FP добавить от FP множественное. Вы можете рассчитывать активность FP, хотя: FP_COMP_OPS_EXE
«Подсчитывает количество событий с плавающей запятой», с масками для x87 и {pack, scalar} {single, double}.
Есть также SIMD_FP_256
, который насчитывает только 256b векторных операций FP.
Есть счетчик для событий, помогающих FP (когда операция FP должна возвращаться к микрокоду для обработки ненормального или чего-то еще).
Я не уверен, что это правильно, но perf
список говорит, что есть PARTIAL_RAT_STALLS
с Umask-02: 0x80: [MUL_SINGLE_UOP]
: Количество распределенных / скалярных мопов одинарной точности. Странно, что нет подобного счетчика двойной точности. Или, может быть mulss
является чем-то особенным в поведении частичных регистров, у PARTIAL_RAT_STALLS есть еще один подчиненный элемент для подсчета количества слияний частичных регистров.
делить (div
/ divps
) достаточно медленный, чтобы стоить иметь специальный счетчик, хотя: ШНБ arith.fpu_div
счетчик = «Количество раз, когда делитель активен, включает INT, SIMD и FP.» Там также счетчик для числа циклы делитель активен, а не количество раз это было активировано.
Пин Intel представляет собой динамический бинарный инструментарий для архитектур наборов команд IA-32 и x86-64, который позволяет создавать инструменты динамического анализа программ
У меня нет VTUNE, но могут быть способы использовать инструменты Pin из VTUNE. Это заставит ваш код работать медленнее, потенциально намного медленнее. Я думаю, что это работает путем JIT-компиляции из обычного машинного кода в инструментальный машинный код, где инструментарий — это дополнительные инструкции для счетчиков приращений. У него могут быть другие режимы работы, например, пошаговое выполнение исходного кода и подсчет всего объема.
Других решений пока нет …