Ускорить сборку x64 ADD loop

я работаю над арифметикой для умножения очень длинных целых чисел (около 100 000 десятичных цифр). Как часть моей библиотеки я добавляю два длинных номера.

Профилирование показывает, что мой код выполняет до 25%время в подпрограммах add () и sub (), так чтоВажно, чтобы они были максимально быстрыми. Но я непока не вижу большого потенциала. Может быть, вы можете дать мне некоторую помощь, совет, понимание или идеи. Я'Я проверю их и вернусь к вам.

Пока что моя подпрограмма add выполняет некоторые настройки, а затем использует 8-кратный развернутый цикл:

mov rax, QWORD PTR [rdx+r11*8-64]
mov r10, QWORD PTR [r8+r11*8-64]
adc rax, r10
mov QWORD PTR [rcx+r11*8-64], rax

Далее следуют еще 7 блоков с разными смещениями, а затем цикл.

Я пытался загрузить значения из памяти ранее, но это неТ помочь. Я думаю, это из-за хорошей предварительной выборки. Я использую 4-ядерный процессор Intel i7-3770 Ivy Bridge. Но я'Я хотел бы написать код, который хорошо работает на любом современном процессоре.

редактировать: Я сделал несколько таймингов: он добавляет 1 тыс. Слов в 2,25 циклах / слово. Если я удалю АЦП, так что останутся только MOV, это все равно займет около 1,95 циклов / слово. Таким образом, основным узким местом является доступ к памяти. Библиотекаmemcpy() работает около 0,65 циклов / слово, но имеет только один вход, а не два. Тем не менее, этоЯ полагаю, намного быстрее из-за использования регистров SSE.

Некоторые вопросы:

Это полезно использовать?загрузить, загрузить, добавить, хранить структура или будет "загрузить, добавить в память " Помогите? Пока мои тесты не прошлине показать никаких преимуществ.Как обычно, от SSE (2,3,4) помощи не ожидается?Сильно ли влияет адресация (масштабированный индекс плюс база плюс смещение)? Я мог бы использоватьADD r11, 8 вместо.А как насчет разворачивания цикла? Я читал, что развертывание было плохо для архитектуры Sandy Bridge (Agner Foghttp://www.agner.org/optimize/). Это нужно предпочитать или избегать?(Редактировать) Могу ли я использовать регистры SSE для загрузки и хранения слов в больших блоках из памяти и эффективного обмена словами с регистрами общего назначения и регистрами SSE?

Я высоко ценю любые комментарии.

Ответы на вопрос(3)

Ваш ответ на вопрос