ymm
和xmm
个注册表之间有什么区别?
我认为ymm
用于SSE,vmovups ymm1, [r9]
vcvtss2si rcx, ymm1
用于AVX,但我写了一些代码:
error: invalid combination of opcode and operands
它给了我:
vcvtss2si rcx, ymm1
关于这条线:
vcvtss2si rcx, xmm1
所以我写道:
ymm1
它按预期工作。转换为整数的rcx
向量的第一个值现在位于ymm1
。
这是什么一回事? xmm1
和driver.get(url)
driver.execute_script("window.scrollTo(0, 60000)")
images = WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "shared-components-ShopSearchResultsGridImage-ShopSearchResultsGridImage__primary--3pEtg")))
im_links = [im.get_attribute('src') for im in images]
是相同的寄存器吗?
答案 0 :(得分:5)
xmm0
是ymm0
的低半部分,与eax
完全相同,是rax
的低半部分。
写入xmm0
(使用VEX编码指令,而不是传统SSE)将ymm0
,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, xmm2
或vaddps ymm0, ymm1, ymm2
。 (大多数整数指令的256位版本仅在AVX2中可用,AVX仅提供128位版本。有一些例外,例如AVX1中的vptest ymm, ymm
。如果算上vmovdqu
那是一个"整数"指令)。
vmovd
,vcvtss2si
和vcvtsi2ss
等标量指令仅适用于XMM寄存器。读取YMM寄存器在逻辑上与读取XMM寄存器不同,但写低位元素(并且其他元素未经修改,如设计不佳的vcvtsi2ss
那样)会有所不同。 XMM与YMM,因为YMM版本会使上部车道不归零。
但是在机器码编码中不存在使用ymm的标量,即使是像vpinsrd
/ vpextrd
那样非常有用的指令(插入/提取标量) )。强>
请注意,即使读取XMM寄存器并仅采用低标量元素在逻辑上与YMM相同,但对于实际实现,它不是相同的。读取YMM寄存器意味着AVX-256指令,它必须将CPU从“保存的上部”转换出来。状态(对于具有SSE / AVX转换/状态的Intel CPU)。
在任何情况下,vcvtss2si rax, ymm0
都不可编码,并且汇编程序不会将其神奇地组装为vcvtss2si rax, xmm0
。如果你在asm写作,你应该确切地知道你正在做什么。 (虽然有些汇编程序会为你优化mov rax, 1
到mov eax, 1
,但是让你放弃编写ymm
作为源寄存器会起作用。但是让你写ymm
作为vcvtsi2ss
的目标寄存器会改变其含义,因此为了保持一致性,它不会做任何事情。
答案 1 :(得分:4)