Wpadłem w ciekawy problem. Algorytm pracuję nad składa się z wielu obliczeń, jak to32-bitowe i 64-bitowe obliczenia zmiennoprzecinkowe
q = x(0)*y(0)*z(0) + x(1)*y(1)*z(1) + ...
gdzie długość sumowania jest między 4 a 7.
Oryginalne obliczenia są wykonywane przy użyciu 64-bitową precyzją. Do eksperymentów próbowałem używać 32-bitowej precyzji dla wartości wejściowych x, y, z (tak, że obliczenia są wykonywane przy użyciu 32-bitów), a przechowywanie końcowego wyniku jako wartości 64-bitowej (rzutowanie proste).
Oczekiwano, że wydajność 32-bitowa będzie lepsza (rozmiar pamięci podręcznej, rozmiar SIMD itd.), Ale ku mojemu zaskoczeniu nie było różnicy w wydajności, a może nawet spadku.
Omawiana architektura to Intel 64, Linux i GCC. Oba kody wydają się używać SSE, a tablice w obu przypadkach są wyrównane do granicy 16 bajtów.
Dlaczego tak się stanie? Domyślam się, że 32-bitowa precyzja może wykorzystywać SSE tylko na pierwszych czterech elementach, a reszta jest wykonywana szeregowo przez rzutowanie rzutów.
Dodałeś nagrodę - co Ci się nie podobało w odpowiedzi na pytanie dotyczące dsimcha? Warto również wypróbować najnowszą wersję GCC lub kompilatora Intela http://software.intel.com/en-us/articles/non-commercial-software-download/, aby sprawdzić, czy wykonują one lepszą pracę kompilującą/wektoryzującą . – Rup
@Rup Podoba mi się jego odpowiedź, niemniej jednak chciałbym również innych opinii, więc postawiłem nagrodę – Anycorn