Szukam szybkiego sposobu obliczania iloczynu kropek wektorów z 3 lub 4 komponentami. Próbowałem kilku rzeczy, ale większość przykładów online korzysta z szeregu zmiennych, podczas gdy nasza struktura danych jest inna.Szybki produkt z kropką za pomocą intrisics SSE/AVX
Używamy struktur, które są wyrównane do 16 bajtów. fragment kodu (uproszczony):
struct float3 {
float x, y, z, w; // 4th component unused here
}
struct float4 {
float x, y, z, w;
}
W poprzednich badaniach (z wykorzystaniem SSE4 dot produkt wewnętrzną lub FMA) nie mogłem uzyskać przyspieszenie w porównaniu z użyciem po regularnych kodu C++.
float dot(const float3 a, const float3 b) {
return a.x*b.x + a.y*b.y + a.z*b.z;
}
Testy zostały wykonane za pomocą gcc i clang na Intel Ivy Bridge/Haswell. Wydaje się, że czas poświęcony na załadowanie danych do rejestrów SIMD i wyciągnięcie ich ponownie zabija wszystkie zalety.
Byłbym wdzięczny za pomoc i pomysły, w jaki sposób można efektywnie obliczyć produkt z wykorzystaniem naszych struktur danych float3/4. SSE4, AVX lub nawet AVX2 jest w porządku.
Z góry dziękuję.
Czy sprawdziłeś wygenerowany ASM? W przypadku gcc można włączyć generowanie wyjścia ASM za pomocą przełącznika '' -S'' (wyjście jest zapisywane w celu podanym za pomocą '' -o''). Jakie są twoje opcje kompilacji? Czy jest możliwe, że gcc generuje już kod SSE? –
Z reguły SSE przyspiesza działanie tylko wtedy, gdy masz dużo obliczeń bez opuszczania rejestrów SSE. To, co masz w swojej funkcji dot, wygląda na niewystarczające (i potwierdzone przez twoje testy). Jeśli masz coś większego, co obejmuje wywołanie kropki() (najlepiej pętlę wywołującą kropkę() tysiąc razy, a cała pętla może być zaimplementowana jako SSE) - wtedy masz dużą szansę na ogólne przyspieszenie. –
Byłoby pomocne zobaczenie większego kontekstu, szczególnie kodu, który wywołuje 'kropkę'. Czy nazywasz 'kropką' w pętli, np.dla tablicy 'float3' lub' float4'? –