Как мне объяснить, что количество инструкций, полученных с помощью статистики simpleperf, запись в одном потоке НЕ идентичны?

#android #perf #instructions #multiplexing

Вопрос:

Я инженер, разрабатывающий что-то на платформе Android, поэтому использование simpleperf-это просто что-то нормальное для оценки производительности потоков. Однако недавно я столкнулся с дилеммой, мне интересно, какую статистику я должен использовать, давайте рассмотрим следующий пример:

Среда: ThreadId:27473 запуск цикла while, выполняющего то же самое в фоновом режиме

i) >>>>>> инструкции simpleperf stat -e-t 27473 —продолжительность 10 —использование-счетчиков частоты>>>

 Performance counter statistics:

#       count  event_name     # count / runtime,  runtime / enabled_time
  421,117,470  instructions   # 1.349 G/sec  (61%)

Total test time: 10.001907 seconds.
simpleperf W cmd_stat.cpp:863] Percentages < 100% means some events only run a subset of enabled time,
probably caused by hardware counter multiplexing (less counters than events).
Try --use-devfreq-counters if on a rooted device.
 

ii) >>>>>># простая запись-инструкции g -t 27473 -e-продолжительность 10 -o /sdcard/perf.данные -f 4000 -m 8192>>>

 Event: instructions (type 0, config 1)
Samples: 1688
Event count: 570506200

Overhead   Command    Pid  Tid
570506200  SomeThread  684  27473
 

У меня есть 2 вопроса здесь:

  1. Как получилось, что мониторинг одного и того же потока за одну и ту же продолжительность (10 секунд) приведет к совершенно разным подсчетам инструкций, а именно 421 м против 570 М ? Какой из них правильный?
  2. Я заметил, что процент первого метода составляет 61%, поэтому я пытаюсь «НОРМАЛИЗОВАТЬ» данные с помощью этого, не знаю, правильно ли я поступаю: 421 М / 0,61 = 688 М, все еще далек от соответствия 2-му методу 570 М, как я могу откалибровать эти 2 статистики?

Спасибо, что спас меня

Комментарии:

1. perf stat Подсчеты уже нормализованы для мультиплексирования, исходя из предположения, что 61% времени, которое было отобрано, является репрезентативным для остальных. Я не знаком с simpleperf вещами, специфичными для Android, только perf для Linux x86-64, поэтому кажется странным, что у вас будет какое-либо мультиплексирование при подсчете только одного аппаратного события. На моем рабочем столе Intel на логическое ядро приходится 4 программируемых счетчика, поэтому любые 4 события могут быть подсчитаны без какого-либо мультиплексирования.

2. Вы уверены, что частота процессора была одинаковой для обоих запусков? Может ли это быть подсчет инструкций ядра пользователя (включая обработчики прерываний)? perf stat --all-user , или -e instructions:u ограничился бы только пользовательским пространством.

3. @Питер Кордес, спасибо за ваш ответ. Пункт, о котором вы упомянули, — это действительно еще одна вещь, которая меня интересует. Как только я использую simpleperf stat-a, мультиплексирования не произошло. Поэтому я думаю, что, возможно, мне еще предстоит пройти долгий-долгий путь для исследования этого вопроса

4. IDK, почему профилирование всей системы / всех процессоров с -a помощью позволит избежать мультиплексирования. Я бы ожидал, что счетчики будут рассчитаны на одно ядро, так как отправка каждого ядра на центральный счетчик для каждого чипа была бы большим узким местом.