- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以将 xmm 寄存器参数与 AVX 内在函数一起使用 (_mm256_**_**
)?
我的代码需要使用矢量整数运算(用于加载和存储数据)以及矢量浮点运算。整型代码用SSE2 intrinsics写,兼容老CPU, float 用AVX写,提高速度(也有SSE代码分支,不建议这样做)。
目前,除了使用编译器标志自动将所有 SSE 指令转换为 VEX 编码版本外,是否有任何方法使用内部函数(即无内联/外部汇编)强制在 XMM 寄存器上使用 VEX 编码指令?
注意:我尝试了 _mm256_castsi128_si256()
,这会生成带有 ymm 操作数的指令。
最佳答案
您有一个带有 AVX 的处理器。它没有 XMM 寄存器,只有 YMM 寄存器。如果您使用 AVX 支持编译所有代码(例如,使用 GCC 中的 -mavx 或 MSVC 中的/arch:AVX),那么您所有的 SSE2 代码都在 YMM 寄存器的低 128 位上运行。没有什么可担心的。
但是,假设您有两个不同的模块,一个是在支持 SSE2 的情况下编译的(例如,在 GCC 中使用 -msse2 或在 MSVC 中使用/arch:SSE2),另一个在支持 AVX 的情况下使用,并且您使用了两者的函数,那么您确实有一些东西当你在它们之间切换时担心。在这种情况下,当您从 AVX 代码切换到 SSE2 代码时,您应该调用 _mm256_zeroupper() 或 _mm256_zeroall()
,除非您想降低性能。 Using AVX CPU instructions: Poor performance without "/arch:AVX"
简单的解决方案是只编译所有支持 AVX 的代码。我能想到的编译具有不同指令集支持的不同模块的唯一原因是,如果您想制作一个 CPU 调度程序,以便您的代码可以在不同的处理器上运行。实现起来有点痛苦。但是你不做状态改变所以我能想到你唯一需要担心状态改变的时候是当你从一个共享库调用函数时,它是用另一个指令集编译的(例如,用 SSE2 编译的 DLL)。在这种情况下,您可能需要在从 AVX 代码调用库函数时调用 _mm256_zeroupper() 或 _mm256_zeroall()
。
关于intrinsics - 在 AVX 内在函数中使用 xmm 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20449379/
Intel x86 汇编中执行以下操作最有效的方法是什么(a、b 是 32 位 float ): 从 xmm1: [-, -, a, b] 到 xmm1: [a, a, b, b] 我找不到任何有用的
Intel x86 汇编中执行以下操作最有效的方法是什么(a、b 是 32 位 float ): 从 xmm1: [-, -, a, b] 到 xmm1: [a, a, b, b] 我找不到任何有用的
从 SIMD 寄存器加载和存储生成用途寄存器的最佳方式是什么?到目前为止,我一直使用堆栈作为临时的。例如, mov [rsp + 0x00], r8 mov [rsp + 0x08], r9 mov
我正在尝试实现一些内联汇编器(在 C/C++ 代码中)以利用 SSE。我想将值(从 XMM 寄存器或内存)复制并复制到另一个 XMM 寄存器。例如,假设我在内存中有一些值 {1, 2, 3, 4}。我
在多核 CPU 中,每个核是否都可以访问自己的 XMM 寄存器组?例如,如果一个芯片被列为具有 16 个 XMM 寄存器 (XMM0-XMM15),那么每个内核 16 个寄存器还是 16 个共享? 我
我发现很难在 Visual Studio 的寄存器窗口中解释 xmm 寄存器的值。窗口显示以下内容: XMM0 = 00000000000000004018000000000000 XMM1 = 00
pushf //couldnt store this in other registers movd xmm0,eax//storing in xmm registers
我正在使用 AES-NI在内核代码中。 AES 新指令使用 XMM 寄存器,我想确保从用户模式到内核模式的转换以及返回到用户模式的转换将保留 XMM 寄存器的状态。 MSDN link读到: In 6
有没有办法将压缩双字整数从 XMM 寄存器推送到堆栈?然后在需要时将其弹出? 理想情况下,我正在为通用寄存器寻找 PUSH 或 POP 之类的东西,我已经检查过英特尔手册,但我要么错过了命令,要么没有
是将值移动到 xmm 寄存器的唯一方法,首先将值移动到整数寄存器中,不知道它们叫什么,然后进入 xmm 寄存器,例如 mov [eax], (float)1000 ; store to mem
如何仅访问 128 位 xmm 寄存器的特定部分(字节)?我必须在整个空间上循环(按字节),逐字节比较并在明确定义的条件下复制它*。 因此,我必须将这个 16 字节寄存器的每个字节与 \0 进行比较,
我在xmm1寄存器加载了一些内容,假设它可以被视为 xmm1 = | bgra | bgra | bgra | bgra | (each one a dw) 现在,我想将每个双字逻辑右移 1 个字节,
我正在尝试使用 XMM 寄存器使用 SSE2 指令将 4 个数字添加到其他 4 个汇编语言中的数字。我确实成功了,但是我遇到了一些我不明白的事情。如果我以这种方式添加: movdqu xmm0, ow
我想知道,有没有办法增加 xmm 寄存器中的值,或者只能将一个值移到一个寄存器中? 我的意思是,你可以这样做: inc eax 或者像这样: inc [ebp+7F00F000] 有没有办法对 xmm
我需要能够采用 4 个压缩整数,并使用“或”运算将它们(一个在另一个之上)折叠成一个组合整数。 最有效的方法是什么?请注意,打包整数中的 1 永远不会有公共(public)位置,因此我认为无符号“ad
我正在尝试使用 XMM 寄存器使用 SSE2 指令将 4 个数字添加到其他 4 个汇编语言中的数字。我确实成功了,但是我遇到了一些我不明白的事情。如果我以这种方式添加: movdqu xmm0, ow
使用 nasm 在 x86 汇编中编程... 使用 MOVQ 指令,我将 m64 设置为 xmm MOVQ xmm1, qword [mymem64] 现在我想将它与零进行比较,以便我可以使用 Jcc
给定一个 128 位 xmm包含两个四字(即两个 64 位整数)的寄存器: ╭──────────────────┬──────────────────╮ xmm0 │ ffeeddccbb
我正在开发一个涉及 SSE 内在函数和 XMM 寄存器的项目,并且我想使用提供的所有 16 个寄存器。我试图明确告诉编译器执行此操作,但它似乎不起作用。例如,我可能会写这样一行: register _
我正在尝试使用 GCC 风格的内联汇编将 xmm 寄存器推送到 x86_64 C 代码中的堆栈上。我查看了this的答案问题并正在使用此代码 int main(void) { asm vola
我是一名优秀的程序员,十分优秀!