kullanarak Nokta Ürünü Hesaplamasını Vektör Hale Getirmek Bu kodu SSE4 nokta ürünü ile geliştirmeye çalışıyorum ama bir çözüm bulmakta zorlanıyorum. Bu fonksiyon, her biri 80 hücreyle float dizileri içeren qi ve tj parametrelerini alır ve daha sonra nokta ürününü hesaplar. Dönüş değeri dört nokta ürünlü bir vektördür. Yani, yapmaya çalıştığım şey, yirmi değerin dört noktalı ürününü paralel olarak hesaplamak.SSE4
Bu kodu nasıl geliştireceğiniz hakkında bir fikriniz var mı?
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;
}
Bunu düşünmeye gelin. 40 hafıza yükü var. Sandy Bridge işlemcisi kullanmıyorsanız, 40 döngüde darboğazsınız demektir. Bu yüzden OP'nin kodu zaten uygun olabilir. – Mysticial
Kayan nokta ilişkilendirmesi hakkında: Derleyici bayrakların çoğu zaman takdir edilmeyen, yanlış anlaşılan kara koyunları -hızlı-matematik, bazen harikalar yaratır. Ve AMD'ler, insanlığın neredeyse başlangıcından beri, döngü başına iki L1 hafıza yükü yapabilir, ancak maalesef köpekler her yerde yavaşlar. – hirschhornsalz
Yardımlarınız için çok teşekkürler. Test sonucum, kodumun fikriniz kadar hızlı çalıştığını belirtir (yorumda belirttiğiniz gibi). AMD FMA4 ilginç görünüyor ancak bu talimat makinemde mevcut değil ve kod SSE2 uyumlu olmalıdır. -Fast-math ile deneyeceğim. –