Могу ли я управлять тем, что копируется в кэш процессора в C++?


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

2 2

2 ответа:

Это зависит от используемого процессора и компилятора.

Предполагая, что вы используете Процессор Intel x86/x64 или совместимый (например, AMD), процессор предоставляет ряд инструкций предварительной выборки, и большинство компиляторов включают встроенные средства для их вызова. С VC++ вы используете _m_prefetch или _m_prefetchw. С gcc вы используете __builtin_prefetch.

Аналогичным образом, VC++ на ARM предоставляет __prefetch встроенную функцию для той же цели (нет, я действительно не знаю, почему они не могли использовать то же имя, что и на x86; подпись и эффект оказывается одинаковым).

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

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

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