Замедленные циклы из-за инструкции fldz

Я пытаюсь интерпретировать некоторые результаты перфорации на процессоре 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?

редактировать: уточнил, что переменные являются поисками, а не вычислениями.

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]