C ++:分配对齐的矩阵

时间:2018-01-29 16:49:01

标签: c++ memory-alignment

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

<div class="container">
  <div class="item">ITEM</div>
  <div class="item">ITEM</div>
  <div class="item">ITEM</div>
  <div class="item">ITEM</div>
  <div class="item">ITEM</div>
  <div class="item">ITEM</div>
  <div class="item">ITEM</div>
  <div class="item">ITEM</div>
</div>

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

   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));

谢谢!

1 个答案:

答案 0 :(得分:2)

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

然而,这是一段可怕的代码。例如,它丢失了有关最初分配的地址的信息,因此您无法free它。或者,它会转向指向unsigned long的指针,这是不安全的(有uintptr_t)。

还有其他方法可以分配对齐的存储空间,例如posix_memalign

示例:考虑您要分配100个字节的内存,但是您要分配100 + 64 = 164。 malloc返回地址16,因此您可以使用地址16到179的字节。

现在,您需要计算此范围内第一个字节的地址,该范围对应于64,其本身为64.计算为(16 + 64)&amp;〜(64-1)= 80&amp; ~63 = 64 。最后,您将使用地址64到163的字节,这些字节在分配的范围16到179内。