适用于假人的SSE浮点产品

时间:2012-10-05 03:33:23

标签: gcc sse simd dot-product

我已经读过很多关于SSE / SIMD的SO问题(例如,Getting started with SSE),但我仍然对所有问题感到困惑。我想要的只是两个双精度浮点矢量之间的点积,用C(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;
}

0 个答案:

没有答案