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

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

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

0

Решение

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

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

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

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

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

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

3

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

Других решений пока нет …

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