почему отдельные регистры с плавающей точкой для процессоров Intel x64

799
Bulat M.

Почему xmm0-xmm15в процессорах Intel x64 есть отдельные регистры с плавающей запятой ?

Я знаю xmm, что также используются для векторных операций, где некоторые инструкции (SSE *) выполняются для нескольких чисел в одном регистре. Кроме того, почему бы один использовать xmm0- xmm15регистры вместо единиц общего назначения бараков, RBX, RCX, RDX, РСП, РСП, RDI, риши r8-r15?

2

1 ответ на вопрос

2
NoelC

Некоторые общие тычки в ответ:

  1. Вы указали на это пальцем - в регистрах XMM используются векторные операции, например, SSE в различных версиях, AVX и т. Д. Для выполнения ОЧЕНЬ сложной обработки можно использовать векторные операции. Например, пиксели на изображении обычно содержат несколько связанных цветовых каналов (например, красный, зеленый, синий и альфа). Векторные операции над пикселями могут значительно увеличить производительность. Учитывая, что процессоры сегодня становятся более параллельными, а не получают более высокие тактовые частоты (22-ядерный процессор Xeon, кто-нибудь?), Выполнение операций с большим количеством процессоров над большим количеством данных параллельно - это хорошо. Это облегчает одновременную работу большего количества ядер при заданной ограниченной пропускной способности памяти.

  2. Если у вас нет только крошечных модульных функций (и нам всем иногда приходится сталкиваться с большими, сложными логическими потоками), больше регистров может быть лучше для эффективности. В идеале наиболее интенсивно выполняемые фрагменты кода должны выполняться с минимальным доступом к ОЗУ, поэтому возможность помещать все важные переменные в регистры - это хорошо.

Обратите внимание, что векторные операции не только для плавающей запятой; Есть много целочисленных операций, где инструкции SSE могут быть полезными. Например, можно кодировать высокоэффективные перемещения памяти, выбирая строки кэша, заполненные данными, с помощью 128-битных инструкций с процессорами, созданными за последние 15 лет (т. Е. С поддержкой только SSE2).

И последнее, но не менее важное: процесс ввода данных в регистры XMM и из них может быть сложной задачей. Если вы не спланировали проект системы тщательно, переключение между регистрами «по-старому» без векторов и использованием векторов может быть неэффективным.

Однако, как только вы начинаете задумываться о том, что могут сделать для вас векторные операции, открываются довольно интересные новые горизонты. Представьте, например, объект цикла, который облегчает многократное вложение для циклов, например, с координатами X и Y, содержащимися в одном векторе. Только одна инструкция PADDD (_mm_add_epi32) может увеличивать переменную внешнего цикла И сбрасывать переменную внутреннего цикла, чтобы подготовиться к следующему набору итераций.

Удобная ссылка:

https://software.intel.com/sites/landingpage/IntrinsicsGuide/

Спасибо за подробный ответ, принят, хотя репутации недостаточно, чтобы голосовать. Ссылка тоже очень полезная. Bulat M. 7 лет назад 0