Подтвердить что ты не робот

Команда предварительной выборки

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

4b9b3361

Ответ 1

В большинстве случаев инструкции по предварительной выборке мало или вообще не приносят пользы и могут быть даже контрпродуктивными в некоторых случаях. Большинство современных процессоров имеют механизм автоматической предварительной выборки, который работает достаточно хорошо, что добавление подсказок предварительной выборки программного обеспечения мало или даже мешает автоматической предварительной выборке и может фактически снизить производительность.

В некоторых редких случаях, например, при потоковой передаче больших блоков данных, на которых вы делаете очень мало фактической обработки, вы можете скрыть некоторую задержку с предварительной загрузкой программного обеспечения, но это очень сложно сделать правильно - вам нужно запустить предварительную выборку за несколько сотен циклов до того, как вы собираетесь использовать данные - сделайте это слишком поздно, и вы все равно получите пропущенный кэш, сделайте это слишком рано, и ваши данные могут быть выселены из кеша, прежде чем вы будете готовы использовать его, Часто это приведет к предварительной выборке в какой-то несвязанной части кода, что плохо для модульности и обслуживания программного обеспечения. Хуже того, если ваша архитектура изменится (новый процессор, другая тактовая частота и т.д.), Так что время ожидания доступа к DRAM увеличивается или уменьшается, вам может потребоваться переместить инструкции предварительной выборки в другую часть кода, чтобы они были эффективными.

В любом случае, если вы считаете, что вам действительно нужно использовать предварительную выборку, я рекомендую #ifdefs использовать любые инструкции по предварительной выборке, чтобы вы могли скомпилировать свой код с предварительной выборкой и без нее и посмотреть, действительно ли это помогает (или препятствует) производительности, например

#ifdef USE_PREFETCH
    // prefetch instruction(s)
#endif

В общем, я бы порекомендовал оставить предварительную выборку программного обеспечения на задней панели в качестве последней меры микро-оптимизации после того, как вы сделали все более продуктивные и очевидные вещи.

Ответ 2

Чтобы даже рассмотреть возможность предварительной загрузки кода, проблема уже возникла.

1: используйте профайлер кода. Попытка использовать предварительную выборку без профилировщика - пустая трата времени.

2: всякий раз, когда вы находите инструкцию в критическом месте, аномально медленном, у вас есть кандидат на предварительную выборку. Часто фактическая проблема связана с доступом к памяти на линии до медленной, а не медленной, как указано профилировщиком. Выясните, какой доступ к памяти вызывает проблему (не всегда легко) и предварительно вычитайте ее.

3 Снова запустите свой профилировщик и посмотрите, не изменилось ли это. Если бы это не вышло. Иногда я ускорял циклы нa > 300%. Это обычно наиболее эффективно, если у вас есть цикл доступа к памяти не последовательным образом.

Я не согласен с тем, что он менее полезен для современных процессоров, я нашел совершенно противоположное, хотя на более раннем процессоре, предварительно запрограммировавшем около 100 инструкций, было оптимальным, в этот день я бы поставил это число больше, чем 500.

Ответ 3

Конечно, вам нужно немного экспериментировать, но не нужно, чтобы вам нужно было использовать соммедренные циклы (100-300), прежде чем данные будут необходимы. Кэш L2 имеет большое значение, поскольку предварительно загруженные данные могут оставаться там.

Эта предварительная выборка очень эффективна перед циклом (конечно, с несколькими замкнутыми циклами), особенно если это внутренний цикл, и цикл запускается тысячами и более раз в секунду.

Кроме того, для быстрой реализации LL или реализации Tree-pre может потребоваться измеримое преимущество, потому что ЦП не знает струи, что данные необходимы в ближайшее время.

Но помните, что команда prefetching потребляет некоторую пропускную способность декодера/очереди, поэтому из-за этого они слишком сильно вредят производительности.