我有一些代碼在一個循環SSE SIMD優化For循環
for(int i = 0; i < n; i++)
{
u[i] = c * u[i] + s * b[i];
}
所以,u和b是相同的長度的矢量,並且c和s是標量。這個代碼是否適合與SSE一起使用以加速矢量化?
UPDATE
我學到矢量(原來,這並不難,如果您使用內聯函數),並實現我的SSE循環。但是,在VC++編譯器中設置SSE2標誌時,我獲得的性能與我自己的SSE代碼大致相同。另一方面,英特爾編譯器比我的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];
}
[注VC11現在在它的優化使用SIMD(http://blogs.microsoft.co.il/blogs/sasha/archive/2011/10/17/simd-optimized-c-code-in -visual-studio-11.aspx) – bobobobo 2012-10-13 17:30:00