私は SSE/SIMD に関する SO の質問をたくさん読みました (例: Getting started with SSE ) が、いまだに混乱しています。私が欲しいのは、C (C99 FWIW) の 2 つの倍精度浮動小数点ベクトル間のドット積だけです。私はGCCを使用しています。
double ベクトルを SSE 型に変換して元に戻す方法など、単純で完全な例を誰かが投稿できますか?
[2012 年 10 月 8 日編集]
これは、私がうまくまとめた 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;
}