C++:分配对齐矩阵

标签 c++ memory-alignment

我正在阅读一些 C++ 代码,我阅读了以下内容:

   CACHELINE = 64;
   ...

/* allocate the three matrices and align to cache lines */
    a = (double *)malloc(nmax*nmax*sizeof(double)+CACHELINE);
    b = (double *)malloc(nmax*nmax*sizeof(double)+CACHELINE);
    c = (double *)malloc(nmax*nmax*sizeof(double)+CACHELINE);
    a = (double *)(((unsigned long)a+CACHELINE)&~(CACHELINE-1));
    b = (double *)(((unsigned long)b+CACHELINE)&~(CACHELINE-1));
    c = (double *)(((unsigned long)c+CACHELINE)&~(CACHELINE-1));

为什么这段代码会创建与缓存行对齐的矩阵?我特别不明白这条指令的作用:

a = (double *)(((unsigned long)a+CACHELINE)&~(CACHELINE-1));

谢谢!

最佳答案

这很简单。 malloc 不保证返回的地址将与缓存行大小对齐。因此,您可以分配一些额外的内存(+CACHELINE)并从正确对齐的第一个字节开始使用它。第一个字节是在较低的赋值中计算的。

但是,这是一段糟糕的代码。例如,它丢失了有关最初分配地址的信息,因此您无法释放它。或者,它将指针转换为 unsigned long,这是不安全的(有 uintptr_t)。

还有其他方法如何分配对齐存储,例如posix_memalign


示例:假设您想分配 100 字节的内存,但您分配的是 100+64=164。 malloc 返回地址 16,因此您可以使用地址 16 到 179 之间的字节。

现在,您需要计算此范围内与 64 对齐的第一个字节的地址,它本身就是 64。计算为 (16+64)&~(64-1)=80&~63=64。所以最后,您将使用地址 64 到 163 中的字节,它在分配的范围 16 到 179 内。

关于C++:分配对齐矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48506181/

相关文章:

c++ - Qt 主窗口崩溃

linux - Linux内核中的IS_ALIGNED宏是做什么的?

c# - .NET 中未对齐字段的读写绝对是原子的吗?

C++ 段错误,可重现的例子

c++ - 为什么 sizeof ("string") 打印的长度比 "string"的长度多 1 ?

c++ - 在 VS2013 中编译 : error LNK2001 using C++

c++ - 使用 boost::hana 进行自省(introspection)

c++ - POD 结构或标准布局类型的成员是否保证根据其对齐要求对齐?

c++ - 为什么 alignas 说明符会在 Clang 上抛出错误?

c++ - 在初始化列表中从 float* 设置 double[]