Предварительная выборка программного обеспечения через границу страницы на x86
Насколько я понимаю, аппаратная предварительная выборка никогда не пересекает границы страницы. Мне интересно, имеет ли программная предварительная выборка такое же ограничение, т.е. могу ли я использовать программную предварительную выборку, чтобы избежать будущей ошибки TLB. От поиска вокруг, это кажется возможным, но я не мог найти ничего определенного в документации, поэтому ссылка была бы хорошей.
Я особенно интересуюсь Nehalem, Sandy Bridge и Westmere.
2 ответа
Согласно справочному руководству Intel по оптимизации, оно зависит от процессора. Из раздела 7.4.3:
Есть случаи, когда PREFETCH не будет выполнять предварительную выборку данных. Они включают:
- PREFETCH вызывает промах DTLB (Lookaside Buffer для трансляции данных). Это относится к процессорам Pentium 4 с сигнатурой CPUID, соответствующей семейству 15, модели 0, 1 или 2. PREFETCH разрешает пропуски DTLB и извлекает данные на процессорах Pentium 4 с сигнатурой CPUID, соответствующей семейству 15, модели 3.
- Доступ к указанному адресу, который вызывает ошибку / исключение.
Предварительная выборка программного обеспечения может или не может избежать пропусков TLB, в зависимости от процессора. Он не будет извлекать данные, если это приведет к ошибке страницы.
Если вы хотите избежать ошибок TLB, вы можете выполнить фиктивное чтение для загрузки данных вместо инструкции предварительной выборки. Это может привести к обмену ошибкой на странице, что может быть как хорошим, так и плохим, в зависимости от вашего варианта использования.
В современных процессорах (Nehalem, Sandy Bridge и Westmere) предварительная выборка программного обеспечения действительно запускает поиск TLB.
Из руководства по оптимизации Intel: (раздел 7.3.3)
В более старых микроархитектурах PREFETCH, вызывающий промах Data Transfer Lookaside Buffer (DTLB), будет отброшен. В процессорах, основанных на Nehalem, Westmere, Sandy Bridge и более новых микроархитектурах, процессорах Intel Core 2 и процессорах Intel Atom, PREFETCH, вызывающий пропадание DTLB, может быть получен через границы страницы.