2012-04-25 2 views
13

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

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

+6

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

+6

См. Этот вопрос для примера того, где на самом деле помогает предварительная выборка: http://stackoverflow.com/questions/7327994/prefetching-examples – Mysticial

+2

Вы имеете в виду, что аппаратный предварительный выбор каким-то образом признает, что я использую смежные области в памяти и доставляю эти части в кеш ? – pythonic

ответ

16

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

13

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

+4

+1 Я попытался выполнить предварительную выборку, по крайней мере, в 10 разных случаях. Только однажды мне удалось добиться заметного ускорения. (тот, который я связал в комментариях.) – Mysticial

+4

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

+1

Предварительная выборка не требуется - пока это не будет необходимо. В моем текущем приложении шаблоны доступа к памяти не были замечены аппаратным предварительным фиксатором. И, к сожалению, изменение этих шаблонов доступа, чтобы быть более ориентированным на pre-fetcher, не было вариантом. Следовательно - _mm_prefetch. Пропускная способность снизилась на ~ 10%, но мы достигли желаемых номеров. Это был очень сознательный компромисс, который был сделан после большого профилирования через perf и vtune. – quixver

Смежные вопросы