В вычислениях инструкция управления кешем является подсказкой, встроенной в поток инструкций в процессор, предназначенный для повышения производительности аппаратных кэшей, с использованием предварительного знания о шаблоне доступа к памяти, предоставленном программистом или компилятор. Они могут уменьшить загрязнение кеша, снизить требования к пропускной способности, обойти задержки, обеспечивая лучший контроль над рабочим набором. Большинство инструкций управления кешем не влияют на семантику программы, хотя некоторые могут.
Несколько таких инструкций с вариантами поддерживаются несколькими архитектуры процессора набора команд, например ARM, MIPS, PowerPC и x86.
Также называется касанием блока кэша данных, эффект заключается в запросе загрузки строки кэша, связанной с заданным адресом. Это выполняется командой PREFETCH
в наборе команд x86. Некоторые варианты обходят более высокие уровни иерархии кэша , что полезно в контексте «потоковой передачи» для данных, которые проходят один раз, а не хранятся в рабочем наборе. Предварительная выборка должна происходить достаточно далеко вперед по времени, чтобы уменьшить задержку доступа к памяти, например, в цикле линейного обхода памяти. Внутренняя функция GNU Compiler Collection __builtin_prefetch
может использоваться для вызова этого в языках программирования C или C ++.
Вариант предварительной выборки для кэша инструкций.
Эта подсказка используется для подготовки строк кэша перед полной перезаписью содержимого. В этом примере ЦП ничего не загружает из основной памяти. Семантический эффект эквивалентен выравниванию memset блока размером с строку кэша до нуля, но операция фактически бесплатна.
Эта подсказка используется для отбрасывания строк кэша без сохранения их содержимого в основной памяти. Необходима осторожность, поскольку возможны неверные результаты. В отличие от других подсказок кеша, семантика программы значительно изменена. Это используется вместе с нулевым выделением
для управления временными данными. Это экономит ненужную полосу пропускания основной памяти и загрязнение кеша.
Эта подсказка требует немедленного удаления строки кэша, освобождая место для будущих распределений. Он используется, когда известно, что данные больше не являются частью рабочего набора.
Некоторые процессоры поддерживают вариант инструкций загрузки – сохранения, которые также подразумевают подсказки кеша. Примером может служить загрузить последний
в наборе инструкций PowerPC, который предполагает, что данные будут использоваться только один раз, т.е. соответствующая строка кэша может быть помещена в начало очереди на выселение., при этом оставив его в использовании, если все еще необходимо.
В последнее время инструкции управления кешем стали менее популярными, поскольку все более совершенные конструкции процессоров приложений от Intel и ARM выделяет больше транзисторов для ускорения кода, написанного на традиционных языках, например, для выполнения автоматической предварительной выборки с аппаратным обеспечением для обнаружения линейных шаблонов доступа на лету. Однако эти методы могут оставаться применимыми для процессоров, ориентированных на пропускную способность, которые имеют другой компромисс между пропускной способностью и задержкой, и могут предпочесть выделить больше места для исполнительных модулей.
Некоторые процессоры поддерживают оперативную память, в которую могут быть помещены временные файлы, и прямой доступ к памяти (DMA) для передачи данных и из основной памяти при необходимости. Этот подход используется процессором Cell и некоторыми встроенными системами. Это позволяет лучше контролировать трафик и локальность памяти (поскольку рабочий набор управляется явными передачами) и устраняет необходимость в дорогостоящей согласованности кэша на многоядерной машине.
Недостаток в том, что для этого требуются существенно разные методы программирования. Очень сложно адаптировать программы, написанные на традиционных языках, таких как C и C ++, которые предоставляют программисту единообразное представление о большом адресном пространстве (что является иллюзией, моделируемой кешами). Традиционный микропроцессор может более легко запускать унаследованный код, который затем может быть ускорен с помощью инструкций управления кешем, в то время как машина на основе блокнота требует специального кодирования с нуля до четной функции. Команды управления кэшем относятся к определенному размеру строки кэша, который на практике может варьироваться между поколениями процессоров одного и того же архитектурного семейства. Кеши также могут помочь объединить операции чтения и записи из менее предсказуемых шаблонов доступа (например, во время сопоставления текстур ), в то время как блокнотный DMA требует переработки алгоритмов для более предсказуемого «линейного» обхода.
Поскольку такие блокноты обычно труднее использовать с традиционными моделями программирования, хотя модели потока данных (такие как TensorFlow ) могут быть более подходящими.
Векторные процессоры (например, современный графический процессор (GPU) и Xeon Phi ) используют массивный параллелизм для достижения высокой пропускной способности, работая с задержкой памяти (уменьшая потребность в предварительной выборке). Многие операции чтения выполняются параллельно для последующих вызовов вычислительного ядра ; вычисления могут быть приостановлены в ожидании будущих данных, в то время как исполнительные блоки посвящены работе с данными из прошлых запросов, которые уже появились. Программистам проще использовать в сочетании с соответствующими моделями программирования (вычислительные ядра ), но сложнее применить к программированию общего назначения.
Недостатком является то, что многие копии временных состояний могут храниться в локальной памяти элемента обработки, ожидая данных в полете.