#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 вопроса здесь:
- Как получилось, что мониторинг одного и того же потока за одну и ту же продолжительность (10 секунд) приведет к совершенно разным подсчетам инструкций, а именно 421 м против 570 М ? Какой из них правильный?
- Я заметил, что процент первого метода составляет 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
помощью позволит избежать мультиплексирования. Я бы ожидал, что счетчики будут рассчитаны на одно ядро, так как отправка каждого ядра на центральный счетчик для каждого чипа была бы большим узким местом.