利用SSE优化有限差分

时间:2010-11-18 23:30:08

标签: optimization simd nested-loops

我想知道是否可以使用SSE(1,2,3,4,...)来优化以下循环:

// u and v are allocated through new double[size*size]
for (int j = l; j < size-1; ++j)
{
    for (int k = 1; k < size-1; ++k)
    {
        v[j*size + k] = (u[j*size + k-1] + u[j*size + k+1] 
                       + u[(j-1)*size + k]+ u[(j+1)*size + k]) / 4.0;
    }
}

[j*size + k]成语用于将内存块视为多维数组。

遗憾的是,GCC(4.5)的-ftree-vectorize标志认为该循环不适合SIMD类型优化。 (虽然说我从未见过-ftree-vectorize优化除了最简单的循环之外的任何东西。)

虽然我知道有很多其他方法可以改善循环的性能(OpenMP,展开,就地算法等),但我特别想知道是否可以使用SIMD。我可能更感兴趣的是如何(如果有的话)可以转换这样一个循环的大纲,而不是具体的实现。

1 个答案:

答案 0 :(得分:0)

看起来它应该是可能的,但是因为(a)你正在使用双打,(b)你做的计算相对于I / O很少,(c)大多数现代的x86-64 CPU都有两个FPU无论如何,那么你的SIMD编码投资可能得不到多少回报。