Przyspiesz pętlę ADD asemblera x64

Pracuję nad arytmetyką mnożenia bardzo długich liczb całkowitych (około 100 000 cyfr dziesiętnych). Jako część mojej biblioteki I, aby dodać dwie długie liczby.

Profilowanie pokazuje, że mój kod działa do 25% czasu w procedurach add () i sub (), więc ważne jest, aby były one tak szybkie, jak to możliwe. Ale nie widzę jeszcze dużego potencjału. Może możesz mi pomóc, doradzić, uzyskać wgląd lub pomysły. Przetestuję je i wrócę do ciebie.

Jak dotąd moja procedura dodawania wykonuje pewne ustawienia, a następnie używa 8-krotnie rozwiniętej pętli:

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

Następuje 7 kolejnych bloków z różnymi przesunięciami, a następnie pętla.

Próbowałem wczytać wartości z pamięci wcześniej, ale to nie pomogło. Myślę, że to z powodu dobrego wstępnego pobierania. Używam 4-rdzeniowego procesora Intel i7-3770 Ivy Bridge. Ale chciałbym napisać kod, który działa dobrze na każdym nowoczesnym CPU.

Edytować: Zrobiłem kilka czasów: dodaje 1k słów w około 2,25 cyklu / słowo. Jeśli usunę ADC, więc pozostaną tylko MOV, to nadal trwa około 1,95 cykli / słowo. Głównym wąskim gardłem wydaje się być dostęp do pamięci. Bibliotekamemcpy() działa w około 0,65 cykli / słowo, ale ma tylko jedno wejście, a nie dwa. Mimo to jest znacznie szybszy z powodu użycia rejestrów SSE.

Kilka pytań:

Czy warto używać struktury „ładuj, ładuj, dodawaj, przechowuj”, czy może „ładuj, dodawaj do pamięci”? Jak dotąd moje testy nie wykazały żadnych korzyści.Jak zwykle nie oczekuje się pomocy z SSE (2,3,4)?Czy adresowanie (skalowany indeks plus podstawa i przesunięcie) ma zły wpływ? mógłbym użyćADD r11, 8 zamiast.Co z rozwijaniem pętli? Czytałem, że rozwijanie było złe dla architektury Sandy Bridge (Agner Foghttp://www.agner.org/optimize/). Czy to jest preferowane, czy unikane?(Edytować) Czy mogę używać rejestrów SSE do ładowania i przechowywania słów w większych fragmentach z pamięci i wydajnej wymiany słów z rejestrami ogólnego przeznaczenia i rejestrami SSE?

Bardzo dziękuję za wszelkie komentarze.

questionAnswers(3)

yourAnswerToTheQuestion