Я думаю, что единственный надежный способ подсчета всех SIMD-инструкций (не только FP math) - это динамические c инструментарий (например, через что-то вроде Intel PIN / SDE).
См. Как охарактеризовать рабочую нагрузку, получив разбивку по типам команд? и Как определить количество машинных инструкций x86, выполненных в программе C? в частности, sde64 -mix -- ./my_program
для печати набора команд для вашей программы для этого запуска, пример вывода в libsvm, скомпилированного с AVX, против AVX
Я не думаю, что есть хороший способ сделать это, например, top
/ htop
, если возможно даже безопасно подключиться к уже запущенным процессам, особенно многопоточным.
Возможно также получить Dynami c инструкция подсчитывает, используя последние записи веток для записи / восстановления пути выполнения и подсчета всего, но я не знаю инструментов для этого. Теоретически это может быть связано с уже запущенными программами без особой опасности, но потребовалось бы много вычислений (инструкции по разборке и подсчету), чтобы сделать это на лету для всех запущенных процессов . Это не то же самое, что запросить у ядра статистику использования ЦП, чтобы оно все равно отслеживало переключатели контекста.
Вам потребуется поддержка подсчета инструкций для аппаратного обеспечения, чтобы это было действительно эффективным, как top
.
Для SIMD специально для математики с плавающей точкой (не тасования FP, а просто математика FP как vaddps
), есть события счетчика перфорации.
например, с выхода perf list
:
fp_arith_inst_retired.128b_packed_single
[Число вычислительных 128-битных SSE / AVX упакованных команд с плавающей запятой одинарной точности исключено. Каждый отсчет представляет 4 вычисления . Применяется к инструкциям с плавающей запятой одинарной точности SSE * и AVX *: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM (N) ADD / SUB. Команды DPP и FM (N) ADD / SUB считаются дважды, поскольку они выполняют несколько вычислений для каждого элемента]
Так что это даже не подсчет мопов, это подсчет FLOPS. Существуют другие события для ...pd
упакованных двойных и 256-битных версий каждого. (Я предполагаю, что на процессорах с AVX512 есть также 512-битные векторные версии этих событий.)
Вы можете использовать perf
для подсчета их выполнения глобально между процессами и на всех ядрах. Или для одного процесса
## count math instructions only, not SIMD integer, load/store, or anything else
perf stat -e cycles:u,instructions:u,fp_arith_inst_retired.{128,256}b_packed_{double,single}:u ./my_program
# fixme: that brace-expansion doesn't expand properly; it separates with spaces not commas.
(Намеренно опущено fp_arith_inst_retired.scalar_{double,single}
, потому что вы спрашивали только о SIMD, и скалярные инструкции в регистрах XMM не учитываются, IMO.)
( Вы можете присоединить perf
к запущенному процессу, используя -p PID
вместо команды. или используйте perf top
, как предложено в See Ubuntu - как определить, AVX или SSE , используется ли текущее приложение ЦП?
Вы можете запустить perf stat -a
для глобального мониторинга на всех ядрах, независимо от того, какой процесс выполняется. Но опять-таки, здесь учитывается только математика FP, а не SIMD в general.
Тем не менее, он поддерживается аппаратно и, следовательно, может быть достаточно дешевым, чтобы использовать что-то вроде htop
, не тратя много времени на процессор, если вы оставите его работающим в течение длительного времени.