2013-03-20 212 views
3

我正在研究C++中的多重网格解算器,现在我正在尝试改进串行性能。这里最耗时的部分是平滑的,在我的情况下是连续的过度松弛求解器。这看起来如下(我希望这是相当自我解释):优化3D循环(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欢迎:)

只是供参考:网格大小会从非常小到255x255x255不等。此外,网格在每个维度都有一些边界,由少量的行组成,即迭代不在整个网格上。

+0

您是否打算在(10,10,10)处进行平滑以在同一平滑过程中更改(10,10,11)处的结果? – Yakk 2013-03-20 22:17:54

+0

@Yakk:对不起,我不太明白你的意思? (10,10,10)处的平滑仅改变此值。你的意思是像红黑一样吗?这是通常用于并行化,但我保持纯串行 – Chris 2013-03-20 22:35:51

+0

不,我的意思是你修改'grid [10,10,10]',然后在设置'grid [10,10,11]'(I' m使用'[a,b,c]'来表示“做所有的索引计算以找出a,b,c处的项目是''grid [getIndexInner(level,10,10,10)]'而不是'格[10,10,10]'是刚刚被详细说明) – Yakk 2013-03-20 23:38:17

回答

7

一个好的优化编译器会为你做大部分简单的事情,所以总是衡量你所做的改变是否实际上改善了事情。并且,检查(并学会理解)生成的汇编代码,以查看编译器实际上在做什么。

但也有几件事情我想尝试,因为表情是复杂的,甚至是很好的优化有时需要一点帮助: -

首先,是提升内部循环中是不变出来的子表达式周围的环路。在你的例子中,明显的是spacing_[level] * spacing_[level]omega * 1./6.

另一件事是尝试使idx是一个指针而不是数组索引,并增加循环中的指针。

int *idx = &grid[getIndexInner(level, 1,y,z)]; // assuming grid is array of ints. 

你的表情,然后开始像这样

*idx = (1. - omega) * *idx + omega * 1./6. * (idx[1] + idx[-1] + 
           idx[strideY] + idx[- strideY] + // etc... 

你的优化器(假设它是打开???)可能已经在这么做了。但值得一试。正如我所说,没有测量,这是毫无意义的练习。

而且,正如@AkiSuihkonen在上面的评论中提到的“首先让它工作”。调试高度优化的代码要困难得多,所以请确保您的算法正好执行在开始担心性能之前应如何执行。

+0

谢谢,我会定义。试一试。当然,我测量每一步,到目前为止,我提到的优化总是给我一些加速 – Chris 2013-03-20 22:37:03