我正在阅读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));
谢谢!
答案 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内。