Pro*_*ish 6 sse simd visual-c++
我在循环中有一些代码
for(int i = 0; i < n; i++)
{
u[i] = c * u[i] + s * b[i];
}
Run Code Online (Sandbox Code Playgroud)
因此,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];
}
Run Code Online (Sandbox Code Playgroud)
是的,这是矢量化的绝佳候选者.但是,在您这样做之前,请确保您已经分析了代码,以确保这实际上值得优化.也就是说,矢量化将是这样的:
int i;
for(i = 0; i < n - 3; i += 4)
{
load elements u[i,i+1,i+2,i+3]
load elements b[i,i+1,i+2,i+3]
vector multiply u * c
vector multiply s * b
add partial results
store back to u[i,i+1,i+2,i+3]
}
// Finish up the uneven edge cases (or skip if you know n is a multiple of 4)
for( ; i < n; i++)
u[i] = c * u[i] + s * b[i];
Run Code Online (Sandbox Code Playgroud)
为了获得更高的性能,您可以考虑预取更多数组元素,和/或展开循环并使用软件流水线将一个循环中的计算与来自不同迭代的内存访问交错.
| 归档时间: |
|
| 查看次数: |
7448 次 |
| 最近记录: |