其他分享
首页 > 其他分享> > 优化3D循环(C)

优化3D循环(C)

作者:互联网

我正在使用C中的多重网格解算器,现在我正在努力提高串行性能.最耗时的部分是更平滑,在我的例子中是一个连续的过度放松求解器.这看起来如下(我希望它非常自我解释):

int idx; 
int strideY = stride_[level][0];
int strideZ = stride_[level][1];
for(int i = 0; i < steps; ++i) {

    for(int z = 1; z <= innerGridpoints_[level][2]; ++z) {
        for(int y = 1; y <= innerGridpoints_[level][1]; ++y) {
            idx = getIndexInner(level, 1,y,z);
            for(int x = 1; x <= innerGridpoints_[level][0]; ++x, ++idx) {
                grid[idx] = (1. - omega)  * grid[idx] + omega * 1./6. * (grid[idx+1] + grid[idx-1] +
                                    grid[idx + strideY]  + grid[idx - strideY] + 
                                    grid[idx + strideZ]  + grid[idx - strideZ] - 
                                    spacing_[level] * spacing_[level] * rhs[idx]);
            }
        }
    }
}

我已经做了一些优化:循环定位使得内部循环给出最多的本地条目(即相邻元素沿x维度),以及idx的预先计算(即使这是一个内联函数,它节省了很多时间这样).
我也试过阻塞,即不迭代整个网格,但只是在小块上增加局部性,但这没有任何影响.
我的最后一个想法是尝试一些循环展开,但实际上我不希望从那里获得重大改进.我在想,也许对内存访问有一些可能的改进.欢迎任何tipps

标签:c,optimization,scientific-computing
来源: https://codeday.me/bug/20190729/1568445.html