Есть ли процессор, выполняющий спекулятивные операции, которые виртуализируют области памяти? - PullRequest
2 голосов
/ 09 ноября 2019

Рассмотрим классическое повторное использование регистра после дорогостоящего вычисления в псевдосборке:

r2 = cos(r1)
*(r3) = r2
r2 = r5 + r6
*(r4) = r2

Чтобы иметь возможность полностью использовать арифметические единицы, исполнительная единица может выполнить:

r2 = cos(r1)
*(r3) = r2

и параллельно:

r2bis = r5 + r6
*(r4) = r2bis

, где r2bis - это виртуализированный (или переименованный) регистр r2.

Теперь представьте, что мы работаем в регистре с плохим ЦП (или у нас их много, но они уже используются) и помещаем данные в какое-то временное место в стеке:

*(sp+C) = cos(r1)
*(r3) = *(sp+C)
*(sp+C) = r5 + r6
*(r4) = *(sp+C)

Есть ли случаи, когдаячейка памяти, адрес которой известен (как (sp + C) уже может быть вычислен) виртуализируется исполнительным блоком, чтобы позволить двум и тем же процессам выполняться параллельно?

Этот случай может показаться очень глупым, поскольку компиляторможно было бы найти другое место в не очень ограниченном пространстве стека (в отличие от очень ограниченного пространства регистров). Но другие случаи могут быть не такими глупыми, поскольку виртуализированная память может позволить спекулятивному исполнителю ветки условия, которая должна хранить краткосрочные данные в памяти. Это особенно важно для языков, где нет простого способа поместить поля объектов в регистры, как Java для всех, кроме самых простых случаев: вы должны исключить "ссылочный" (указатель) escape, чтобы избежать динамического выделения new ипревратить экземпляр класса Java в автоматический экземпляр класса C ++ (который может быть размещен в стеке или в регистрах). (И тогда даже в C ++ возникают трудности с отсутствием действительного указателя this при явно простом использовании простых плоских классов.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...