Подтвердить что ты не робот

Предварительная выборка данных в кеш для x86-64

В моем приложении в какой-то момент мне нужно выполнить вычисления на большом непрерывном блоке данных памяти (100 м МБ). То, что я думал, состояло в том, чтобы сохранить предварительную выборку части блока, к которой моя программа коснется в будущем, так что, когда я выполняю вычисления на этой части, данные уже находятся в кеше.

Может кто-нибудь дать мне простой пример того, как добиться этого с помощью gcc? Я где-то читал _mm_prefetch, но не знаю, как правильно его использовать. Также обратите внимание, что у меня многоядерная система, но каждое ядро ​​будет параллельно работать с другим регионом памяти.

4b9b3361

Ответ 1

gcc использует встроенные функции в качестве интерфейса для инструкций низкого уровня. В частности, для вашего случая __builtin_prefetch. Но вы должны видеть только измеримую разницу при использовании этого в тех случаях, когда шаблон доступа нелегко предсказать автоматически.

Ответ 2

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