Устройство предварительной выборки DCU не выполняет предварительную выборку строк детерминированным способом.Похоже, что значение доверия связано с каждым потенциальным запросом предварительной выборки.Если достоверность превышает какой-либо порог только тогда, инициируется предварительная выборка.Более того, кажется, что если включены оба средства предварительной выборки L1, только один из них может выдать запрос предварительной выборки в одном и том же цикле.Возможно, предварительная выборка с более высокой достоверностью принята.Ответ ниже не принимает во внимание эти наблюдения.(Необходимо проделать еще много экспериментов. Я переписываю их в будущем.)
Руководство Intel рассказывает нам несколько вещей о предварительном сборщике DCU.Раздел 2.4.5.4 и раздел 2.5.4.2 руководства по оптимизации говорят следующее:
Предварительная выборка блока кэша данных (DCU) - эта предварительная выборка, также известная как потоковая предварительная выборка, запускаетсявосходящий доступ к недавно загруженным данным.Процессор предполагает, что этот доступ является частью алгоритма потоковой передачи, и автоматически выбирает следующую строку.
Обратите внимание, что раздел 2.4.5.4 является частью раздела о Sandy Bridge, а раздел 2.5.4.2 - частьюраздел о Intel Core.Предварительная выборка DCU впервые поддерживалась на микроархитектуре Intel Core, а также на всех последующих микроархитектурах.Насколько я знаю, нет никаких признаков того, что устройство предварительной выборки DCU со временем изменилось.Поэтому я думаю, что он работает одинаково на всех микроархитектурах, вплоть до Skylake, по крайней мере.
Эта цитата на самом деле мало что говорит.Часть «восходящий доступ» предполагает, что предварительный выбор инициируется множественным доступом с увеличением смещений.Часть "недавно загруженные данные" расплывчата.Он может ссылаться на одну или несколько строк, которые непосредственно предшествуют строке, которая должна быть предварительно выбрана в адресном пространстве.Также не ясно, относится ли это к виртуальным или физическим адресам.Часть «извлекает следующую строку» предполагает, что она извлекает только одну строку при каждом запуске, и эта строка является строкой, которая следует за строкой (ами), вызвавшей предварительную выборку.
Я провел несколько экспериментовв Haswell со всеми отключенными устройствами предварительной выборки, кроме программы предварительной настройки DCU.Я также отключил гиперпоточность.Это позволяет мне изучать предварительную выборку DCU изолированно.Результаты показывают следующее:
- Префиксер DCU отслеживает доступы до 4 разных 4 КБ (возможно, физических) страниц.
- Префакер DCU запускается при трех или более доступах одна или несколько строк в одном и том же наборе кэша .Доступ должен быть либо требованием загрузки, либо программной предварительной выборкой (любая инструкция предварительной выборки, включая
prefetchnta
), либо комбинацией обеих.Доступ может быть либо попаданием, либо пропуском в L1D, либо комбинацией обоих.При запуске для 4 отслеживаемых в данный момент страниц будет выполнена предварительная выборка непосредственно следующей строки в пределах каждой соответствующих страниц.Например, рассмотрим следующие три падения нагрузки по требованию: 0xF1000, 0xF2008 и 0xF3004.Предположим, что отслеживаются 4 страницы: 0xF1000, 0xF2000, 0xF3000 и 0xF4000.Затем модуль предварительной выборки DCU выполнит предварительную выборку следующих строк: 0xF1040, 0xF2040, 0xF3040 и 0xF4040. - Префиксер DCU запускается, когда имеется три или более доступа к одной или нескольким строкам в двух последовательных наборах кэша .Как и раньше, доступ должен быть либо по требованию загрузки, либо программных предварительных загрузок.Доступ может быть либо попаданием, либо пропуском в L1DПри запуске для 4 отслеживаемых в данный момент страниц будет выполнена предварительная выборка непосредственно следующей строки в пределах каждой соответствующих страниц относительно набора кеша с обращением, который имеет меньший физический адрес.Например, рассмотрим следующие три пропуска нагрузки по требованию: 0xF1040, 0xF2048 и 0xF3004.Предположим, что отслеживаются 4 страницы: 0xF1000, 0xF2000, 0xF3000 и 0xF4000.Затем модуль предварительной выборки DCU выполнит предварительную выборку следующих строк: 0xF3040 и 0xF4040.Нет необходимости предварительно выбирать 0xF1040 или 0xF2040, потому что для них уже есть запросы.
- Модуль предварительной выборки не будет выполнять предварительную выборку на следующей странице размером 4 КБ.Таким образом, если три обращения к последней строке на странице, средство предварительной выборки не сработает.
- Отслеживаемые страницы выбираются следующим образом.Всякий раз, когда загрузка по требованию или программная предварительная выборка обращается к странице, эта страница будет отслеживаться, и она заменит одну из 4 отслеживаемых страниц.Я не исследовал алгоритм, используемый для определения того, какую из 4 страниц заменить.Это, вероятно, просто.
- Когда новая страница отслеживается из-за доступа типа, упомянутого в предыдущем пункте, требуется как минимум еще два доступа к той же странице и той же строке для запуска предварительной выборки для предварительной выборки следующей строки.В противном случае последующий доступ к следующей строке будет отсутствовать в L1, если линия еще не была там.После этого, в любом случае, устройство предварительной выборки DCU ведет себя так, как описано во втором и третьем пунктах.Например, рассмотрим следующие три пропуска нагрузки по требованию: 0xF1040, 0xF2048 и 0xF3004.Существует два доступа к одной и той же строке, а третий - к одному и тому же набору кэша, но с другой строкой.Эти обращения заставят устройство предварительной выборки DCU отслеживать две страницы, но пока не будут вызывать его.Когда средство предварительной выборки видит еще три обращения к любой строке в том же наборе кэша, оно будет предварительно выбирать следующую строку для тех страниц, которые отслеживаются в данный момент.В качестве другого примера рассмотрим следующие три падения нагрузки по требованию: 0xF1040, 0xF2048 и 0xF3030.Все эти обращения находятся на одной и той же строке, поэтому они не только заставляют средство предварительной выборки отслеживать страницу, но также инициируют предварительную выборку следующей строки для этой страницы и любых других страниц, которые уже отслеживаются.
- Мне кажется, чтосредство предварительной выборки получает флаг «грязный» из записи таблицы страниц на странице, к которой осуществляется доступ (из TLB).Флаг указывает, является ли страница грязной или нет.Если он загрязнен, средство предварительной выборки не будет отслеживать страницу, и доступ к странице не будет засчитан в три доступа для выполнения условия запуска.Таким образом, кажется, что prefetcher DCU просто игнорирует грязные страницы.Тем не менее, страница не должна быть доступна только для чтения, хотя и должна поддерживаться программой предварительной выборки.Однако для более точного понимания того, как хранилища могут взаимодействовать с устройством предварительной выборки DCU, требуется более тщательное исследование.
Таким образом, доступы, которые запускают устройство предварительной выборки, не должны быть «восходящими» или следовать какому-либо порядку.Само смещение строки кэша, похоже, игнорируется средством предварительной выборки.Имеет значение только номер физической страницы.
Я думаю, что модуль предварительной выборки DCU имеет полностью ассоциативный буфер, который содержит 4 записи.Каждая запись помечена (возможно, физическим) номером страницы и имеет действительный бит, чтобы указать, содержит ли запись действительный номер страницы.Кроме того, каждый набор кеш-памяти L1D связан с 2-битным счетчиком насыщения, который увеличивается всякий раз, когда нагрузка по требованию или программный запрос на предварительную выборку обращаются к соответствующему набору кеш-памяти, и флаг сброса доступной страницы не устанавливается.Когда счетчик достигает значения 3, срабатывает предварительный выборщик.У предварительной выборки уже есть номера физических страниц, с которых он должен выполнить предварительную выборку;он может получить их из записи буфера, соответствующей счетчику.Таким образом, он может немедленно выдавать запросы на предварительную выборку для следующих строк кэша для каждой из страниц, отслеживаемых буфером.Однако, если буфер заполнения недоступен для инициируемого запроса предварительной выборки, предварительная выборка будет отброшена.Тогда счетчик будет сброшен на ноль.Таблицы страниц могут быть изменены, хотя.Возможно, что средство предварительной выборки сбрасывает свой буфер всякий раз, когда очищается TLB.
Может быть так, что есть две программы предварительной выборки DCU, по одному для каждого логического ядра.Когда гиперпоточность отключена, один из предварительных сборщиков также будет отключен.Это также может быть случай, когда 4 записи буфера, которые содержат номера страниц, статически разделены между двумя логическими ядрами и объединены, когда гиперпоточность отключена.Я не знаю точно, но такой дизайн имеет смысл для меня.Другим возможным вариантом будет то, что каждый предварительный выборщик имеет выделенный буфер на 4 записи.Нетрудно определить, как работает предварительный сборщик DCU, когда включена поддержка гиперпоточности.Я просто не потратил усилий на его изучение.
В целом, pefetcher DCU на сегодняшний день является самым простым из 4 предварительных сборщиков данных, доступных в современных высокопроизводительных процессорах Intel.Кажется, что он эффективен только при последовательном, но медленном доступе к небольшим фрагментам данных только для чтения (таких как файлы только для чтения и статически инициализированные глобальные массивы) или одновременному доступу к нескольким объектам только для чтения, которые могут содержать множество небольших полейи охватывают несколько последовательных строк кэша на одной и той же странице.
В разделе 2.4.5.4 также представлена дополнительная информация о предварительной выборке L1D в целом, поэтому она применяется к средству предварительной выборки DCU.
Данныепредварительная выборка запускается операциями загрузки, когда выполняются следующие условия:
- Загрузка выполняется из типа памяти с обратной записью.
Это означает, что предварительная выборка DCU не будет отслеживатьсядоступ к типам кэш-памяти WP и WT.
- Предварительно выбранные данные находятся на той же 4-байтовой странице, что и инструкция загрузки, которая их вызывала.
Это было проверено экспериментально.
- В трубопроводе нет ограждений.
Я не знаю, что это значит.См .: https://software.intel.com/en-us/forums/software-tuning-performance-optimization-platform-monitoring/topic/805373.
- Выполняется не так много других пропусков загрузки.
Существует только 10 буферов заполнения, которые могут содержать пропущенные запросыL1D.В связи с этим возникает вопрос: если бы существовал только один доступный буфер заполнения, будет ли аппаратный предварительный сборщик использовать его или оставить его для ожидаемого доступа по требованию?Я не знаю.
- Нет непрерывного потока магазинов.
Это говорит о том, что если есть поток большогоКоличество магазинов переплетается с небольшим количеством загрузок, устройство предварительной выборки L1 игнорирует нагрузки и в основном временно отключается, пока магазины не станут меньшинством.Однако мои экспериментальные результаты показывают, что даже одно хранилище на странице отключит предварительную выборку для этой страницы.
Все микроархитектуры Intel Atom имеют предварительную выборку DCU.Хотя средство предварительной выборки может отслеживать менее 4 страниц в этих микроархитектурах.
На всех микроархитектурах Xeon Phi, включая Knights Landing, включая предварительную выборку DCU, нет.Я не знаю о более поздних микроархитектурах Xeon Phi.