Я пытаюсь интерпретировать некоторые результаты перфорации на процессоре Xeon x5675. У меня есть программа, где большой процент циклов являются киосками (от perf stat
). С помощью perf record -e stalled-cycles-frontend,stalled-cycles-backend
, Я нашел это и то и другое передние и задние ларьки в значительной степени из-за одного fldz
инструкция.
Эта инструкция находится внутри цикла, который выполняет следующее (из objdump -D -S objectfile.o
):
// function is inlined by compiler
void doit(double someval, float cutoff) {
double other = lookupOther(); // just a memory access
if (someval && other - someval > cutoff) // fldz instruction is from the 'someval != 0' check
...
}
Сначала я подумал, что может возникнуть конфликт ресурсов из-за гиперпоточности (несколько экземпляров процесса выполняются непрерывно на одном компьютере), поэтому я привязал каждый экземпляр к ядру, используя taskset
и гарантировал, что ни один другой процесс не использовал ядро с поддержкой многопоточности моего ядра профилированного процесса (я не могу перезагрузить компьютер, чтобы установить isolcpus
параметр загрузки). Я проверил в top
что ничто из FPU-тяжелых не использует ядро (только прерывания и оболочка bash). К сожалению, я получаю почти идентичные результаты профилирования.
Я так же проверил LLC-load/store-misses
а также L1-dcache-load/store-misses
; оба они показали ту же инструкцию, что и горячая точка. Как ни странно, L1-icache-load-misses
делает не показать fldz
инструкция на всех.
Мое окончательное предположение состояло в том, что киоски с инструкциями были из-за неправильного предсказания ветви, но записи branch-misses
также не показывает fldz
инструкция.
Как еще я могу интерпретировать как инструкции, так и киоски данных из-за fldz
?
редактировать: уточнил, что переменные являются поисками, а не вычислениями.
Задача ещё не решена.