连续内存分配的好处

wol*_*k88 5 c memory-management hpc

在性能方面,为矩阵分配连续内存块与单独内存块相比有什么好处?即,而不是像这样编写代码:

char **matrix = malloc(sizeof(char *) * 50);
for(i = 0; i < 50; i++)
    matrix[i] = malloc(50);
Run Code Online (Sandbox Code Playgroud)

给我 50 个不同的块,每个块 50 个字节和一个块 50 个指针,如果我改为写:

char **matrix = malloc(sizeof(char *) * 50 + 50 * 50);
char *data = matrix + sizeof(char *) * 50;
for(i = 0; i < 50; i++) {
    matrix[i] = data;
    data += 50;
}
Run Code Online (Sandbox Code Playgroud)

给我一个连续的数据块,有什么好处?避免缓存未命中是我唯一能想到的,甚至这也仅适用于少量数据(小到足以放入缓存),对吗?我已经在一个小型应用程序上对此进行了测试,并且注意到了一个小的加速并且想知道为什么。

gna*_*729 4

这很复杂——你需要测量。

使用中间指针而不是计算二维数组中的地址很可能是当前处理器的损失,并且您的两个示例都是这样做的。

接下来,所有适合 L1 缓存的内容都是一个巨大的胜利。malloc () 最有可能四舍五入为 64 字节的倍数。180 x 180 = 32,400 字节可能适合 L1 缓存,而单个 malloc 可能分配 180 x 192 = 34,560 字节可能不适合,特别是如果您添加另外 180 个指针。

一个连续的数组意味着您知道数据如何适合缓存行,并且您知道硬件中的页表查找次数最少。对于数百个 malloc,没有保证。