【问题标题】:Alignment of pointers for lock-free algorithms无锁算法的指针对齐
【发布时间】:2015-06-08 13:32:14
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 没有设置为 0 的最低有效位的“最小”或“最大”数。内存对齐高度依赖于平台。您所知道的是,系统通常具有一种限制内存对齐的类型,并且malloc() 和其他内存分配函数总是返回一个针对最严格的类型进行适当对齐的指针(因此可以与任何类型一起使用)
  • 为什么你认为内存对齐和无锁算法之间存在关系?
  • 我想你可能想阅读man7.org/linux/man-pages/man3/posix_memalign.3.html。通常内存对齐基于 sizeof(double)。如果您调用手册页中的函数,则可以更改。
  • @Robert Jacobs 内存对齐和无锁算法之间的关系是当一个人能够使用标记指针时。

标签: c linux x86-64 lock-free


【解决方案1】:

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

  • 高效使用缓存行
  • 避免禁用预取逻辑
  • 向量寄存器/指令(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 以获得某种可移植性。

在 Intel 架构上,对于 32 位、x86_32 和 64 位 x86_64,内存加载和存储是原子的,如果数据正确对齐

如果你真的喜欢这种低级,别忘了看看内存语义、内存栅栏等(上面手册中的“栅栏指令”)

【讨论】:

  • 补充@Sigismondo 的出色回答:如果内存未对齐,某些 SSE/AVX 指令会产生总线错误。
【解决方案2】:

恐怕我无法回答你的全部问题,但我可以开始:

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

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

【讨论】:

    【解决方案3】:

    关于 x86/x86_64 架构对未对齐内存的读/写是以性能为代价的,因为您将需要两个内存操作而不是一个:进出内存的总线操作总是对齐。 在 GNU/Linux 上,您可以使用 posix_memalign 和 C. 在用户空间中获得 heap 对齐内存 (man memalign)。

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

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

    但我猜这是不可移植的解决方案。

    【讨论】:

    • 在最新的 Intel CPU 上,未对齐的加载/存储的惩罚为零,除非数据跨越缓存线。并且可能会因跨越页线而受到更大的惩罚。因此,尝试对齐数据仍然是一个好主意,但是对于需要对数据进行不同偏移的情况,未对齐数据有很好的硬件支持。
    猜你喜欢
    • 2017-08-16
    • 2017-10-02
    • 2011-04-16
    • 2015-07-13
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多