gpt4 book ai didi

assembly - 使用 AVX2 添加双字和四字混合的最快方法?

转载 作者:行者123 更新时间:2023-12-03 16:25:08 25 4
gpt4 key购买 nike

我正在编写生成针对 Haswell 的高度优化的机器代码的代码(因此它具有 AVX2 指令),并且我正在尝试找出将预定数量的四字和双字相加的最有效方法。因此,例如,我可能有这样的结构:

  0-8: QWORD a
8-16: QWORD b
16-20: DWORD c
20-28: QWORD d
28-36: QWORD e
36-40: DWORD f
40-48: QWORD g
48-56: QWORD h
56-64: QWORD i

我想将其添加到具有相同布局的另一个结构中,例如 a(final) = a(first) + a(second),b(final) = b(first) + b(second),等。我一直在查看 VPADDUSD 和 VPADDUSQ 指令,但显然它们在所有情况下都不起作用。 VPADDUSD 添加超过 (2^32)-1 的 QWORD 失败。如果 QWORD 不是 8 字节对齐的,则 VPADDUSQ 失败。我对溢出导致生成错误数据没有意见。我会考虑一个错误预测的分支花费 15 个稳定的周期。对于通常不大于 2^31 的数字进行优化是可以接受的。想法?

最佳答案

将结构加载到 ymm 寄存器中。置换双字,使每个双字零扩展成一个四字,并且每个四字都在一个四字边界上。然后做一个qword添加。最后,撤消排列以取回结构填充。丢弃双字字段的高 32 位。

例如,对于您的结构,您可以执行以下一系列操作:

从结构的偏移量 0 加载一个 256 位值到 ymm0。寄存器现在应该包含以下双字:

  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
al ah bl bh cx dl dh el eh fx gl gh hl hh il ih

现在使用 vpermilps 置换寄存器,使其包含以下值:

  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
al ah bl bh cx xx dl dh fx xx gl gh hl hh il ih

之后,您可以应用掩码,使 xx 条目为零。或者您可以忽略它们,因为它们的值并不重要。

请注意,el 和 eh 已从结构中消失,我们需要在单独的步骤中手动添加它们。我们消除了 el 和 eh 而不是 il 和 ih,因为我们不能在两个 128 位 channel 之间进行置换。注意两个双字(c 和 f)是如何被零扩展到 64 位的。您现在可以使用此排列添加两个寄存器,并应用适当的排列将它们打包回原来的样子。


如果您可以更改字段的顺序,这就容易多了:只需重新排列它们,使所有 qword 都在前面,然后是所有 dword。现在,您只需一步添加所有 qword,然后添加所有 dword,无需任何改组。

关于assembly - 使用 AVX2 添加双字和四字混合的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42169681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com