3

我想知道是否可以使用 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]成语用于将内存块视为多维数组。

遗憾的是-ftree-vectorize,GCC (4.5) 的标志不相信循环适合 SIMD 类型的优化。-ftree-vectorize(尽管我说除了最琐碎的循环之外,我从未见过优化任何东西。)

虽然我知道还有许多其他方法可以提高循环的性能(OpenMP、展开、就地算法等),但我特别想知道是否可以使用 SIMD。我可能更感兴趣的是如何(如果有的话)这样的循环可以被转换的总体轮廓,而不是具体的实现。

4

1 回答 1

0

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

于 2010-11-18T23:33:04.877 回答