我想知道是否有可能使用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。 我可能更感兴趣的是如何(如果有的话)转换这样一个循环的一般轮廓,而不是具体实现。
-ftree-vectorizer-verbose=n
吗?gcc会给出有关为什么进行/不进行向量化的提示。需要注意的一点是,如果没有使用restrict
关键字,它将假定v可能与u别名,这将阻止许多SSE(在最好的情况下,它将制作两个版本,并在运行时决定)。 - Ben Jackson