【问题标题】:memory alignment - Sparc(Sun) cc compiler, Intel(Linux) g++ compiler, Intel(Windows) MVSC compiler内存对齐 - Sparc(Sun) cc 编译器、Intel(Linux) g++ 编译器、Intel(Windows) MVSC 编译器
【发布时间】:2012-08-05 05:08:44
【问题描述】:

我的问题由两部分组成。

  1. 我注意到带有 cc 编译器的 sparc(sun) 上的 memalign(block_size,bytes) 不会检查字节是 2 的幂,而英特尔 Linux 上的 memalign 和带有 mvsc 编译器的 Windows 上的 _aligned_malloc 会检查字节是 2 的幂。

这是sun中的一个错误,是否有补丁或者我需要自己编写一个memalign。

  1. 另外我有一个结构(不是我的代码):

    typedef struct CLHLockStruct {
        volatile CLHLockNode CACHE_ALIGN *Tail ;
        volatile CLHLockNode CACHE_ALIGN *MyNode[N_THREADS] ;
        volatile CLHLockNode CACHE_ALIGN *MyPred[N_THREADS] ;
    } CLHLockStruct;
    

我在 MVSC (visual studio 2008) 下编译:

    CACHE_LINE_SIZE = 64
    CACHE_ALIGN = __declspec(align(CACHE_LINE_SIZE)) 
    N_THREADS = 8
    sizeof(CLHLockStruct)=192

代码最初是为 sparc 架构编写的,我尝试将其迁移到 MVSC 而不更改太多代码。

在他们的代码中,他们使用 memalign(CACHE_LINE_SIZE,sizeof(CLHLockStruct)),我已将其更改为 _aligned_malloc,我的问题是 sizeof(CLHLockStruct) 不是 2 的幂,我可能会编写一些函数来查找下一个是 2 的幂的数字。

他们是更好的方法吗?

EDIT1

我如何填充这个结构,使其大小成为 2 的幂?

EDIT2

是否有类似 _aligned_malloc 和 malloc 的函数:返回与 block_size 的倍数对齐但不要求字节为 2 的幂的内存指针?

【问题讨论】:

  • cc 是 linux 上的符号链接。什么是编译器,哪个版本?
  • 对不起,我有一个小错误,linux上的编译器是g++(gcc版本4.4.3)我已经编辑了标题并添加了一个标签

标签: c++ algorithm architecture g++ memory-alignment


【解决方案1】:

答案 1:POSIX standard defines memalign 返回 2 的幂系统指针大小的倍数。但它也要求 blocksize 参数是 2 的幂。你的代码是这样的吗?也可能是您的 Win 库在这种情况下不完全符合 POSIX。

答案 2:This SO post 列出了几种确定下一个 2 次幂的方法,您可以在对齐的 malloc 实现中使用这些方法。

答案 3:我(最好是 Google)找到了另一篇解释 padding a struct to a multiple of a power of two 的帖子。

【讨论】:

  • 我会复习答案 2,3 ,这似乎与我非常相关,尽管我更喜欢一些 pragma 指令(如果有的话)。关于答案 1,这不是我的代码,而且似乎他们要求结构大小是 2 的幂,以便 memalign 可以工作,尽管最初此代码打算在 sparc 架构上,如果您检查结构的大小,它不是 2 的幂,似乎他们的代码中有一个错误,但是 sparc(sun) cc 编译器上 memalign 中的错误可能不会被贬低。
  • 当然,可能是这样。我只是想提示可能出了什么问题。 ;)
  • 我已经用另一个建议编辑了我的问题,你能回答吗?
【解决方案2】:

在他们的代码中,他们使用 memalign(CACHE_LINE_SIZE,sizeof(CLHLockStruct)),我已将其更改为 _aligned_malloc,我的问题是 sizeof(CLHLockStruct) 不是 2 的幂,

你改成_aligned_malloc(CACHE_LINE_SIZE,sizeof(CLHLockStruct))了吗?是的,这会导致这种情况。 _aligned_malloc 期望大小作为其第一个参数,对齐作为第二个参数,与 memalign 相反,因此您需要交换参数。大小不必是 2 的幂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-06
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多