内存对齐 - Sparc(Sun) cc 编译器、Intel(Linux) g++ 编译器、Intel(Windows)



我的问题由两部分组成。

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

这是阳光下的虫子,有补丁还是我需要自己写一个记忆器。

  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 的幂。

他们的方法更好吗?

编辑1

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

编辑2

有没有一个函数的作用类似于 _aligned_malloc 和 malloc :返回一个与block_size的倍数对齐的内存指针,但不要求字节是 2 的幂?

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

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

答案 1:POSIX 标准将忆性定义为返回 2 的幂系统指针大小的倍数。但它也要求块大小参数是 2 的幂。您的代码是这种情况吗?在这种情况下,也可能是您的 Win 库不完全符合 POSIX。

答案 2:这篇 SO 帖子列出了几种确定 2 的下一个幂的方法,您可以在aligned_malloc实现中使用。

答案 3:我(更好的是:谷歌)找到了另一篇解释将结构填充到 2 次幂的倍数的帖子。

最新更新