当前位置: 首页 > 知识库问答 >
问题:

有效地将CPU寄存器中的所有位设置为1

施彦
2023-03-14

要清除所有位,您通常会在XOR eax、eax中看到一个独占或。反面也有这样的把戏吗?

我所能想到的就是用一个额外的指令来反转零。

共有1个答案

龚振濂
2023-03-14

对于大多数具有固定宽度指令的体系结构来说,答案可能是一条枯燥的指令mov,即符号扩展或反转的直接指令,或mov LO/High对。例如,在ARM上,MVN r0,#0(move-not)。请参见Godbolt编译器资源管理器中x86、ARM、ARM64和MIPS的gcc asm输出。IDK关于zseries asm或机器代码的任何内容。

在ARM中,EOR r0,r0,r0明显比MOV-immediate差。它取决于旧值,没有特殊情况处理。内存依赖项排序规则防止ARM uarch对其进行特殊大小写,即使他们想这样做。对于大多数具有弱有序内存的RISC ISA来说也是如此,但是对于memory_order_consume(在C++11术语中)不需要设置障碍。

x86异或归零是特殊的,因为它的可变长指令集。从历史上看,8086XOR ax,ax是快速的,因为它很小。自从这个习语被广泛使用(而且归零比全零更常见),CPU设计者给予了它特殊的支持,现在在Intel SandyBridge系列和其他一些CPU上,XOR eax、eaxMOV eax、0更快,即使不考虑直接和间接的代码大小影响。看看在x86汇编中将寄存器设置为零的最佳方法是什么:异或、mov还是AND?对于我所能挖掘到的最多的微架构的好处。

如果x86有一个固定宽度的指令集,我想知道movreg,0是否会像XOR归零一样得到更多的特殊处理?也许,因为在编写low8或low16之前打破依赖关系很重要。

最佳性能的标准选项:

  • MOV eax,-1:5字节,使用MOV r32,IMM32编码。(不幸的是,没有扩展MOV r32、IMM8)的符号。在所有CPU上都有出色的性能。r8-r15(REX前缀)为6字节。
  • MOV rax,-1:7字节,使用MOV R/M64,sign-extended-imm32编码。(不是EAX版本的rex.w=1版本,而是10字节的MOV r64,IMM64)。在所有CPU上都有出色的性能。

或eax,-1:3字节(RAX4字节),使用或R/m32,sign-extended-imm8编码。缺点:错误依赖于寄存器的旧值。

push-1/pop rax:3字节。很慢但很小。仅推荐用于开发/代码-高尔夫。适用于任何sign-extended-imm8,不像其他大多数sign-extended-imm8。

缺点:

    null

从32位值执行vbroadcastss可能严格来说比加载方法更好,但是很难让编译器生成它。

最好的方法可能取决于周围的代码。

将__m256值设置为所有一位的最快方法

在Skylake-AVX512上,对掩码寄存器进行操作的k指令只在单个端口上运行,即使是像kandw这样的简单端口也是如此。(还要注意,当管道中有任何512b操作时,Skylake-AVX512不会在port1上运行vector uops,因此执行单元吞吐量可能是一个真正的瓶颈。)

没有kmovk0,imm,只从整数或内存中移动。可能没有k指令将same,same检测为特殊的,所以在发出/重命名阶段的硬件不会在k寄存器中查找它。

 类似资料:
  • 2.1 通用 CPU 寄存器 CPU 的寄存器能够对少量的数据进行快速的存取访问。在 x86 指令集里,一个 CPU 有 八个通用寄存器:EAX, EDX, ECX, ESI, EDI, EBP, ESP 和 EBX。还有很多别的寄存器,遇 到的时候具体讲解。这八个通用寄存器各有不同的用途,了解它们的作用对于我们设计调试 器是至关重要的。让我们先简略的看一看每个寄存器和功能。最后我们将通过一个简单

  • 如何将值中的所有位设置为1?使用AVX或AVX2的本质? 而我似乎在AVX中找不到一个简单的按位非运算?如果这是可用的,我可以简单地使用setzero,后面跟着一个向量NOT。

  • 问题内容: 如何在SQL表中将所有0值都设置为NULL? 提前致谢。 问题答案:

  • 问题内容: 从我运行的实验来看,TensorFlow似乎在一台机器上自动使用了所有CPU。此外,TensorFlow似乎将所有CPU都称为/ cpu:0。 我是对的,只有一台机器的不同GPU被索引并被视为单独的设备,而一台机器上的所有CPU却被视为单个设备? 从TensorFlows角度来看,一台机器可以有多个CPU来查看它吗? 问题答案: 默认情况下,该进程可用的所有CPU都聚集在设备下。 mr

  • 基本上指令有8->16、8->32、8->64、16->32和16->64。 32->64的转换在哪里?我必须使用签名版本吗? 如果是的话,您如何使用完整的64位来表示无符号整数?

  • 我找到了如何配置的答案。我自己没有64位设备。我是否需要在64位上测试应用程序,以确保它正常运行? 如果不是,我如何判断哪些库不是以64位运行的。 我有4个文件夹: