ループ内にいくつかのコードがあります
for(int i = 0; i < n; i++)
{
u[i] = c * u[i] + s * b[i];
}
したがって、uとbは同じ長さのベクトルであり、cとsはスカラーです。このコードは、高速化のためにSSEで使用するためのベクトル化の良い候補ですか?
アップデート
私はベクトル化を学び(組み込み関数を使用すればそれほど難しくないことがわかりました)、SSEにループを実装しました。ただし、VC ++コンパイラでSSE2フラグを設定すると、自分のSSEコードとほぼ同じパフォーマンスが得られます。一方、Intelコンパイラは、私のSSEコードやVC++コンパイラよりもはるかに高速でした。
これが私が参考のために書いたコードです
double *u = (double*) _aligned_malloc(n * sizeof(double), 16);
for(int i = 0; i < n; i++)
{
u[i] = 0;
}
int j = 0;
__m128d *uSSE = (__m128d*) u;
__m128d cStore = _mm_set1_pd(c);
__m128d sStore = _mm_set1_pd(s);
for (j = 0; j <= i - 2; j+=2)
{
__m128d uStore = _mm_set_pd(u[j+1], u[j]);
__m128d cu = _mm_mul_pd(cStore, uStore);
__m128d so = _mm_mul_pd(sStore, omegaStore);
uSSE[j/2] = _mm_add_pd(cu, so);
}
for(; j <= i; ++j)
{
u[j] = c * u[j] + s * omegaCache[j];
}