gpt4 book ai didi

assembly - ASM x86_64 AVX : xmm and ymm registers differences

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

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是相同的寄存器吗?

最佳答案

xmm0ymm0的下半部分,一模一样eaxrax的下半部分.

写信给 xmm0 (使用 VEX 编码指令,而不是传统 SSE)将 ymm0 的上 channel 归零, just like writing to eax zeros the upper half of rax to avoid false dependencies .缺少将旧 SSE 指令的高位字节归零是为什么有 penalty for mixing AVX and legacy SSE instructions 的原因.

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

标量指令,如 vmovd , vcvtss2si , 和 vcvtsi2ss仅适用于 XMM 寄存器。读取 YMM 寄存器与读取 XMM 寄存器在逻辑上没有区别,但是对于 XMM 与 YMM 而言,写入低元素(并保持其他元素不变,就像设计不佳的 vcvtsi2ss 所做的那样)会有所不同,因为 YMM 版本会使上车道不归零。

但是机器代码编码中不存在带有 ymm 的标量,即使对于像 vpinsrd 这样真正有用的指令也是如此。/vpextrd (插入/提取标量)。

请注意,即使读取 XMM 寄存器并仅获取低标量元素在逻辑上与 YMM 相同,但对于实际实现,它不会相同。读取 YMM 寄存器意味着一条 AVX-256 指令,该指令必须将 CPU 转换出“已保存的上限”状态(对于具有 SSE/AVX 转换/状态的 Intel CPU)。

无论如何,vcvtss2si rax, ymm0不可编码,并且汇编器不会神奇地将其组装为 vcvtss2si rax, xmm0 .如果你用 asm 编写,你应该清楚地知道你在做什么。 (虽然一些汇编器会为你优化 mov rax, 1mov eax, 1,所以让你把 ymm 写成源寄存器是可行的。但是让你写 ymm 作为 vcvtsi2ss 的目标寄存器会改变意思,所以为了一致性,最好不要这样做)。

关于assembly - ASM x86_64 AVX : xmm and ymm registers differences,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48139513/

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