optimization - 使用 SSE 优化有限差分

标签 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。我可能更感兴趣的是如何(如果有的话)这样一个循环可以转换的一般轮廓,而不是具体的实现。

最佳答案

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

关于optimization - 使用 SSE 优化有限差分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4220740/

相关文章:

java - 初学者 JAVA 作业中的循环

c# - 是否在编译时从表达式中删除了冗余项

simd - 将 MMX/SSE 指令移植到 AltiVec

linux - Simd 不在我的 Linux 机器上 : fatal error: simd/simd. h: No such file or directory

c++ - 字节数组置换 SSE 优化

python - 尝试使用 bool 开关设置嵌套 while 循环

python - 太多的静态嵌套 block python

android - ConstraintLayout 优化细节

css - Google PageSpeed - 消除由 Google Fonts 引起的首屏渲染阻塞资源

java - 将两个 ArrayList 添加到一个 hashmaps 的 ArrayList