gpt4 book ai didi

x86 - AVX2 中的 channel 内交叉 64 位元素数据移动

转载 作者:行者123 更新时间:2023-12-01 12:05:37 28 4
gpt4 key购买 nike

是否有任何寄存器到寄存器1 AVX 或 AVX2 指令以任何方式 中的 128 位 channel 的 64 位一半之间移动数据ymm regs,在当代 Intel2 上不使用端口 5?


1 这种东西有点存在于内存源中,以DQ<的形式存在广播指令。

2 Haswell 通过 Skylake-S(尽管如果在 SKX 中实现的 AVX-512 中存在任何内容,则值得一提)。

最佳答案

我认为在 1 条 reg-reg 指令中是不可能的,但是存储/重新加载可以在没有端口 5 的情况下在 channel 内移动数据。即使像 dppdvcvtps2pd 这样时髦的东西也需要端口 5 shuffle。所有寄存器源洗牌指令都在 Haswell 及更高版本的端口 5 上运行(直到 Ice Lake 在另一个端口上添加第二个洗牌单元可以进行一些洗牌)。

显然,未对齐的重新加载可以进行任何字节移位,但这会导致存储转发停顿,并且您必须屏蔽不需要的数据。

vmovddup x/y/zmm, [mem]完全在加载端口上运行,与 vbroadcastsd 完全相同。 这是低 qword 的 channel 内广播。 vmovsldupvmovshdup也只需要一个加载端口,但不满足您在 64 位半 channel 之间移动的要求。

没有 movhdup 在每个 channel 中复制 high 一半,只有 movddup 复制低 double FP 元素。 xmm 为 SSE3,ymm 为 AVX1。


正如@harold 指出的那样,phminposuw可以把数据从高64位放到低64位。但它在 YMM 版本中不可用。它可能是唯一具有专用执行单元的指令,可以在随机播放之外执行此操作。 psadbw 在 64 位元素中工作。 vdbpsadbw 是 SKX 上 p5 的 1 uop。 mpsadbw 是多 uop,包括 2p5。 phadd 指令也是 2p5。


Zen 2 的 vpshufd ymm 吞吐量为 0.5c ( instlat )。它在处理粒度小于 128 位的 channel 交叉洗牌时比英特尔慢,但在 channel 内洗牌和 128 位洗牌(如 vperm2f128)上表现良好。

关于x86 - AVX2 中的 channel 内交叉 64 位元素数据移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57504396/

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