Результаты исследования микроархитектуры Paradoxal VTune Amplifier

Я пытаюсь оптимизировать функцию приближения sin/cos. В основе лежит простая схема Хорнера, состоящая из набора операций умножения и добавления. Компилятор — MSVC от VS2017, процессор — Intel Xeon E5-1650, гиперпоточность включена (но наблюдения практически идентичны, если она выключена).

Используя Intel VTune Amplifier 2019, я получил результаты профилирования (конечно, релизную сборку) для> 1 минуты запуска функции на случайных двойниках (между -2 pi и 2 pi), при этом ~ 40% тактов было потрачено в показанном разделе. ниже (остальное - уменьшение дальности + тестовая обвязка). Однако я не могу понять микроархитектурные метрики, которые мне представляет VTune:

Результаты профилирования (атрибуция исходной строки MSVC после встраивания ужасна.)

Вот соответствующий код C++, который был встроен:

void stableSinCosApproximation(double x, double* sinApprox, double* cosApprox)
{
    double x2 = x * x;
    *sinApprox = x * (sinCoeff[7] + x2 * (sinCoeff[6] + x2 * (sinCoeff[5] + x2 * (sinCoeff[4] + x2 * (sinCoeff[3] + x2 * (sinCoeff[2] + x2 * (sinCoeff[1] + x2 * sinCoeff[0])))))));
    *cosApprox = (cosCoeff[7] + x2 * (cosCoeff[6] + x2 * (cosCoeff[5] + x2 * (cosCoeff[4] + x2 * (cosCoeff[3] + x2 * (cosCoeff[2] + x2 * (cosCoeff[1] + x2 * cosCoeff[0])))))));
}

Очевидно, что ассемблерный листинг содержит только один непрерывный блок инструкций. Никаких переходов (и никаких целей перехода), никакого ветвления или условного выполнения вообще. Тем не менее, здесь есть несколько показателей, значения которых я не могу понять с помощью информации, предоставленной встроенной или онлайн-справкой VTune.

Конкретный вопрос:

  • Во второй половине кода почти нет атрибуции, тактов и прочего. Почему?

  • Первая половина имеет постоянно растущий уровень потребительских цен. Хорошо, может быть, это и предыдущий пункт связаны с чем-то, связанным с неправильной атрибуцией, но я этого не понимаю.

  • Метрики говорят, что есть плохие спекуляции. Но при расширении этого столбца он не показывает ни ошибочных прогнозов ветвей, ни очистки машины: введите здесь описание изображения Что это должно мне сказать? В каком качестве ЦП спекулирует здесь?

  • Я также предположительно теряю хороший кусок uops из-за привязки к интерфейсу. Является ли корреляция с колонкой плохих предположений всего лишь совпадением? Что мне делать с этой информацией? введите здесь описание изображения

Предварительные примечания:

  • Повторная реализация гарантирует согласованность на нескольких платформах (из одного и того же двоичного файла). Встроенные функции sin/cos могут различаться на несколько ULP на разных машинах, что может убить воспроизводимость результатов.

  • Да, я знаю о FMA, но не каждая платформа, на которой должен работать этот (один) двоичный файл, предоставляет их. В данный момент я не собираюсь отправлять сообщения во время выполнения.


person Max Langhof    schedule 30.11.2018    source источник
comment
Измерение плохой спекуляции очень мало, так что это не очень важно. Покрытие DSB очень низкое, но кажется, что у вас нет прилавков внешнего интерфейса, так что это не имеет значения. Однако у вас, кажется, много серых данных, что означает, что VTune не доверяет им, поэтому они не очень надежны. Можете ли вы предоставить более подробную информацию о настройке VTune, которую вы использовали? Можете ли вы воспроизвести эти результаты? Из изображений, которые вы показали, мне не ясно, где находится узкое место, потому что все выглядит хорошо.   -  person Hadi Brais    schedule 02.12.2018
comment
Что касается вашего первого вопроса, никакие данные не будут отнесены к инструкции, если в этой инструкции не был взят образец, поэтому вы увидите пустые ячейки. Что касается вашего третьего вопроса, я думаю, что это связано с мультиплексированием событий. Что касается вашего четвертого вопроса, можно свернуть столбец, связанный с внешним интерфейсом, чтобы я мог видеть, действительно ли он связан с внешним интерфейсом. Мне также нужно увидеть столбец с привязкой к серверу   -  person Hadi Brais    schedule 02.12.2018
comment
Что касается вашего второго вопроса, похоже, у вас есть две длинные цепочки зависимостей: одна начинается с movsd xmm1, [rip+0x38de], а другая начинается с movsd xmm1, [rip+0x386a]. Эти две цепочки могут выполняться параллельно, но только если они чередуются, что можно сделать, заставив их использовать разные регистры (например, xmm2).   -  person Hadi Brais    schedule 02.12.2018
comment
@HadiBrais Спасибо за комментарии! Что касается плохих спекуляций: VTune говорит мне, что я теряю около 13% из-за плохих спекуляций. Я бы не беспокоился об этом, но это происходит почти исключительно из этого (свободного от спекуляций?) раздела. Результаты очень хорошо воспроизводимы. Я провел еще один сеанс с возможностью нескольких прогонов, чтобы устранить все проблемы с мультиплексированием, и результаты практически идентичны — такое же отсутствие данных для второй цепочки, те же (частично худшие) распределения в столбцах CPI, Retiring, Front-End и Bad Speculation.   -  person Max Langhof    schedule 03.12.2018
comment
13% это много. Но метрика плохих спекуляций из изображений, которыми вы поделились, не составляет в сумме 13%, так что это должно быть откуда-то еще.   -  person Hadi Brais    schedule 03.12.2018
comment
Что касается установки, то она настолько стандартна, насколько это возможно. Недавняя установка VS2017, VTune 2019, исследование микроархитектуры на тестовом примере, который запускает исключительно функцию sin/cos в течение 20 секунд. Я забыл упомянуть/показать это, но указанный участок составляет около 40% всех записанных тактовых импульсов (остальное — тестовая обвязка + уменьшение диапазона). Я сделаю еще один запуск сейчас, так как код/двоичный файл изменился, поэтому я не могу делать больше скриншотов прямо сейчас.   -  person Max Langhof    schedule 03.12.2018
comment
Какой интервал выборки процессора вы использовали? Это 1 мс по умолчанию?   -  person Hadi Brais    schedule 03.12.2018
comment
@HadiBrais 2 мс (по умолчанию для исследования стандартной архитектуры, я полагаю). Режим сбора — Подробный, а режим финализации — Быстрый (все по умолчанию).   -  person Max Langhof    schedule 03.12.2018
comment
Давайте продолжим обсуждение в чате.   -  person Max Langhof    schedule 03.12.2018


Ответы (1)


Можете ли вы показать скриншоты из панели снизу вверх VTune вместо панели сборки? Интересно увидеть характеристику всей функции (например, значения Bad Speculation и Front-End Bound, количество событий BR_MISP_RETIRED.ALL_BRANCHES_PS и MACHINE_CLEARS.COUNT).

person rdb77    schedule 10.12.2018
comment
Да, см. чат, например. этот снимок экрана. Я был бы признателен, если бы вы могли дать объяснение, в частности, количество циклов восстановления. - person Max Langhof; 10.12.2018