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
返回地址 16,因此您可以使用地址 16 到 179 之间的字节。
现在,您需要计算此范围内第一个字节的地址,该字节与64对齐,其本身为64。计算公式为 (16+64)&~(64-1)=80&~63=64。最后,您将使用地址 64 到 163 之间的字节,该字节在分配的 16 到 179 范围内。
相关文章:
- 使 std::vector 分配对齐内存的现代方法
- Linux C++ 中的页面对齐内存分配
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 具有对齐存储的动态内存分配
- 为什么动态分配的内存总是16字节对齐
- C - 将所有分配的双阵列对齐至32 bytes
- C++:分配对齐的矩阵
- 在以下情况下,是否可以分配未对齐的对象?
- 如何分配内存对齐C++对象数组?
- 是否可以让 std::vector<char> 使用选定的内存对齐方式分配内存
- 在堆栈上分配对齐的内存,如_alloca
- 读取 /编写部分分配的对齐内存
- 正在分配初始化的、对齐的内存
- 如何强制对齐堆分配的对象
- 如何使用alignof强制对齐堆分配
- 对齐的成员变量和动态分配
- c++堆分配默认为32字节对齐
- 堆分配变量的结构成员对齐
- clang格式的对齐分配是否损坏