我正在编写一个数学方法的代码(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
Run Code Online (Sandbox Code Playgroud)
对于上下文,
statObj是一个包含许多3x3静态双数组的对象.我通过调用new函数初始化statObj.然后我使用一些数学函数填充其中的数组.一个这样的数组是A1_.变量nosUnknowns的值大约为3000.数组localFuncArr以前是由矩阵乘法生成的,是一个双数组.
现在这是我的问题:
当我使用代码中显示的行时,代码运行非常缓慢.像整个功能245secs的东西.
当我注释掉所述行时,代码执行速度非常快.这需要6秒钟.
现在当我用以下行替换所述行时: localFuncArr[row][col] += 3.0代码再次以与上面情况(2)相同的速度运行.
很明显,关于调用的一些事情statObj->A1_是使代码运行缓慢.
我的问题:
缓存中毒导致这种情况发生的原因是什么?
如果是这样,那么在数组初始化/对象初始化/循环展开方面可以改变什么,或者可以加速任何形式的代码优化?
我们非常感谢有经验的人对此的任何见解.
编辑:更改说明更详细,并纠正评论中提到的一些要点.
如果条件大部分为真,则您的代码行将执行 3000x3000x3000x3x3 次。大约是 2450 亿次。根据您的硬件架构,245 秒可能是一个非常合理的计时(即每 2 个周期 1 次迭代 - 假设 2GHz 处理器)。无论如何,代码中没有任何内容表明缓存中毒。