有效地将 YMM 寄存器的低 64 位设置为常数
Posted
技术标签:
【中文标题】有效地将 YMM 寄存器的低 64 位设置为常数【英文标题】:Efficiently Set Lowest 64 Bits of YMM Register to Constant 【发布时间】:2012-03-03 12:35:57 【问题描述】:如何在最少的时钟周期内将 YMM 寄存器的最低 64 位设置为某个常数?我知道可以使用 SSE 指令以及 AVX 指令VBROADCASTSD
执行此操作的各种方法,但我不确定哪种方法会产生最佳结果。
编辑:设置64位部分后我仍然需要使用完整的YMM寄存器。
感谢您的帮助!
【问题讨论】:
取决于设置低64位后是使用完整的YMM寄存器还是只使用XMM部分。 抱歉有歧义 -- 设置低 64 位后需要使用完整的 YMM 寄存器。 这也取决于常数。有些常量值可以很容易地生成,有些则必须从内存中加载) 这绝对是真的。这么一个看似简单的问题,却需要大量的规范!我尝试加载的常量没有容易重现的模式(至少通过使用少量的按位、算术、广播或置换操作)。 【参考方案1】:如果只需要设置最低64位,其他YMM位无所谓,使用VMOVQ
。
如果需要保留 YMM 寄存器中的其他位,最有效的方法是使用VBLENDPD
。或者,您可以使用 VANDPD
清除最低 64 位,然后使用 VORPD
加载常量。
AVX2 允许使用其他替代方法:VPMASKMOVD
或 VPBLENDD
(但尚未得到任何处理器的支持)。
【讨论】:
谢谢,这正是我想要的! 我也可以建议使用 VBLENDPD(Sandy Bridge 上的延迟 1)而不是 VANDPD+VORPD。 @NorbertP。 VBLENDPD 肯定更好。谢谢。以上是关于有效地将 YMM 寄存器的低 64 位设置为常数的主要内容,如果未能解决你的问题,请参考以下文章
测试 256 位 YMM AVX 寄存器为零的最有效/惯用方法
测试 256 位 YMM AVX 寄存器元素是不是等于或小于零的最有效方法
有没有更有效的方法将 4 个连续的双精度广播到 4 个 YMM 寄存器中?