Я читал об оптимизации кеша в C ++ и механизмах, которые современные ЦП используют для прогнозирования того, какие данные понадобятся дальше, для их копирования в кеш. Но существует ли прямой путь в C ++ для программистов, которые знают, что на самом деле нужно дальше, чтобы определить, какие данные копируются в кэш процессора?
Это зависит от процессора и компилятора, который вы используете.
Предполагая, что вы используете процессор Intel x86 / x64 или совместимый (например, AMD), процессор предоставляет ряд инструкций предварительной выборки, и большинство компиляторов содержат встроенные функции для их вызова. С VC ++ вы используете _m_prefetch
или же _m_prefetchw
, С gcc вы используете __builtin_prefetch
,
Кроме того, VC ++ на ARM обеспечивает __prefetch
присущ для той же цели (нет, я действительно не знаю, почему они не могли использовать то же имя, что и в x86; подпись и эффект выглядят одинаково).
Большинство других достаточно современных высокопроизводительных процессоров, вероятно, предоставляют аналогичные инструкции, и
Я предполагаю, что большинство компиляторов предоставляют встроенные функции, чтобы сделать их доступными, но Как и в случае с ними, имена внутренних компонентов будут разными. В этом отношении, даже если функции являются неотъемлемой частью компилятора, большинство из них требует, чтобы вы использовали какой-то заголовок для их использования — и имя заголовка также будет отличаться.
Встроенные в предварительную выборку Джерри сделали бы свое дело. имейте в виду, что есть несколько разновидностей, управляемых аргументом этой функции, определяющей, какие уровни кэша (если они есть) будут использоваться для сохранения строки. Prefetch_NTA, например, для не будет загрязнять кеш, а предоставит линию только для немедленного использования (и используется в тех случаях, когда вы собираетесь использовать ее в ближайшее время и только один раз)
Также имейте в виду, что эти инструкции в основном являются подсказками для процессора (что также само по себе неплохо пытается угадать, какие строки нужно предварительно выбрать). Как таковые они не гарантированно работает, во многих случаях они могут потерпеть неудачу (если подсистема памяти загружена или адрес выгружен из памяти).