Jako rozszerzenie odpowiedź moyner za , on-Chip sqrt
jest zwykle rsqrt
, czyli odwrotność pierwiastka kwadratowego, który oblicza → 1 / √. Więc jeśli w swoim kodzie będziesz używał tylko1/r(jeśli robisz dynamikę molekularną, jesteś), możesz obliczyćbezpośrednio i zapisać sobie podział. Powodem, dla któregooblicza się zamiast tegojest to, że jego iteracja Newtona nie ma podziałów, tylko uzupełnienia i mnożenia.a→1/a−−√1/rr = rsqrt(r2)
rsqrt
sqrt
Na marginesie, podziały są również obliczane iteracyjnie i są prawie tak samo wolne jak rsqrt
w sprzęcie. Jeśli szukasz wydajności, lepiej jest usunąć zbędne podziały.
Niektóre bardziej nowoczesne architektury, takie jak architektury POWER IBM, nie zapewniają rsqrt
per se, ale oszacowanie z dokładnością do kilku bitów, np . FRSQRTE . Gdy użytkownik dzwoni rsqrt
, generuje to oszacowanie, a następnie jedną lub dwie (tyle, ile potrzeba) iteracje algorytmu Newtona lub Goldschmidta przy użyciu regularnych mnożeń i dodatków. Zaletą tego podejścia jest to, że etapy iteracji mogą być potokowane i przeplatane z innymi instrukcjami bez blokowania FPU (bardzo ładny przegląd tej koncepcji, aczkolwiek na starszych architekturach, patrz praca doktorska Rolfa Strebela ).
W przypadku potencjałów interakcji sqrt
operacji można całkowicie uniknąć, stosując interpolant wielomianowy funkcji potencjalnej, ale moja własna praca (zaimplementowana w mdcore
) w tym obszarze pokazuje, że przynajmniej w architekturach typu x86 sqrt
instrukcja jest wystarczająco szybka.
Aktualizacja
Ponieważ wydaje się, że ta odpowiedź przyciąga sporo uwagi, chciałbym również odnieść się do drugiej części twojego pytania, tj. Czy naprawdę warto spróbować ulepszyć / wyeliminować podstawowe operacje, takie jak sqrt
?
W kontekście symulacji dynamiki molekularnej lub jakiejkolwiek symulacji opartej na cząsteczkach z interakcjami ograniczonymi przez granicę odcięcia można wiele zyskać dzięki lepszym algorytmom znajdowania sąsiadów. Jeśli używasz list komórek lub czegoś podobnego, aby znaleźć sąsiadów lub utworzyć listę Verlet , będziesz obliczał dużą liczbę fałszywych odległości parami. W naiwnym przypadku tylko 16% skontrolowanych par cząstek faktycznie znajduje się w odległości odcięcia od siebie. Chociaż dla takich par nie jest obliczana interakcja, dostęp do danych cząstek i obliczenie fałszywej odległości parami wiąże się z dużymi kosztami.
Moja własna praca w tym obszarze ( tutaj , tutaj i tutaj ), a także innych (np. Tutaj ), pokazuje, jak można uniknąć tych fałszywych obliczeń. Te algorytmy wyszukiwania sąsiadów przewyższają nawet listy Verletów, jak opisano tutaj .
Chciałbym podkreślić, że chociaż mogą istnieć pewne ulepszenia, które można uzyskać dzięki lepszej znajomości / wykorzystaniu podstawowej architektury sprzętowej, istnieją również potencjalnie większe korzyści z ponownego przemyślenia algorytmów wyższego poziomu.
rsqrtps
i AVXvrsqrtps
są również szacunkami, mają poprawne pierwsze 11 do 12 bitów i powinieneś udoskonalić iteracją Newtona lub dwoma, jeśli chcesz większej dokładności. Są to instrukcje 5/1 i 7/1 (opóźnienie / odwrotna przepustowość) na Sandy Bridge (patrz dokumentacja Intela lub tabele instrukcji Agner Fog, które są porównywalne do mnożenia. W przeciwieństwie do tego, pełna dokładność(v)sqrtps
(lub podwójna precyzja(v)sqrtpd
) zajmuje 10-43 / 10–43 (szczegóły w tabelach instrukcji)