Как я могу предварительно выбрать редко используемый код?

Я хочу предварительно загрузить некоторый код в кеш инструкций. Путь к коду используется нечасто, но мне нужно, чтобы он находился в кеше инструкций или, по крайней мере, в L2 для тех редких случаев, в которых он используется. У меня есть предварительное уведомление об этих редких случаях. _Mm_prefetch работает для кода? Есть ли способ получить этот редко используемый код в кеш? Для этой проблемы меня не волнует переносимость, так что даже asm подойдет.

3

Решение

Ответ зависит от архитектуры вашего процессора.

Тем не менее, если вы используете 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,

7

Другие решения

Никакой (официальной [1] x86) инструкции для предварительного выбора кода не существует, только данные. Я нахожу это довольно странным вариантом использования, где путь к коду известен заранее, но выполняется редко, и есть существенная выгода в предварительной загрузке кода. Было бы замечательно понять, откуда вы пришли к выводу, что есть существенная выгода в предварительной загрузке кода для этого особого случая, поскольку для этого потребуется не только анализ того, что код значительно медленнее, когда его не ударили по долгое время, но также и определение наличия резервных циклов шины для фактической загрузки кода, прежде чем процессор сможет предварительно извлечь его с помощью обычного механизма загрузки кода.

Вы можете использовать prefetch инструкции, которые извлекаются в L2, который обычно используется в I- и D-кэше.

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

3

По вопросам рекламы [email protected]