Gcc SSE用于假人的浮点点积

Gcc SSE用于假人的浮点点积,gcc,sse,simd,dot-product,Gcc,Sse,Simd,Dot Product,例如,我读过很多关于SSE/SIMD的问题,但我仍然对这些问题感到困惑。我想要的是两个双精度浮点向量之间的点积,在C99 FWIW中。我正在使用GCC 有人能给出一个简单完整的例子,包括如何将双向量转换为SSE类型,然后再转换回来吗 [编辑2012-10-08] 下面是我拼凑的一些SSE2代码,评论 #include <emmintrin.h> double dotprod(double *restrict a, double *restrict b, int n) { __

例如,我读过很多关于SSE/SIMD的问题,但我仍然对这些问题感到困惑。我想要的是两个双精度浮点向量之间的点积,在C99 FWIW中。我正在使用GCC

有人能给出一个简单完整的例子,包括如何将双向量转换为SSE类型,然后再转换回来吗

[编辑2012-10-08]

下面是我拼凑的一些SSE2代码,评论

#include <emmintrin.h>

double dotprod(double *restrict a, double *restrict b, int n)
{
   __m128d aa, bb, cc, ss;
   int i, n1 = n - 1;
   double *s = calloc(2, sizeof(double));
   double s2 = 0;

   ss = _mm_set1_pd(0);

   for(i = 0 ; i < n1 ; i += 2) 
   {
     aa = _mm_load_pd(a + i);
     bb = _mm_load_pd(b + i);
     cc = _mm_mul_pd(aa, bb);
     ss = _mm_add_pd(ss, cc);
   }

   _mm_store_pd(s, ss);
   s2 = s[0] + s[1];

   if(i < n)
      s2 += a[i] * b[i];

   free(s);

   return s2;
}

请说明您对SSE的哪个版本感兴趣,例如,最近的版本中甚至有一个点积原语。SSE2和SSE4都很好。这是一个令人讨厌的横向目标。。当然,即使使用DPPD也可以轻松完成,但这可能会导致数据组织方面的更大问题。嗯,如果有任何示例代码可以进行实验和比较,我将不胜感激。@arunmoezhi:请注意,_-mm_-dp_-pd的延迟非常高,通常为9个周期。请指定您感兴趣的SSE版本,例如,在最近的版本中甚至有点积原语。SSE2和SSE4都很好。这是一个令人讨厌的横向要求。。当然,即使使用DPPD也可以轻松完成,但这可能会导致您的数据组织出现更大的问题。如果有任何示例代码可以进行实验和比较,我将不胜感激。@arunmoezhi:请注意,_mm_dp_pd的延迟非常高,通常为9个周期。