我正在为一种数学方法(不完整的 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之前是通过矩阵乘法生成的,是一个双精度数组。
现在这是我的问题:
当我使用代码中显示的行时,代码运行非常缓慢。整个功能大约需要 245 秒。
当我注释掉上述行时,代码执行得非常快。它需要大约 6 秒。
现在,当我将上述行替换为以下行 :
localFuncArr[row][col] += 3.0
时,代码再次以与上面的 case(2) 相同的速度运行。
显然,关于调用的某些东西statObj->A1_
使代码运行缓慢。
我的问题:
缓存中毒是发生这种情况的原因吗?
如果是这样,在数组初始化/对象初始化/循环展开或任何形式的代码优化方面可以改变什么可以加快这一点?
高度赞赏有经验的人对此的任何见解。
编辑:将描述更改为更详细,并纠正评论中提到的一些要点。