C++:分配对齐矩阵
C++: allocate aligned matrices
我正在阅读一些 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
) 并从正确对齐的第一个字节开始使用它。第一个字节是在较低的赋值中计算的。
但是,这是一段糟糕的代码。例如,它丢失了有关最初分配地址的信息,因此您不能 free
它。或者,它将指针转换为 unsigned long
,这是不安全的(有 uintptr_t
)。
还有其他方法可以分配对齐存储,例如posix_memalign
。
示例:假设您想分配 100 字节的内存,但您分配了 100+64=164。 malloc
returns 地址 16,因此您可以使用地址 16 到 179 的字节。
现在,您需要计算此范围内与64对齐的第一个字节的地址,它本身就是64。计算为(16+64)&~(64-1)=80&~63=64 .所以最后,您将使用地址 64 到 163 中的字节,它在分配的范围 16 到 179 内。
我正在阅读一些 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
) 并从正确对齐的第一个字节开始使用它。第一个字节是在较低的赋值中计算的。
但是,这是一段糟糕的代码。例如,它丢失了有关最初分配地址的信息,因此您不能 free
它。或者,它将指针转换为 unsigned long
,这是不安全的(有 uintptr_t
)。
还有其他方法可以分配对齐存储,例如posix_memalign
。
示例:假设您想分配 100 字节的内存,但您分配了 100+64=164。 malloc
returns 地址 16,因此您可以使用地址 16 到 179 的字节。
现在,您需要计算此范围内与64对齐的第一个字节的地址,它本身就是64。计算为(16+64)&~(64-1)=80&~63=64 .所以最后,您将使用地址 64 到 163 中的字节,它在分配的范围 16 到 179 内。