Как я могу контролировать количество использования SIMD инструкции - PullRequest
1 голос
/ 07 февраля 2020

Как я могу контролировать количество использования инструкций SIMD (SSE, AVX, AVX2, AVX-512) процессом? Например, htop может использоваться для мониторинга общего использования ЦП, но не конкретно использования инструкций SIMD.

1 Ответ

4 голосов
/ 07 февраля 2020

Я думаю, что единственный надежный способ подсчета всех 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, не тратя много времени на процессор, если вы оставите его работающим в течение длительного времени.

...