Переносимая явная предварительная выборка

0

Мне нужен простой и переносимый способ явной предварительной выборки данных. Я не хочу использовать конкретную функцию какого-либо конкретного компилятора или платформы, просто нечто достаточно общее для работы на разных платформах и компиляторах.

Одно очень наивное решение, которое приходит на ум, - это просто переместить байт /int из памяти в регистр, что "должно" привести этот сегмент памяти в кеш процессора, чтобы заполнить строку, по крайней мере, это то, что я логически предполагаю. Но может быть, это будет не так просто? Одна из возможностей заключается в том, что компилятор должен оптимизировать работу, если эти данные не доступны в конкретной области, поэтому предварительная выборка не произойдет.

  • 0
    Вам нужно следить за тем, чтобы компилятор оптимизировал чтение вашей памяти, так как он будет думать, что они ничего не делают.
  • 0
    В c или c ++ нет переносимого способа сделать это, потому что нет гарантии, что вы компилируете в нативный код на машине регистрации. например, интерпретировать c ++ - root.cern.ch/drupal/content/cling и компилировать в jvm - nestedvm.ibex.org
Показать ещё 1 комментарий
Теги:
portability
prefetch

1 ответ

3

Вообще говоря, предварительная загрузка и загрузка памяти - это не совсем то же самое. Существует несколько принципиальных различий:

  1. Предварительная выборка неправильного адреса не вызывает сбоев, тогда как попытка чтения, записи или выполнения недействительного адреса создает ошибку (если у процессора есть MPU/MMU, конечно).
  2. Предварительная выборка может быть сделана для чтения и/или записи, а просто чтение байта в регистр - это просто чтение байта в регистр.
  3. Вы можете (теоретически) указать местность памяти при предварительной выборке.
  4. У CPU могут быть специальные инструкции для предварительной выборки, которые не совпадают с инструкциями загрузки памяти.

Поэтому просто придерживайтесь __builtin_prefetch и дайте компилятору тяжелую работу.

Кроме того, имейте в виду, что оптимизаторы компиляторов могут автоматически генерировать инструкции предварительной выборки. Я думаю, если они это сделают, тогда вам нужно будет убедиться, что вы не вмешиваетесь в это.

Еще одна интересная вещь заключается в том, что, в общем, явная предварительная выборка не улучшает производительность, но немного снижает ее. См. Эту статью LWN для подробностей и объяснений, почему предварительная выборка была полностью удалена из ядра Linux.

Надеюсь, поможет. Удачи!

  • 0
    Я хочу предварительно выбрать следующий узел при обработке текущего, я не думаю, что компиляторы смотрят так далеко "вперед". Узлы не являются последовательными в памяти, поэтому я не ожидаю, что аппаратные средства предварительной выборки процессора также будут полезны.
  • 0
    @ddriver: не угадай, внеси изменения и профиль. Как доказали разработчики ядра, предварительная выборка вручную снижает производительность в общем случае (просто прочитайте статью). Так что это вредная ложная оптимизация.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню