Отправка мопов из внешнего интерфейса в соответствующий порт выполнения - PullRequest
1 голос
/ 14 февраля 2020

Я пытаюсь понять поток выполнения мопов после того, как они покидают Front-End и до того, как они отправляются в соответствующий порт выполнения.

В настоящее время у меня есть следующая ментальная модель этого:

Front-End (Fetch, Decode, Micro/Macro-Fuse)
   |
   |
Renamer (Detects dependency chains,
   |      Eliminate RAR, WAW hazards, 
   |      Allocates resources like SB or LB,
   |      Binds the uop to some execution port)
   |
   |
   |______ROB (Holds uop until it is fully completed)
   |
   |
   |
  RS aka Scheduler (Wait until all source operands are ready)
   |
 Execution ports

То, что я не понимаю, это то, как Intel Optimization Manual/2.5.3.1 описывает это:

Renamer - это мост между упорядоченной частью на рисунке 2-10, и мир потока данных Планировщика . Он перемещается до четырех микроопераций в каждом цикле от очереди микроопераций до вышедшего из строя механизма. Хотя переименователь может отправлять до 4 микроопераций (без слияния, с микроплавлением или с микроплавлением) за цикл, это эквивалентно тому, что порт выдачи может отправлять шесть микроопераций за цикл. В этом процессе ядро ​​ , вышедшее из строя, выполняет следующие шаги :

  • Переименовывает архитектурные источники и места назначения микро- ops к микро-архитектурным источникам и местам назначения.

  • Распределяет ресурсы для микроопераций. Например, загрузите или сохраните буферы.

  • Привязывает микрооперацию к соответствующему порту .

Но Scheduler (он же RS) описывается следующим образом: 2.5.3.2:

Планировщик управляет отправкой микроопераций на их порты исполнения. Для этого он должен определить, какие микрооперации готовы и откуда берутся их источники: запись файла реестра или обход непосредственно из исполнительного устройства. В зависимости от доступности портов отправки и шин обратной записи, а также приоритета готовых микроопераций, планировщик выбирает, какие микрооперации отправляются в каждом цикле.

ВОПРОС: Есть порт для отправки uop в выбранный Renamer, но диспетчеризация в порт, выбранный Renamer, выполняется RS (иначе, планировщик), как только все операнды готовы?

Я измерил порт Распределение для подпрограммы копирования памяти основано на vmovdqu и получило почти равномерное распределение:

13 493 383 038      uops_dispatched_port.port_2
13 494 860 751      uops_dispatched_port.port_3

Это не ясно, как это достигается просто с помощью Renamer. Он не знает, когда все операнды для UOP будут готовы, поэтому трудно выбрать, в какой порт отправлять UOP для достижения равномерного распределения UOP.

...