5

我的问题由两部分组成。

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

这是太阳中的一个错误,是否有补丁或者我需要自己编写一个 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的幂。

他们是更好的方法吗?

编辑1

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

编辑2

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

4

2 回答 2

4

in their code they use memalign(CACHE_LINE_SIZE,sizeof(CLHLockStruct)), and i have changed it to _aligned_malloc , my problem is that sizeof(CLHLockStruct) is not a power of 2,

Did you change it to _aligned_malloc(CACHE_LINE_SIZE,sizeof(CLHLockStruct))? Yes, that would cause this. _aligned_malloc expects the size as its first argument, and the alignment as the second, the opposite of memalign, so you need to swap the arguments. The size does not need to be a power of two.

于 2012-08-08T07:18:17.567 回答
1

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

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

答案 3:我(更好:谷歌)找到了另一篇文章,解释了将结构填充为 2 的幂的倍数

于 2012-08-08T06:54:39.230 回答