Предварительная выборка выровненной памяти - PullRequest
1 голос
/ 25 июня 2011

У меня есть некоторый многопоточный C-код, который требует 64-байтового выравнивания обработанной структуры данных. Как это выравнивание будет взаимодействовать с инструкциями предварительной выборки, такими как gcc __builtin_prefetch? Будет ли эффект предварительной выборки таким же, как при использовании невыровненного массива или нет?

Обратите внимание, что я использую memalign для получения выровненного массива.

Спасибо.

1 Ответ

1 голос
/ 25 июня 2011

Ответ на этот вопрос сильно зависит от реализации.

Однако в x86 и x86_64 GCC реализует __builtin_prefetch как отдельную PREFETCH инструкцию по сборке.

Согласно документации Intel (поиск "PREFETCH"):

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

Я на 99% уверен, что версия AMD ведет себя так же, но я слишком занят, чтобы проверить ...

Таким образом, если операнд памяти не выровнен, он будет эффективно округлен до кратного 64 байт и эта строка кэша будет предварительно выбрана. (Что ж, 64 байта на всех текущих процессорах, о которых я знаю. Ссылка на набор инструкций гарантированно будет «минимум 32 байта». Не уверен, почему они удосужились сказать это; в любой ситуации, где имеет смысл использовать этот гаджет, Вы должны уже много думать о конкретном процессоре.)

...