Próbuję poprawić ten kod za pomocą produktu kropki SSE4, ale mam problem ze znalezieniem rozwiązania. Ta funkcja pobiera parametry qi i tj, które zawierają tablice float z 80 komórkami, a następnie obliczają iloczyn kropki. Wartość zwracana to wektor z produktami z czterema kropkami. Więc próbuję to zrobić równolegle obliczając czteropunktowe produkty o dwudziestu wartościach.Wektoryzacja Obliczanie iloczynu punktowego za pomocą SSE4
Masz pojęcie, jak ulepszyć ten kod?
inline __m128 ScalarProd20Vec(__m128* qi, __m128* tj)
{
__m128 res=_mm_add_ps(_mm_mul_ps(tj[0],qi[0]),_mm_mul_ps(tj[1],qi[1]));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[2],qi[2]),_mm_mul_ps(tj[3],qi[3])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[4],qi[4]),_mm_mul_ps(tj[5],qi[5])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[6],qi[6]),_mm_mul_ps(tj[7],qi[7])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[8],qi[8]),_mm_mul_ps(tj[9],qi[9])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[10],qi[10]),_mm_mul_ps(tj[11],qi[11])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[12],qi[12]),_mm_mul_ps(tj[13],qi[13])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[14],qi[14]),_mm_mul_ps(tj[15],qi[15])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[16],qi[16]),_mm_mul_ps(tj[17],qi[17])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[18],qi[18]),_mm_mul_ps(tj[19],qi[19])));
return res;
}
Pomyśl o tym. Ma 40 pamięci. Jeśli nie używasz procesora Sandy Bridge, jesteś wąskim gardłem w 40 cyklach. Kod OP może być już optymalny. – Mysticial
O zespoleniu zmiennoprzecinkowym: często niedoceniane, niezrozumiane czarne owce z flagami kompilatorów '-ffast-matath' działa czasami cuda. A AMD mogą robić dwa ładunki pamięci L1 na cykl od prawie całego zarania ludzkości, ale niestety są wszędzie wolne od psów. – hirschhornsalz
Wielkie dzięki za pomoc. Mój wynik testu stwierdza, że mój kod działa tak szybko, jak twój pomysł (jak wspomniano w komentarzu). AMD FMA4 wygląda interesująco, ale ta instrukcja nie jest dostępna na moim komputerze, a kod musi być zgodny z SSE2. Spróbuję tego z -ffast-matem. –