2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение11.10.2017, 02:27 
Заслуженный участник


20/08/14
4699
Россия, Москва

(ARM+NEON)

bondkim137 в сообщении #1254646 писал(а):
А на ARM с последними NEON-командами можно то же самое эффективно сделать?
Вот не знаю, я последней архитектурой интересовался лишь ARMv4T (ARM7TDMI), в ней NEON ещё нету. Условные операции очень впечатлили, как и возможность сдвига операнда, иногда (но очень иногда) это существенно ускоряет вычисления. По грубой прикидке, если NEON оперирует 128 битами, да ещё и обычно на частотах порядка 1ГГц, это минимум в 7 раз медленнее (на ядро), интереса не представляет. Это при условии наличия не менее удобных команд.
Но в общем да, в NEON должны быть похожие команды и методы ускорения.

 Профиль  
                  
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение11.10.2017, 02:45 
Аватара пользователя


07/02/12
1169
Питер

(ARM+NEON)

Dmitriy40 в сообщении #1254678 писал(а):
если NEON оперирует 128 битами, да ещё и обычно на частотах порядка 1ГГц, это минимум в 7 раз медленнее (на ядро)

До ~2-2.5ГГц, ~4 ядра, ну и речь не в том, что на мобильных процессорах быстрее считать - речь о том, что бы впринципе считать на мобильниках достаточно быстро. Ибо это сильно кореллирует с монетизацией (и не только) при решении некоторых прикладных задач :)

 Профиль  
                  
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение12.08.2018, 00:55 
Заслуженный участник


20/08/14
4699
Россия, Москва
В одной из тем основным тормозом перебора была проверка чисел на простоту, тогда ещё посокрушались что переписывать на AVX нет смысла из-за отсутствия как команд целочисленного деления, так и даже умножения 64-битных целых чисел. Тогда же было высказано предложение использовать модулярную арифметику в умножении вместо деления. И вот наконец дошли руки до этого предложения и таки написал и умножение 64х64 на AVX2, и его использование для определения делимости 64 бит числа на 4 других 64 бит нечётных числа. Может кому пригодится. Архитектура Haswell.
код: [ скачать ] [ спрятать ]
Используется синтаксис ASM
;Инициализация
                vmovq           xmm0,RCX        ;Проверяемое число, единственное место где влияет разрядность x32/x64
                vpbroadcastq    ymm0,xmm0
                vpsrlq          ymm1,ymm0,32    ;Выдедение старших 32 бит отдельно, младщие выделять не нужно, vpmuludq игнорирует биты 63..32
                vmovdqu         ymm2,[mem]      ;Чтение констант делителей обратных по модулю
                vpsrlq          ymm3,ymm2,32    ;Выдедение старших 32 бит отдельно, младщие выделять не нужно, vpmuludq игнорирует биты 63..32
                vpmovdqu        ymm4,[mem]      ;Загрузка констант частных (2^64-1)/делитель с инвертированным битом знака
                vpmovdqu        ymm5,[mem]      ;Загрузка 4-х констант 0x8000000000000000
                vpmovdqu        ymm6,[mem]      ;Загрузка 2-х констант 0x0B0A0908808080800302010080808080
;Регистры y6..y2 в коде ниже могут быть без уменьшения скорости заменены на чтение из памяти
;Сама проверка делимости                   ;Порт       Латентность/В_потоке
                vpmuludq        ymm3,ymm0,ymm3  ;0      5/1
                vpmuludq        ymm7,ymm1,ymm2  ;0      5/1
                vpmuludq        ymm2,ymm0,ymm2  ;0      5/1
                vpaddq          ymm3,ymm3,ymm7  ;15     1/0.5
                vpshufb         ymm3,ymm3,ymm6  ;5      1/1     сдвиг младшего 32 бит слова в старшее с обнулением младшего
                vpaddq          ymm2,ymm2,ymm3  ;15     1/0.5   y2 - младшие 64 бита произведения
                vpxor           ymm2,ymm2,ymm5  ;015    1/0.33  инверсия знакового бита
                vpcmpgtq        ymm2,ymm2,ymm4  ;0      5/1     сравнение с частным (2^64-1)/делитель
                vpmovmskb       EAX,ymm2        ;0      3/1     нулевые биты означают что что-то разделилось
                cmp             EAX,-1          ;0156   1/0.25
;ZF=0 если разделилось на любое из 4-х чисел
Итого: в потоке скорость 5 тактов на 4 делителя или 1.25 тактов на делитель (что подтверждает Intel® Architecture Code Analyzer), реальное измерение даёт 1.33 такта.
Один такт на число получить не удалось, но развернув цикл можно приблизиться к этому, например 4-х кратный разворот уменьшает до 1.12 такта (теоретически 1.06). При этом весь внутренний цикл обработки 16 делителей занимает всего 58 микроопераций и укладывается даже в очередь декодированых, т.е. Front-end тормозом не является.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу Пред.  1, 2

Модераторы: Karan, PAV, Toucan, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group