缓存未命中二维数组

时间:2016-04-13 11:19:47

标签: c arrays caching

我怀疑机器如何在内存中存储二维数组。我会告诉你我的代码,以便更清楚。 我在这个主循环中用这种方式定义了一个二维数组:

int main()
{
    int i;
    internalNode**tab =(internalNode **)malloc(sizeof(internalNode *)* DIM);
    for (i=0; i<DIM ; i++)
        tab[i] = (internalNode *)malloc(sizeof(internalNode) * DIM);

    //CODE

    CalculusOnGrid(tab,DIM);
}

其中DIM是用户定义的变量,而internalNode是结构。 在CalculusOnGrid函数中,我将在网格上进行这个微积分(我的二维数组):

for(i=1;i<DIM-1;i++)
    for(j=1;j<DIM-j;i++)
        tab[i][j].temperature_new = 0.25*tab[i+1][j].temperature+tab[i-1][j].temperature + tab[i][j+1].temperature + tab[i][j-1].temperature);

所以我要搜索当前网格点(i,j)的4个邻居。

这里有我的问题:我要在上面和下面的元素上做一个Cache Miss(也就是说tab [i + 1] []和tab [i-1] [])或者在右边和左元素? (也就是说tab [] [j + 1]和tab [] [j-1])

您对加快代码速度和减少缓存未命中数的建议是什么?

我希望以明确的方式提出这个问题。如果不是这样,请问我任何你想要的东西!

谢谢!

的Alessandro

1 个答案:

答案 0 :(得分:1)

缓存未命中是您应该避免使用基于指针的查找表来模拟动态数组的众多原因之一。

相反,使用2D数组:

internalNode (*tab)[DIM] = malloc( sizeof(internalNode[DIM][DIM]) );

free(tab);

现在内存将相邻,性能应该更好。