Мне нужен простой и переносимый способ явной предварительной выборки данных. Я не хочу использовать специфическую особенность какого-либо конкретного компилятора или платформы, просто что-то достаточно общее для работы на разных платформах и компиляторах.
Одно очень наивное решение, которое приходит на ум, — это просто переместить байт / int из области памяти в регистр, который «должен» перенести этот сегмент памяти в кэш ЦП, чтобы заполнить строку, по крайней мере, это то, что я логично предполагаю. Но может быть, это будет не так просто? Одна из возможностей для компилятора — оптимизировать операцию, если к этим данным нет доступа в конкретной области, поэтому никакой предварительной выборки не произойдет.
Вообще говоря, предварительная загрузка и загрузка памяти — это не одно и то же. Есть несколько принципиальных отличий:
Так что просто придерживайтесь __builtin_prefetch
и пусть компилятор сделает тяжелую работу.
Также имейте в виду, что оптимизирующие компиляторы могут автоматически генерировать инструкции предварительной выборки. Я думаю, что если они это сделают, то вы должны убедиться, что вы не мешаете этому.
Еще одна интересная вещь заключается в том, что в целом явная предварительная выборка не улучшает производительность, а несколько снижает ее. Увидеть эта статья LWN для деталей и объяснения, почему предварительная выборка была полностью удалена из ядра Linux.
Надеюсь, поможет. Удачи!
Других решений пока нет …