Jak pomnożyć dwa 64-bitowe liczby całkowite przez kolejne 2 64-bitowe liczby całkowite? Nie znalazłem instrukcji, które mogą to zrobić.SSE mnożenie z 2 64-bitowych liczb całkowitych
Odpowiedz
Trzeba by zaimplementować własną 64 bitową procedurę mnożenia za pomocą 32-bitowych operacji mnożyć. Prawdopodobnie nie będzie to bardziej efektywne niż wykonanie tego za pomocą kodu skalarnego, szczególnie, że będzie dużo tasowania wektorów, aby uzyskać wszystkie wymagane operacje.
Z góry mojej głowy, nie było "pmuldqq" lub coś w SSE4 dodane? – hirschhornsalz
Istnieje 'pmuldq' w SSE4 który jest 32x32 => 64 bit mnożyć, więc można używać, jako blok konstrukcyjny dla kawałka 64x64 mnożyć. –
Czy znasz najlepszy algorytm skalarny (zakładając, że masz tylko sprzęt 32-bitowy)? Oto co bym zrobił. Chciałbym podzielić każdą liczbę na jej górną i dolną 32-bitową część, a następnie zrobić (a * b) = (al + ah) * (bl * bh) = t1 + t2 + t3 + t4, gdzie t1 = al * bl, t2 = al * bh, t3 = ah * bl t4 = ah * bh. Każdy termin będzie liczbą 64-bitową. Następnie t2 i t3 będzie musiał być podzielona na niskim i wysokim i ostateczna liczba to (a * b) L = T1 + T2L + t3l (a * b) h = t4 + T2H + T3H + c, gdzie c to dowolne przeniesienie z (a * b) l. To 4 mnożniki i 7 dodatków. Czy to gdzieś na SO? –
wiem, że to jest stare pytanie, ale ja rzeczywiście szukają dokładnie tego. Ponieważ wciąż nie ma instrukcji do tego, zaimplementowałem 64-bitowe mnożenie się z pmuldq jak wspomniał Paul R. To właśnie wymyśliłem:
__m128i Multiply64Bit(__m128i a, __m128i b)
{
auto ax0_ax1_ay0_ay1 = a;
auto bx0_bx1_by0_by1 = b;
// i means ignored
auto ax1_i_ay1_i = _mm_shuffle_epi32(ax0_ax1_ay0_ay1, _MM_SHUFFLE(3, 3, 1, 1));
auto bx1_i_by1_i = _mm_shuffle_epi32(bx0_bx1_by0_by1, _MM_SHUFFLE(3, 3, 1, 1));
auto ax0bx0_ay0by0 = _mm_mul_epi32(ax0_ax1_ay0_ay1, bx0_bx1_by0_by1);
auto ax0bx1_ay0by1 = _mm_mul_epi32(ax0_ax1_ay0_ay1, bx1_i_by1_i);
auto ax1bx0_ay1by0 = _mm_mul_epi32(ax1_i_ay1_i, bx0_bx1_by0_by1);
auto ax0bx1_ay0by1_32 = _mm_slli_epi64(ax0bx1_ay0by1, 32);
auto ax1bx0_ay1by0_32 = _mm_slli_epi64(ax1bx0_ay1by0, 32);
return _mm_add_epi64(ax0bx0_ay0by0, _mm_add_epi64(ax0bx1_ay0by1_32, ax1bx0_ay1by0_32));
}
Czy wykonałeś analizę porównawczą kodu w porównaniu z rejestrami ogólnego przeznaczenia? Byłbym zainteresowany wynikami, gdy robię tonę 64 razy na 64-bitowych mnożnikach. – jeteon
Po prostu przeprowadziłem testy porównawcze, wciąż jest to szybsze niż mnożenie skalarne (skompilowane za pomocą cl/O2). Około 831600000 multiplikacji w śr. 0,37 sekundy na moim nieco potężnym i7 5820k. Tymczasem te same mnożenia skalarne wynosiły 1,71 na średnim. więc jest około 4 razy szybsze, co jest trochę dziwne. Wydaje mi się, że cl jest naprawdę dobry w optymalizowaniu superskalarnych instrukcji – JukesOnYou
- 1. Szybkie mnożenie bardzo dużych liczb całkowitych
- 2. Mnożenie dwóch liczb całkowitych w C++
- 3. Mnożenie dwóch liczb całkowitych modulo przepełnione a trzecie
- 4. Zrozumienie algorytmu Schönhage'a-Strassena (ogromne mnożenie liczb całkowitych)
- 5. Uzyskiwanie liczb losowych z listy liczb całkowitych
- 6. Mnożenie punktowe liczb ujemnych
- 7. Java: grupowanie liczb całkowitych
- 8. SSE z podziałem całkowitym?
- 9. Stream liczb całkowitych
- 10. Dzielenie liczb całkowitych
- 11. Zaokrąglanie liczb całkowitych z parseInt w javascript
- 12. Hashtable z 64-bitowych liczb całkowitych
- 13. Podział na seq liczb całkowitych
- 14. Określanie liczb parzystych/nieparzystych (liczb całkowitych)?
- 15. python: Generowanie partycji liczb całkowitych
- 16. C: Reprezentacja dużych liczb całkowitych
- 17. Przekraczanie dwóch liczb całkowitych bitowych
- 18. Reguły konwersji liczb całkowitych C++
- 19. Wstawianie przecinków do liczb całkowitych
- 20. Konwersja Java do liczb całkowitych
- 21. Podział liczb całkowitych zwraca 0
- 22. Podział liczb całkowitych w Javie
- 23. Porównanie liczb całkowitych dowolnych typów
- 24. Jak bezpiecznie używać liczb całkowitych?
- 25. Konwertowanie listy ciągów na listę liczb całkowitych
- 26. Wyliczyć wszystkie skończone sekwencje liczb całkowitych?
- 27. Konwertuj listę list na listę liczb całkowitych
- 28. Błąd opencv mnożenie 2 Mat's
- 29. Interfejs i porównanie liczb całkowitych w golang
- 30. Jak znaleźć grupę liczb całkowitych (N) wśród rekordów, która zawiera 6 liczb całkowitych
Co oznacza "dwie liczby całkowite 64-bitowe" w tym kontekście? Masz na myśli parę 64-bitowych liczb całkowitych (a la liczb zespolonych) lub pojedynczą 128-bitową liczbę całkowitą reprezentowaną jako para liczb całkowitych 64-bitowych? –
znaczy jeden m128i bitową liczbę całkowitą reprezentowane w postaci pary z 64 bitowych liczb –
Możliwe duplikat [tej kwestii] (http://stackoverflow.com/questions/12200698/is-it-possible-to-use-sse-v2 -to-make-a-128-bit-wide-integer), a następnie. –