深度嵌套循环的缓存中毒问题

时间:2013-07-17 23:39:50

标签: c++ performance

我正在编写一个数学方法的代码(Incomplete Cholesky),我遇到了一个奇怪的障碍。请参阅以下简化代码。

for(k=0;k<nosUnknowns;k++)
{
    //Pieces of code
    for(i=k+1;i<nosUnknowns;i++)
    {
        // more code
    }
    for(j=k+1;j<nosUnknowns;j++)
    {
        for(i=j;i<nosUnknowns;i++)
        {
            //Some more code 
            if(xOk && yOk && zOk)
            {
                if(xDF == 1 && yDF == 0 && zDF == 0)
                {
                    for(row=0;row<3;row++)
                    {
                        for(col=0;col<3;col++)
                        {
                            // All 3x3 static arrays This is the line
                            statObj->A1_[row][col] -= localFuncArr[row][col];
                        }
                    }
                }
            }
        }//Inner loop i ends here
    }//Inner loop j ends here
}//outer loop k ends here

对于上下文,

statObj 是一个包含许多3x3静态双数组的对象。我正在通过调用新函数初始化 statObj 。然后我使用一些数学函数填充其中的数组。一个这样的数组是 A1 _ 。变量 nosUnknowns 的值大约为3000.数组 localFuncArr 以前是通过矩阵乘法生成的,是一个双数组。

现在这是我的问题:

  1. 当我使用代码中显示的行时,代码运行得非常缓慢。像整个功能一样245secs。

  2. 当我注释掉所述行时,代码执行速度非常快。这需要6秒钟。

  3. 现在,当我用以下行替换所述行:localFuncArr[row][col] += 3.0时,代码再次以与上述情况(2)相同的速度运行。

  4. 显然,对statObj->A1_的调用使得代码运行缓慢。

    我的问题:

    1. 缓存中毒导致这种情况发生的原因是什么?

    2. 如果是这样,在数组初始化/对象初始化/循环展开方面可以改变哪些内容,或者可以加速任何形式的代码优化?

    3. 对经验丰富的人的任何见解都非常感谢。

      编辑:将描述更改为更详细,并纠正评论中提到的一些要点。

1 个答案:

答案 0 :(得分:4)

如果条件大部分为真,则您的代码行执行3000x3000x3000x3x3次。这大约是2450亿次。根据您的硬件架构,245秒可能是一个非常合理的时间(每2个周期进行1次迭代 - 假设2GHz处理器)。在任何情况下,代码中都没有任何暗示缓存中毒的内容。