Инструкция prefetch
похоже, что общая логика использования prefetch заключается в том, что prefetch может быть добавлен, если код занят обработкой, пока инструкция prefetch не завершит свою работу. Но, похоже, что если используется слишком много инструкций предварительной выборки, это повлияет на производительность системы. Я считаю, что нам нужно сначала иметь рабочий код без инструкции prefetch. Позже нам нужно различное сочетание инструкций prefetch в разных местах кода и сделать анализ определите местоположения кода, которые могут улучшиться из-за предварительной выборки. Есть ли лучший способ определить точные местоположения, в которых должна использоваться инструкция prefetch ?
3 ответов
в большинстве случаев инструкции предварительной выборки мало или вообще не приносят пользы, а в некоторых случаях даже могут быть контрпродуктивными. Большинство современных процессоров имеют механизм автоматической предварительной выборки, который работает достаточно хорошо, чтобы добавление подсказок предварительной выборки программного обеспечения достигало мало или даже мешало автоматической предварительной выборке и могло фактически снизить производительность.
в некоторых редких случаях, например, когда вы передаете большие блоки данных, на которых вы делаете очень мало фактической обработки, вы можете удалось скрыть некоторую задержку с программным обеспечением-инициировала предварительную выборку, но это очень трудно сделать все правильно - нужно начать предварительную загрузку нескольких сотен циклов, прежде чем вы собираетесь использовать данные - сделать это слишком поздно, и вы все еще получаете кэш-промах, сделать это слишком рано, а ваши данные могут быть выселены из кэша, прежде чем вы готовы использовать его. Часто это помещает prefetch в некоторую несвязанную часть кода, что плохо для модульности и обслуживания программного обеспечения. Еще хуже, если ваша архитектура изменения (новый процессор, другая тактовая частота и т. д.), Такие, что задержка доступа DRAM увеличивается или уменьшается, вам может потребоваться переместить инструкции предварительной выборки в другую часть кода, чтобы они были эффективными.
в любом случае, если вы считаете, что действительно должны использовать prefetch, я рекомендую #ifdefs вокруг любых инструкций prefetch, чтобы вы могли скомпилировать свой код С и без prefetch и посмотреть, действительно ли он помогает (или мешает) производительности, например
#ifdef USE_PREFETCH
// prefetch instruction(s)
#endif
В общем, хотя, я рекомендуется оставить программную предварительную выборку на заднем плане в качестве последней микро-оптимизации после того, как вы сделали все более продуктивные и очевидные вещи.
чтобы даже рассмотреть производительность предварительной выборки кода, уже должна быть проблемой.
1: Используйте профилировщик кода. Попытка использовать prefetch без профилировщика-пустая трата времени.
2: всякий раз, когда вы найдете инструкцию в критическом месте, которая аномально медленная, у вас есть кандидат на предварительную выборку. Часто фактическая проблема заключается в доступе к памяти на линии перед медленной, а не медленной, как указано профилировщиком. Выясните, что вызывает доступ к памяти проблема (не всегда легкая) и prefetch ее.
3 запустите профилировщик еще раз и посмотрите, имеет ли это значение. Если она его не уберет. Иногда я ускорил петли на > 300% таким образом. Как правило, это наиболее эффективно, если у вас есть цикл доступа к памяти не последовательным способом.
Я полностью не согласен с тем, что он менее полезен на современных процессорах, я нашел совершенно противоположное, хотя на более старых процессорах предварительная выборка около 100 инструкций была оптимальной Я бы поставил это число на 500.
конечно, вы должны experimate немного, но не то, что вам нужно, чтобы принести циклы houndred Сомме (100-300) до необходимых данных. Кэш L2 является большим enougth, что предварительно собранные данные могут оставаться там некоторое время.
эта предварительная выборка очень эффективна перед циклом a (несколько циклов houndred, конечно), особенно если это внутренний цикл, и цикл запускается тысячу и более раз в секунду.
также для реализации ur ow fast LL или реализации дерева может ли предварительная выборка получить измеримое преимущество, потому что процессор не знает jet, что данные нужны в ближайшее время.
но помните, что инструкция предварительной выборки съедает некоторую пропускную способность декодера/очереди, поэтому чрезмерное их использование вредит производительности по этой причине.