【发布时间】:2021-04-15 15:10:20
【问题描述】:
假设我有一个由 8 字节 元素组成的数组,该数组从内存中传递给我的汇编函数,长度为 未知长度。我想对其进行一些 128 位 SIMD 操作(最高 SSE4)。内存最好是 16 字节对齐的。所以我会检查数组是否对齐,然后根据使用 movaps 或 movups。
我知道您可以检查 16 字节对齐方式:
test dil, 0xf ; rdi stores address of array
如果它不是 16 字节对齐的,那么检查它是否是 8 字节对齐是否很好或有用,这意味着它是 8 的奇数倍?
test dil, 0x7 ; ZF=1 here after rdi&0xf !=0 implies rdi%16 == 8
如果这是真的,那么我应该对数组的第一个元素执行额外的步骤,然后 movaps 来加载数组元素吗?否则我应该只使用像 movups 这样的未对齐操作吗?
这样可以吗?
【问题讨论】:
-
你一次问了很多问题。通常,每个 Stack Overflow 问题都应该问一个问题。也就是说,是的,值得一开始就确保对齐。也就是说,要检查 8 字节对齐,请使用
test rdi, 0x7而不是0x8。 -
@fuz:根据文本,我认为他们实际上想要检查 8 的奇数倍,即距离 16 字节对齐的 1 个元素。
test dil, 8仅在您与test dil, 0x7建立 8 字节对齐后才有效,所以是的,在发现它不是 16 的倍数后,它就被打破了。ptr & 8可能适用于从对齐边界偏移 15 个字节的指针,而不是 8 个。经过编辑以修复问题中的代码,因此答案可以在不分散注意力的情况下谈论问题的真正意义。 -
如果你有一个 pre-Nehalem Intel CPU,你不应该使用
movups,因为将负载分成上半部分和下半部分实际上更便宜(使用movhps/movlps/movsd)。您期望不是 8 字节对齐的内存的可能性有多大?您的数组长度通常是什么数量级? ( -
@chtz 用于学校项目,未指定非 8 字节对齐的概率,但顺序肯定大于 100 字节
-
@trollinator 获得有关性能编程的好建议的最佳方法是解释操作的上下文是什么。这样,就有可能了解您尝试做什么以及您的限制是什么。通常,必须通过从不同的角度看待问题来解决性能问题。如果不提供上下文,您就否认了这种可能性,并且除了最一般的回答之外很难给出任何内容。
标签: assembly x86-64 sse simd memory-alignment