Множественные обращения к основной памяти и выполнение вне очереди

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

int load_and_add(int *pA, int *pB)
{
    int a = *pA;   // will most likely miss in cache
    int b = *pB;   // will most likely miss in cache 

    // ...  some code that does not use a or b

    int c = a + b;
    return c;
}

Если выполнение вне очереди позволяет выполнить код до вычисления значения c, как будет происходить выборка значений a и b на современном процессоре Intel?

Полностью ли сериализован потенциально конвейерный доступ к памяти или может быть какое-то перекрытие выборки, выполняемое контроллером памяти ЦП?

Другими словами, если предположить, что обращение к основной памяти стоит 300 циклов. Будет ли выборка a и b стоить 600 циклов или выполнение вне очереди допускает некоторое возможное перекрытие и, возможно, будет стоить меньше циклов?


person BlueStrat    schedule 02.05.2016    source источник
comment
отредактирован, чтобы использовать правильную терминологию. Например. Hit обычно используется для описания попадания в кеш, поэтому попадание в основную память не так легко анализируется при просмотре. Последовательный обычно используется, когда адреса памяти являются последовательными. Вопрос в том, обрабатываются ли они параллельно (конвейерно) или нет.   -  person Peter Cordes    schedule 02.05.2016
comment
Спасибо @PeterCordes, отличная переработка. Я действительно изо всех сил пытался написать вопрос, но, действительно, суть в том, что я пытался понять, обрабатывались ли чтения из памяти параллельно.   -  person BlueStrat    schedule 02.05.2016
comment
Не беспокойтесь, часто бывает сложно задать вопрос правильно, если вы еще не знаете достаточно, чтобы искать и находить ответ самостоятельно: P   -  person Peter Cordes    schedule 02.05.2016


Ответы (1)


Современные процессоры имеют несколько буферов нагрузки, поэтому одновременно может выполняться несколько нагрузок. Подсистема памяти сильно конвейерна, что дает многим ее частям гораздо лучшую пропускную способность, чем задержку. (например, с предварительной выборкой Haswell может поддерживать (из основной памяти) 8-битную загрузку каждые 1 такт. Но задержка, если адрес не известен заранее, составляет сотни циклов).

Так что да, ядро ​​Haswell может отслеживать до 72 выдающихся мопов нагрузки, ожидающих данных из кеша / памяти. (Это для каждого ядра. Общий кэш L3 также нуждается в некоторых буферах для обработки загрузки / сохранения всей системы в DRAM и ввод-вывод с отображением в память.)

Размер буфера Haswell ReOrder составляет 192 мопса, поэтому до 190 мопов работы в code that does not use a or b может быть запущен и выполнен, в то время как загрузки a и b являются самыми старыми инструкциями, которые еще не списаны. Инструкции / меры отменены, чтобы поддерживать точные исключения. Размер ROB - это, по сути, предел окна не по порядку, позволяющий скрыть задержку медленных операций, таких как промахи кеша.

Также просмотрите другие ссылки на вики-странице по тегам x86, чтобы узнать как работают процессоры. Руководство по микроархитектуре Agner Fog отлично подходит для создания ментальной модели конвейера ЦП, позволяющей приблизительно понять, как будет выполняться код.

Из статьи Дэвида Кантера о Haswell:  Intel Haswell, из статьи Дэвида Кантера

person Peter Cordes    schedule 02.05.2016
comment
Возможно, стоит отметить, что промах при промахе (т. Е. Запуск второго кэша с отсутствующим доступом к памяти после промаха кэша) не требует выполнения вне очереди; для этого требуется только табло, чтобы отслеживать, что загруженные значения еще не присутствуют (но выполнение остановится, когда значения должны быть использованы). При наличии только табло промах TLB при втором доступе предотвратит параллелизм памяти, поскольку точное исключение не может быть гарантировано. (История или будущий файл, все еще выпускаемый по порядку, позволил бы такое предположение.) - person Paul A. Clayton; 03.05.2016