我想知道是否可以使用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。我可能更感兴趣的是这样的循环如何(如果有的话)可以转换的大致轮廓,而不是具体的实现。
发布于 2010-11-19 07:33:05
这看起来应该是可能的,但由于(a)您使用的是doubles,(b)您做的相对于I/O的计算非常少,(c)大多数现代x86-64CPU无论如何都有两个FPU,那么您的SIMD编码投资可能得不到太多回报。
https://stackoverflow.com/questions/4220740
复制相似问题