Я хочу предварительно загрузить некоторый код в кеш инструкций. Путь к коду используется нечасто, но мне нужно, чтобы он находился в кеше инструкций или, по крайней мере, в L2 для тех редких случаев, в которых он используется. У меня есть предварительное уведомление об этих редких случаях. _Mm_prefetch работает для кода? Есть ли способ получить этот редко используемый код в кеш? Для этой проблемы меня не волнует переносимость, так что даже asm подойдет.
Ответ зависит от архитектуры вашего процессора.
Тем не менее, если вы используете GCC или Clang, вы можете использовать __builtin_prefetch
инструкция, чтобы попытаться сгенерировать инструкцию предварительной выборки. На Pentium 3 и более поздних архитектурах типа x86 это создаст PREFETCHh
инструкция, которая запрашивает загрузку в иерархию кэша данных. Поскольку эти архитектуры имеют унифицированный L2 и более высокий кэш, это может помочь.
Функция выглядит так:
__builtin_prefetch(const void *address, int locality);
locality
аргумент должен быть в диапазоне 0 … 3. Если предположить, locality
карты непосредственно к h
часть PREFETCHh
инструкции, вы хотите передать 1 или 2, которые запрашивают данные для загрузки в кэш L2 и выше. Увидеть Руководство разработчика программного обеспечения для архитектуры Intel® 64 и IA-32
Том 2B: Справочник по набору инструкций, M-Z (PDF) стр. 4-277. (Найти другие тома здесь.)
Если вы используете другой компилятор, который не имеет __builtin_prefetch
посмотреть, есть ли у него _mm_prefetch
функция. Возможно, вам придется включить заголовочный файл, чтобы получить эту функцию. Например, в OS X эта функция и константы для locality
аргумент, объявлены в xmmintrin.h
,
Никакой (официальной [1] x86) инструкции для предварительного выбора кода не существует, только данные. Я нахожу это довольно странным вариантом использования, где путь к коду известен заранее, но выполняется редко, и есть существенная выгода в предварительной загрузке кода. Было бы замечательно понять, откуда вы пришли к выводу, что есть существенная выгода в предварительной загрузке кода для этого особого случая, поскольку для этого потребуется не только анализ того, что код значительно медленнее, когда его не ударили по долгое время, но также и определение наличия резервных циклов шины для фактической загрузки кода, прежде чем процессор сможет предварительно извлечь его с помощью обычного механизма загрузки кода.
Вы можете использовать prefetch
инструкции, которые извлекаются в L2, который обычно используется в I- и D-кэше.