Я смотрю на некоторый немного запутанный код, который пытается абстрагировать платформу инструкций предварительной выборки, используя различные встроенные компиляторы. Похоже, что он изначально основан на семантике 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?