Какова стоимость перемещения данных между регистрами VPU и FPU?

На PowerPC (PS3) передача между векторными регистрами и регистрами с плавающей запятой также проходила через память, что могло привести к дорогостоящим промахам кеша и, следовательно, требовало минимизации ненужных преобразований.

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

ПРИМЕЧАНИЕ. Это для низкоуровневой трехмерной математической библиотеки, использующей встроенные функции SSE (и, возможно, другие), и я пытаюсь оптимизировать задержку памяти.

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

Peter Cordes 16.03.2018 09:38

@PeterCordes, long double использует x87 для многих компиляторов и для фракталов. Я могу увеличивать масштаб до 10 ^ -4000 и ниже, используя долгое удвоение и возмущение. Двойное удвоение было бы бесполезным, потому что оно не улучшает прецессию экспоненты, и любая программная реализация, улучшающая точность показателя (например, четырехкратная прецессия), не может конкурировать с длинным двойным на x87.

Z boson 16.03.2018 11:31

@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.

Peter Cordes 17.03.2018 01:24

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

Peter Cordes 17.03.2018 01:27

Похоже, что для x86 это была бы дешевая инструкция, не требующая обращения к памяти. А как насчет ARM?

johnb003 26.03.2018 19:06

ARM и AARch64 также используют одни и те же регистры для скалярных FP и NEON SIMD. Вы забыли отправить мне эхо-запрос @PeterCordes, поэтому я случайно увидел ваш ответ, когда искал что-то еще.

Peter Cordes 26.04.2018 03:11

@PeterCordes Если вы хотите обобщить свои комментарии в ответ, я думаю, что вся информация, которую я получил, уже покрыта.

johnb003 21.06.2018 07:49
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
TL;DR: Angular Signals может облегчить отслеживание всех выражений в представлении (Component или EmbeddedView) и планирование пользовательских...
Sniper-CSS, избегайте неиспользуемых стилей
Sniper-CSS, избегайте неиспользуемых стилей
Это краткое руководство, в котором я хочу поделиться тем, как я перешел от 212 кБ CSS к 32,1 кБ (сокращение кода на 84,91%), по-прежнему используя...
1
7
50
0

Другие вопросы по теме