Некоторые общие тычки в ответ:
Вы указали на это пальцем - в регистрах XMM используются векторные операции, например, SSE в различных версиях, AVX и т. Д. Для выполнения ОЧЕНЬ сложной обработки можно использовать векторные операции. Например, пиксели на изображении обычно содержат несколько связанных цветовых каналов (например, красный, зеленый, синий и альфа). Векторные операции над пикселями могут значительно увеличить производительность. Учитывая, что процессоры сегодня становятся более параллельными, а не получают более высокие тактовые частоты (22-ядерный процессор Xeon, кто-нибудь?), Выполнение операций с большим количеством процессоров над большим количеством данных параллельно - это хорошо. Это облегчает одновременную работу большего количества ядер при заданной ограниченной пропускной способности памяти.
Если у вас нет только крошечных модульных функций (и нам всем иногда приходится сталкиваться с большими, сложными логическими потоками), больше регистров может быть лучше для эффективности. В идеале наиболее интенсивно выполняемые фрагменты кода должны выполняться с минимальным доступом к ОЗУ, поэтому возможность помещать все важные переменные в регистры - это хорошо.
Обратите внимание, что векторные операции не только для плавающей запятой; Есть много целочисленных операций, где инструкции SSE могут быть полезными. Например, можно кодировать высокоэффективные перемещения памяти, выбирая строки кэша, заполненные данными, с помощью 128-битных инструкций с процессорами, созданными за последние 15 лет (т. Е. С поддержкой только SSE2).
И последнее, но не менее важное: процесс ввода данных в регистры XMM и из них может быть сложной задачей. Если вы не спланировали проект системы тщательно, переключение между регистрами «по-старому» без векторов и использованием векторов может быть неэффективным.
Однако, как только вы начинаете задумываться о том, что могут сделать для вас векторные операции, открываются довольно интересные новые горизонты. Представьте, например, объект цикла, который облегчает многократное вложение для циклов, например, с координатами X и Y, содержащимися в одном векторе. Только одна инструкция PADDD (_mm_add_epi32) может увеличивать переменную внешнего цикла И сбрасывать переменную внутреннего цикла, чтобы подготовиться к следующему набору итераций.
Удобная ссылка:
https://software.intel.com/sites/landingpage/IntrinsicsGuide/