На PowerPC (PS3) передача между векторными регистрами и регистрами с плавающей запятой также проходила через память, что могло привести к дорогостоящим промахам кеша и, следовательно, требовало минимизации ненужных преобразований.
Верно ли это для других современных архитектур? Мне особенно любопытны мобильные устройства, где, как я понимаю, задержка памяти, безусловно, является ограничивающим фактором.
ПРИМЕЧАНИЕ. Это для низкоуровневой трехмерной математической библиотеки, использующей встроенные функции SSE (и, возможно, другие), и я пытаюсь оптимизировать задержку памяти.
@PeterCordes, long double использует x87 для многих компиляторов и для фракталов. Я могу увеличивать масштаб до 10 ^ -4000 и ниже, используя долгое удвоение и возмущение. Двойное удвоение было бы бесполезным, потому что оно не улучшает прецессию экспоненты, и любая программная реализация, улучшающая точность показателя (например, четырехкратная прецессия), не может конкурировать с длинным двойным на x87.
@Zboson: Да, я слишком упростил, исключив long double, который по-прежнему использует x87 в x86-64 System V ABI. (Я думаю, что Windows x86-64 использует 64-битный long double с SSE2, то есть такой же, как double.) Но вы не можете работать с 80-битными числами с плавающей запятой, используя SSE2 или любой другой x86 SIMD, поэтому варианты использования для x87 <- > XMM ограничены в основном 32-битным кодом с устаревшими соглашениями о вызовах, где значения FP возвращаются в регистрах x87. Если вам нужна точность long double, вам следует избегать преобразования fst qword [rsp] в double.
Связанный: Внутренние функции Intel не обеспечивают хороший способ превратить скаляры в векторы, не заставляя компиляторы тратить впустую инструкции, расширяя их нулем.. clang может оптимизировать это, однако, если верхние элементы фактически не используются.
Похоже, что для x86 это была бы дешевая инструкция, не требующая обращения к памяти. А как насчет ARM?
ARM и AARch64 также используют одни и те же регистры для скалярных FP и NEON SIMD. Вы забыли отправить мне эхо-запрос @PeterCordes, поэтому я случайно увидел ваш ответ, когда искал что-то еще.
@PeterCordes Если вы хотите обобщить свои комментарии в ответ, я думаю, что вся информация, которую я получил, уже покрыта.


На x86 скалярные операции FP выполняются в регистрах одно и тоже XMM как векторные операции FP. Устаревшие регистры / инструкции x87 не используются в современном коде. Сравните github.com/HJLebbink/asm-dude/wiki/ADDSS (скалярный одиночный) с github.com/HJLebbink/asm-dude/wiki/ADDPS (упакованный одиночный). См. Также agner.org/optimize