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