【问题标题】:How do arrays created with malloc interact with cache?使用 malloc 创建的数组如何与缓存交互?
【发布时间】:2021-12-05 12:03:54
【问题描述】:

假设我现在使用代码创建了一个向量

double *a;
double b;
a = (double *)malloc(64*sizeof(double));

//Initialize a

for(int i = 0; i < 64; i++)
{
    b += a[i];
}

我猜在计算 b 时,a[i] 将分别在缓存中为每个 i 传输,对吗?

那么使用double a[64] 而不是malloc 创建a 怎么样?整个数组会同时放入缓存吗?

提前致谢。

【问题讨论】:

  • 应该没有区别,堆栈和堆分配都由连续的虚拟地址范围组成。
  • "整个数组会同时放入缓存吗?"缓存通常是根据内存访问来填充的。它对您的数组或这些数组的大小一无所知。不管你把它放在栈上还是堆上。

标签: c caching memory malloc vectorization


【解决方案1】:

那么使用double a[64] 而不是malloc 创建a 怎么样?将要 整个数组同时放入缓存?

如果使用double a[64]声明,则应同时放入Stack

如果你使用malloc分配内存,那应该同时放入Heap

只是内存位置不同。

Demo

根据Demo,将整个数组同时放入HeapStack

另一方面,在malloc 之后Size a 输出65 原因是malloc_usable_size(void* ptr) 问题。

(使用这个函数只是想确定内存是否已经分配。)

malloc_usable_size() description

malloc_usable_size()返回的值可能大于 由于对齐而请求的分配大小和 最小尺寸限制。虽然多余的字节可以 由应用程序覆盖而没有不良影响,这不是 良好的编程习惯:一个中多余的字节数 分配取决于底层实现。

我猜在计算b的时候,a[i]会单独在缓存中传输 对于每个 i,我是对的吗?

我不确定您的cache 是什么意思,但a[i] 应该取自HeapStack

【讨论】:

    猜你喜欢
    • 2021-06-15
    • 2015-07-16
    • 2020-10-29
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多