将内存对齐到16字节和32字节边界

4

我正在使用SIMD指令(SSE和AVX)执行多个操作。据我所知,SSE指令最适合16字节对齐的内存,而AVX指令最适合32字节对齐的内存。

为了最大限度地发挥SSE和AVX的优势,总是分配32字节边界对齐的内存是否安全?

是否存在32字节对齐的内存不同时也是16字节对齐的情况?

1个回答

4

在哪些情况下,32字节对齐的内存不会同时也是16字节对齐的?

对齐只意味着地址是32的倍数。任何32的倍数也都是16的倍数。

“对齐”一词的第一个谷歌搜索结果是维基百科,您可以访问https://en.wikipedia.org/wiki/Data_structure_alignment#Definitions查看详细解释。


@jbapple:关于你的编辑。我故意这样粗鲁,是为了阻止更多这种琐碎的问题。接下来呢?100是10的倍数吗?我也不希望有人点赞这个答案,这样问题就可以被删除了。我知道我可以回滚你的编辑,但我会克制自己,以示礼貌。 - Peter Cordes
Peter,我不感兴趣在这个答案的评论区与你进行辩论,关于是否可以故意对那些不知道计算机内存“对齐”含义的人表现出所谓的“粗鲁”。 - jbapple
我是不是唯一一个认为,“当然不是。”并不粗鲁的人? - Mysticial
在 macOS 中,编译器会将任何数组对齐到 16 字节。GCC 在 64 位系统上也这样做吗?MSVC 呢? - Royi
@Royi:在x86-64上,gcc对于变长自动数组(在堆栈上)使用16B对齐,否则不一定(至少对于小数组而言)。我不确定静态数组是否也是如此。如果对齐很重要,您应该使用C++11的alignas(16)或C11的_Alignas(16),这样您就不必依赖特定的编译器行为。 - Peter Cordes
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接