用于无锁算法的指针对齐

时间:2015-06-08 13:32:14

标签: c linux x86-64 lock-free

当使用calloc时,指向新分配的内存的指针至少与最低有效位的certian数对齐,这意味着最不重要的位(如标记的pointeres)可以用于无锁算法,实际上通常是用于那些算法的情况。我在linux ubuntu服务器上测试内存管理功能(x86_64 GNU / Linux,3.10.23-xxxx-std-ipv6-64-vps),从我的实验看,似乎4个最低有效位设置为0。我所读到的内容指出指针对齐是以这样的方式形成的,表示为uintptr的指针被除以4(对齐到2个最低有效位)

从POSIX(linux)中的内存管理系统获得的新分配的内存指针中的最低有效位的最小数量是多少,在初始内存分配过程中始终设置为0?

可以在linux系统上用作标记指针的最低有效位的最大数量是多少(例如,无锁算法)?

如何强制编译器对齐新分配的指针以显示最低有效位的数量?

指针的对齐是否会影响系统的整体性能,以及如何影响?

3 个答案:

答案 0 :(得分:4)

由于许多相关原因,对齐在优化中很重要:

  • 有效使用缓存行
  • 避免禁用预取逻辑
  • 矢量寄存器/指令(SSE,AVX)的最佳用法。
  • 尤其是在涉及I / O时,内存页面对齐也很重要。

您可以在此找到非常好的英特尔架构参考资料: http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html

快速回答您的问题:

  

新增的最低有效位的最小数量是多少   分配内存指针,从内存管理系统中获取   POSIX(linux),在初始内存期间始终设置为0   分配过程?

这实际上取决于您所说的CPU /架构。

  

最低有效位的最大数量是多少   用作linux系统上的标记指针(例如无锁算法)?

与前者相同:如果C ++是一个选项,你应该使用std::atomicboost::atomic来获得某种可移植性。

在英特尔架构上,内存加载和存储在x86_32上为32位原子,在x86_64上为64,如果数据正确对齐则为

如果您真的喜欢这种低级别,请不要忘记查看内存语义,内存栅栏等(上面手册中的“Fence指令”)

答案 1 :(得分:2)

我担心我无法回答你的整个问题,但我可以开始:

指针对齐可能不仅会改变性能,还可能使代码完全正常工作。特别是对于像ARM处理器这样的东西,如果指针未对齐,则无法读取大于1个字节的数字。这样做会导致错误。

例如,如果我使用大数据流,我更喜欢将数据对齐,这样我就可以同时读取更多字节,而不必为字节读取字节会花费更多的时间/ CPU。

答案 2 :(得分:2)

x86 / x86_64 架构读取/写入未对齐内存是以性能成本支付的,因为您需要两个内存操作而不是一个内存操作:到内存的总线操作始终是对齐。 在GNU / Linux上,您可以使用 posix_memalign & C.在用户空间中获取对齐的内存( man memalign )。

有些编译器还支持宏来获取堆栈上的对齐内存,例如

/* GCC align declarator */
#define MYMEMALIGN(x, y) x __attribute__( (aligned( y )) )
#endif

但我想这是非便携式解决方案。