ASM x86_64 AVX:xmm寄存器和ymm寄存器的区别

15

xmm 寄存器和 ymm 寄存器有什么区别呢?我以为 xmm 是用于 SSE,ymm 用于 AVX,但我写了一些代码:

vmovups     ymm1, [r9]      
vcvtss2si   rcx, ymm1

并且它给了我:

error: invalid combination of opcode and operands

这是关于这条线:

vcvtss2si   rcx, ymm1

于是我写道:

vcvtss2si   rcx, xmm1

它按预期工作。将ymm1向量的第一个值转换为整数,现在在rcx中。

这是关于什么?ymm1xmm1是同一寄存器吗?


4
xmm1ymm1(以及其他索引)的主要区别在于前者长度为128位,而后者长度为256位。 - Leandro Caniglia
那么 xmm1ymm1 共享同一块内存吗? 如果我想使用仅使用前128位的指令,那么使用 xmm 还是 ymm 无所谓吗?或者每个仅使用前128位的指令都需要使用 xmm - SciArt
好的,所以我正在从内存中复制256位的数据: vmovups ymm1, [r9] 然后我将xmm1的第一个元素(而不是ymm1)进行转换,并将其保存在rcx中: vcvtss2si rcx, xmm1 为什么rcx中会有ymm1的第一个值?它不应该是来自xmm1的“随机”数字吗? 如果xmm1ymm1是独立的寄存器,为什么ymm1的第一个元素和xmm1的第一个元素相同? - SciArt
我在维基百科上找到了一个相当简单的图表: 链接。 如果我理解正确,YMM和XMM是重叠的,而XMM包含在YMM中。对吗? - SciArt
2
谢谢您提供的链接。我现在明白了,我错了。您是对的,这两个寄存器的低128位是相同的。请忽略我的以前的评论。 - Leandro Caniglia
2
@LeandroCaniglia:你可以(而且应该)删除你的错误评论。xmm0ymm0的低半部分,就像eaxrax的低半部分一样。(同时,写入xmm0会将ymm0的上半部分清零) - Peter Cordes
2个回答

24

xmm0ymm0 的低半部分,就像 eaxrax 的低半部分一样。

使用 VEX 编码指令(如 vaddps xmm,而不是传统的 SSE addps xmm)写入 xmm0 会将 ymm0 的上半部分清零,就像写入 eax 会将 rax 的上半部分清零以避免错误依赖。对于传统的 SSE 指令未清零上半部分的情况,这就是为什么 混合使用 AVX 和传统 SSE 指令会有惩罚 的原因。

大多数AVX指令都有128位或256位大小可用。例如:vaddps xmm0,xmm1,xmm2vaddps ymm0,ymm1,ymm2。(大多数整数指令的256位版本仅在AVX2中提供,而AVX仅提供128位版本。有一些例外,如AVX1中的vptest ymm,ymmvmovdqu(如果您将其视为“整数”指令))。

vmovdvcvtss2sivcvtsi2ss这样的标量指令仅适用于XMM寄存器。读取YMM寄存器在逻辑上与读取XMM寄存器没有区别,但是对于XMM与YMM的写入低元素(并保留其他元素不变,就像设计不良的vcvtsi2ss所做的那样)会有所不同,因为YMM版本会使上部通道未清零。


但是在机器码编码中,即使对于那些真正有用的指令(例如vpinsrd/vpextrd,即插入/提取一个标量),也不存在带有ymm的标量。

请注意,即使从逻辑上讲,读取XMM寄存器并只取低位标量元素与YMM相同,但实际实现中它们是不同的。读取YMM寄存器意味着使用AVX-256指令,这将导致CPU从“保存的上部”状态转换出来(对于具有SSE/AVX过渡/状态的Intel CPU)。

无论如何,vcvtss2si rax, ymm0是不可编码的,汇编器也不会自动将其组装为vcvtss2si rax, xmm0。如果你在写汇编代码,那么你应该清楚自己在做什么。(虽然有些汇编器会将mov rax, 1优化为mov eax, 1,因此让你使用ymm作为源寄存器可能会起作用。但是,让你将ymm作为vcvtsi2ss的目标寄存器写入会改变含义,因此为了一致性最好两者都不要这样做)。

10
根据wikipedia,在AVX中: YMM寄存器的长度为256位XMM寄存器的长度为128位,并且代表YMM寄存器的低128位YMMXMM寄存器重叠,XMM包含在YMM中。
来自wikimedia的图表:

https://commons.wikimedia.org/wiki/File:AVX_registers.svg


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