我想知道如果它可能使用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可以使用。我也许更感兴趣的大致轮廓如何(如果有的话),这样的循环可能转化,而不是一个具体的实现。

有帮助吗?

解决方案

它看起来应该是可能的,但由于(a)您使用的是双打,(B)你的计算相对很少做给I / O,(C)最现代化的x86-64的CPU有两个的FPU无论如何,那么你可能无法得到你的SIMD编码的投资多少回报。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top