Поиск лучших эквивалентов инструкций предварительной выборки для ia32, ia64, amd64 и powerpc - PullRequest
5 голосов
/ 13 февраля 2012

Я смотрю на некоторый немного запутанный код, который пытается абстрагировать платформу инструкций предварительной выборки, используя различные встроенные компиляторы. Похоже, что он изначально основан на семантике powerpc, с вариантами предварительной выборки Read и Write с использованием dcbt и dcbtst соответственно (оба они передают TH = 0 в новом необязательном коде операции потока).

На платформах ia64 мы читаем:

__lfetch(__lfhint_nt1, pTouch)

где для записи:

__lfetch_excl(__lfhint_nt1, pTouch)

Это (предварительная выборка чтения и записи), по-видимому, достаточно хорошо соответствует семантике powerpc (за исключением того, что ia64 допускает временную подсказку).

Любопытно, что рассматриваемый код ia32 / amd64 использует

prefetchnta

Не

prefetchnt1

как если бы этот код соответствовал реализациям ia64 (варианты #ifdef этого в нашем коде для нашего (все еще работающего) порта hpipf и наших теперь мертвых окон и портов linux ia64).

Поскольку мы строим с помощью компилятора intel, я должен иметь возможность работать на многих наших платформах ia32 / amd64, переключившись на встроенные функции xmmintrin.h:

_mm_prefetch( (char *)pTouch, _MM_HINT_NTA )
_mm_prefetch( (char *)pTouch, _MM_HINT_T1 )

... при условии, что я могу выяснить, какой временный намек следует использовать.

Вопросы:

  • Есть ли инструкции предварительной выборки ia32 / amd64 для чтения и записи? Я не вижу ничего в справочнике по набору команд.

  • Будет ли предпочтительнее один из временных вариантов nt1, nt2, nta для предварительной выборки чтения и записи?

  • Есть идеи, если была бы веская причина использовать временную подсказку NTA на ia32 / amd64, но T1 на ia64?

Ответы [ 2 ]

1 голос
/ 19 октября 2013
  • Существуют ли инструкции чтения и записи предварительной выборки ia32 / amd64?Я не вижу ничего в справочнике по набору команд.

Некоторые системы поддерживают prefetchw инструкции для записи

  • Будет ли предпочтительнее одна из временных вариаций nt1, nt2, nta для чтения или предварительной выборки записи?

Если строка используется исключительно вызывающим потоком, она не должнаНеважно, как вы переносите строку, и чтение, и запись смогут использовать ее.Вышеупомянутая выгода для prefetchw заключается в том, что она принесет линию и даст вам право собственности на нее, что может занять некоторое время, если линия также использовалась другим ядром.Уровень подсказки, с другой стороны, ортогонален состояниям MESI и влияет только на то, как долго выживет предварительно выбранная линия.Это имеет значение, если вы выполняете предварительную выборку задолго до фактического доступа и не хотите, чтобы предварительная выборка терялась в течение этой продолжительности, или, альтернативно, предварительная выборка выполнялась прямо перед доступом, и вы не хотите, чтобы предварительные выборки слишком сильно перебивали ваш кэш.

  • Есть идеи, если бы была веская причина использовать временную подсказку NTA на ia32 / amd64, но T1 на ia64?

Просто размышления - возможно, большие кэши и агрессивная память BW более уязвимы для плохой предварительной выборки, и вы захотите уменьшить влияние с помощью невременного намека.Учтите, что ваш prefetcher внезапно освобождается для извлечения всего, что он может, вы в конечном итоге будете завалены ненужными предварительными выборками, которые бы пропустили множество полезных кешлайнов.Намек NTA заставляет их наводнить друг друга, оставляя неповрежденными.

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

0 голосов
/ 16 сентября 2012

Лучшим ресурсом, который я смог найти по типам подсказок для предварительной выборки x86, была хорошая старая статья Что каждый программист должен знать о памяти .

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

Будет трудно отследить, почему более ранние владельцы кода использовали одну подсказку, а не другую в определенной архитектуре. Они могли бы делать предположения о том, сколько кеша доступно на процессорах в этом семействе, типичных размерах рабочего набора для двоичных файлов, долгосрочных шаблонах потока управления и т. Д., И никто не может сказать, сколько из этих предположений было подтверждено рассуждения или данные. Исходя из ограниченного фона, я думаю, что вы будете правы, выбрав подход, наиболее подходящий для платформы, на которой вы сейчас разрабатываете, независимо от того, что было сделано на других платформах. Это особенно верно, когда вы рассматриваете такие статьи, как и эту , что не является единственным контекстом, в котором я слышал, что действительно, очень сложно добиться какого-либо прироста производительности с помощью программных предварительных выборок.

Есть ли еще какие-либо подробности, известные заранее, например, типичные коэффициенты пропуска кэша при использовании этого кода или ожидаемые предварительные выборки?

...