Предварительная выборка для Intel Core 2 Duo

У кого-нибудь есть опыт использования инструкций предварительной выборки для процессора Core 2 Duo?

Я успешно использовал набор стандартной выборки (prefetchnta, prefetcht1 и т.д.) для серии P4-машин, но при запуске кода на Core 2 Duo кажется, что prefetcht(i) ничего не делают и что команда prefetchnta менее эффективна.

Мои критерии оценки производительности - это временные результаты для векторной векторной операции BLAS 1 (axpy), когда размер вектора достаточно велик для поведения вне кэша.

Установили ли Intel новые инструкции по предварительной выборке?

Ответ 1

Из справочного документа Intel в архитектуре Intel 64 и IA-32, посмотрите страницы 163 и 77:

Процессоры Pentium 4 и Intel Xeon на базе Intel NetBurst микроархитектура предварительная выборка в дополнение к программному обеспечению упреждающая выборка. Предварительная подготовка оборудования работает прозрачно, чтобы получать данные и потоки команд из памяти без необходимости программирования вмешательство. последующее микроархитектуры продолжают улучшаться и добавить функции к оборудованию механизмы предварительной выборки. Ранее реализации аппаратных средств механизмы предварительной выборки сосредоточены на предварительная выборка данных и инструкций из память до L2; более свежий реализации функции для предварительной выборки данных из L2 в L1. В Intel NetBurst микроархитектура, аппаратное обеспечение prefetcher может отслеживать 8 независимых потоков.

Процессор Pentium M также обеспечивает аппаратный предварительный выборщик для данных. Оно может отслеживать 12 отдельных потоков в вперед и 4 потока в назад. Процессоры Инструкция PREFETCHNTA также выбирает 64-байты в данные первого уровня кеш без загрязнения кеш второго уровня.

Intel Core Solo и Intel Core Duo процессоры обеспечивают более продвинутые аппаратные предварительные данные для данных, чем Процессоры Pentium M. Основные отличия приведены в таблице 2-10.

Ответ 2

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

Здесь задан вопрос о том, как определить размер строки кэша предварительной выборки.

Ответ 3

Я пробовал это однажды на жестком цикле, я пытался оптимизировать загрузку 4-х парных и делал около 15 операций с плавающей запятой для каждого цикла. Я обнаружил, что, чтобы положительно повлиять на ядро ​​2-го дуэта, предварительная выборка должна была быть установлена ​​по крайней мере на 16 петель впереди в коде, где для более старых процессоров 4 петли впереди было достаточно.