Почему количество инструкций в счетчиках производительности Linux недетерминировано

Чтобы иметь возможность профилировать время выполнения приложений, двоичные файлы которых будут фактически запускаться под симулятором (NS-3 / DCE). Я хотел использовать счетчики производительности linux, я ожидал, что счетчик инструкций для приложения, не имеющего источника недетерминизма, будет детерминированным. Судя по счетчикам производительности Linux, я не мог больше ошибаться, давайте рассмотрим простой пример:

$ (perf stat -c -- sleep 1 2>&1 && perf stat -c -- sleep 1 2>&1) |grep instructions
        669218 instructions              #    0,61  insns per cycle
        682286 instructions              #    0,58  insns per cycle

1) В чем источник этого недетерминизма? Происходит ли это из-за низкоуровневого прогнозирования ветвлений и других механизмов в ЦП.

2) Другой вопрос: есть ли способ узнать количество инструкций, переданных в ЦП (в отличие от количества инструкций в выходных данных примера), чтобы получить количество выполненного кода детерминированным способом?


person hbogert    schedule 02.12.2014    source источник


Ответы (1)


Резюме:

1) Недетерминизм вызван изменением команды sleep 1 не из-за предсказания ветвлений или других особенностей микроархитектуры.

2) Вы можете узнать количество полученных инструкций, используя аппаратный счетчик четности, если ваш процессор поддерживает его. Однако это будет больше, чем количество удаленных инструкций (что обычно сообщает perf для инструкций).

Подробности:

Команда sleep не является хорошим тестовым примером, если вы хотите выполнить детерминированное количество инструкций. Он будет выполнять недетерминированное количество инструкций, потому что будет небольшое изменение в том, что делает ядро.

Вы можете указать, следует ли собирать количество инструкций в пользовательском режиме или в режиме ядра, с помощью instructions:u для пользовательского режима или instructions:k для режима ядра. Для двух прогонов:

perf stat -e instructions:k,instructions:u,instructions sleep 1

Получаю следующие результаты:

Performance counter stats for 'sleep 1':

       373,044 instructions:k            #    0.00  insns per cycle        
       199,795 instructions:u            #    0.00  insns per cycle        
       572,839 instructions              #    0.00  insns per cycle        

   1.001018153 seconds time elapsed

и

Performance counter stats for 'sleep 1':

       379,722 instructions:k            #    0.00  insns per cycle        
       199,970 instructions:u            #    0.00  insns per cycle        
       579,519 instructions              #    0.00  insns per cycle        

   1.000986201 seconds time elapsed

Как видите, фактическое истекшее время sleep 1 немного отличается. Что является источником недетерминизма. Однако количество инструкций пользовательского режима меньше вариаций, чем инструкций режима ядра.

person Gabriel Southern    schedule 02.12.2014
comment
Хорошо, это уже очень помогает мне понять это, хотя что может быть источником различий в пользовательских инструкциях? - person hbogert; 03.12.2014
comment
@hbogert Количество инструкций для x86_64 не совсем детерминировано. На каждое выполненное прерывание засчитывается дополнительная инструкция. Если вам нужны дополнительные сведения, см. Этот документ: web.eece.maine. edu / ~ vweaver / projects / детерминированный / - person Gabriel Southern; 03.12.2014