Есть ли способ принудительно сохранить переменную в кеше в C?

У меня просто было телефонное интервью, где меня задавали этот вопрос. Я знаю о способах хранения в регистре или куче или стеке, но кеш конкретно?

Не в C как язык. В GCC как компилятор – ищите __builtin_prefetch .

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

Редактировать:

Просто, чтобы очистить некоторые путаницы – кэши физически разделяют воспоминания в аппаратном обеспечении, но не в программной абстракции машины. Слово в кеше всегда связано с адресом в основной памяти. Это отличается от регистров процессора, которые называются / адресуются отдельно от ОЗУ.

В C, как и в соответствии с стандартом C? Нет.

В C, как в некоторой конкретной реализации на конкретной платформе? Может быть.

Поскольку кеш является концепцией процессора и не имеет смысла для языка C (а язык C имеет целевые процессоры, которые не имеют кеша, вряд ли сегодня, но довольно часто в старые времена) определенно нет .

Попытка оптимизировать такие вещи вручную также, как правило, довольно плохая идея.

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

Но это все равно будет зависеть от реального оборудования, и даже компилятор может не гарантировать его.

Это зависит от платформы, поэтому, если вы разговариваете с компанией, нацеленной на консоль текущего поколения, вам необходимо знать внутренние требования / инструкции кэширования данных PowerPC. На разных платформах вам также необходимо знать правила ложного обмена. Кроме того, вы не можете кэшировать из памяти, помеченной явно как незашифрованный.

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

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

Конкретный ответ будет зависеть от вашего компилятора и платформы. Если вы ориентируетесь на архитектуру MIPS, существует инструкция Cache (assembly), которая позволяет выполнять манипуляции с кешем CPU.