【问题标题】:which size of struct member alignment in VC bring performance benefit?VC 中结构成员对齐的大小会带来性能优势吗?
【发布时间】:2011-03-16 12:53:49
【问题描述】:

VC 中的结构成员对齐是否会带来性能优势?如果这是使用它的最佳性能含义以及哪种尺寸最适合当前的 cpu 架构(x86_64、SSE2+、..)

【问题讨论】:

    标签: c++ visual-studio compiler-construction cpu alignment


    【解决方案1】:

    编译器使用的默认对齐方式应适用于一般数据的目标平台(32 位或 64 位 Intel/AMD)。要利用 SIMD,您可能必须对这些数组使用更严格的对齐方式,但这通常使用 #pragma 或仅适用于您将在 SIMD 指令中使用的数据的特殊数据类型。

    【讨论】:

    • 哪种对齐尺寸最适合使用 SIMD 指令?
    • 16。 __declspec( align( 16 ) ),或者直接使用__m128i。
    【解决方案2】:

    当成员跨越高速缓存行边界时,性能在 x86 和 x64 内核上急剧下降。常见的编译器默认为 8 字节打包,确保您可以处理 long long、double 和 64 位指针成员。

    SSE2 指令需要 16 位对齐,如果关闭,代码会爆炸。您无法从打包杂注中得到它,例如堆分配器将仅提供 8 字节对齐保证。找出您的编译器和 CRT 支持什么。像 __declspec(align(16)) 和像 _aligned_malloc() 这样的自定义分配器。或者过度分配内存并自己调整指针。

    【讨论】:

    • 这不仅仅是跨越缓存线边界。如果您的 32 位 int 未与 4 字节边界对齐,那么即使它在高速缓存行内,仍然会有性能命中。编译器通常填充元素以从其大小的倍数开始(最多 8 个字节)。这并不是说它将所有内容填充到 8 字节边界。使用编译器的默认打包,内置类型将始终适当对齐。如果你有一个结构数组,一些数组元素可能会跨越缓存线边界,但没有一个单独的成员会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2011-11-06
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多