我试图比较Peter Cordes在回答“将CPU寄存器中的所有位设置为1”的问题时提到的方法。
因此,我编写了一个基准测试,将所有13个寄存器设置为除e/rsp
、e/rbp
和e/rcx
之外的所有位1。
代码如下所示<代码>乘以32 nop用于避免DSB和LSD影响。
mov ecx, 100000000
Align 32
.test3:
times 32 nop
mov rax,-1
mov rbx,-1
;mov ecx,-1
mov rdx,-1
mov rdi,-1
mov rsi,-1
mov r8,-1
mov r9,-1
mov r10,-1
mov r11,-1
mov r12,-1
mov r13,-1
mov r14,-1
mov r15,-1
dec ecx
jge .test3
jmp .out
我测试了他提到的以下方法,以及这里的完整代码
mov e/rax, -1
xor eax, eax
dec e/rax
xor ecx, ecx
lea e/rax, [rcx-1]
or e/rax, -1
为了使这个问题更简洁,我将使用group1a(g1a)
替换下表中的mov-eax,-1
。
下表显示,从组1到组3,当使用64位寄存器时,每个循环多1个周期。
交付的IDQ\u UOPS\u NOT\u也增加,这可能解释了周期数的增加。但这能解释每个循环多1个周期的确切原因吗?
此外,g2a和g2b的端口分布不同,不像g1a和g1b(g1a和g1b端口分布相同),或者g3a和g3b。
如果我注释乘以32 nop
,这种现象就会消失。它与MITE有关吗?
环境:intel i7-10700、ubuntu 20.04和NASM 2.14.02。
用英语解释这个问题对我来说有点难。如果描述不清楚,请发表评论。
所有示例中的瓶颈都是前置的。
我用我的模拟器uiCA分析了你的例子(https://uica.uops.info/, https://github.com/andreas-abel/uiCA). 它预测了以下吞吐量,这些吞吐量与您的测量值非常匹配:
基本上指令有8->16、8->32、8->64、16->32和16->64。 32->64的转换在哪里?我必须使用签名版本吗? 如果是的话,您如何使用完整的64位来表示无符号整数?
问题内容: 我已经使用Java一段时间了,而我典型的设置新开发机的习惯要求从Oracle站点下载并安装最新的JDK。 今天这引发了一个不寻常的问题, 回想起来,我已经安装了之前的两个版本,并且很高兴将普通的工具链插入(Eclipse)。在我的日常编程中,我不会回想起曾经因为使用64位JRE(或为此目的而针对64位JRE)而不得不以其他方式进行更改或思考的事情。 根据我对64位和32位的理解- 确实
问题内容: 我的电脑正在使用Windows 7 64位。但是将要部署我的jsp Web应用程序的服务器是32位。 我需要在PC上安装32位JDK / JRE才能进行开发吗?我正在使用Eclipse。 非常感谢你。 问题答案: 您绝对不需要安装32位JRE即可进行开发。您构建的Java代码不会跟踪您的64位。(我假设您没有使用JNI,这会使事情变得有些复杂。) 不过,您 可能 需要安装32位JRE进
问题内容: 我想知道x86和x64中的64位长吗? 问题答案: 是。Java 在任何JVM上都是64位,无一例外。所有Java原语类型都是完全可移植的,并且在所有实现中都具有固定的大小。
问题内容: 我正在创建一个非常简单的应用程序,该应用程序可以读取和显示文本文件并进行搜索。 我问自己是否有兴趣向用户提出32位和64位版本。 区别仅在于使用64位版本访问更多的内存堆大小,还是还有其他兴趣? 32位编译程序是否可以在64位JVM上运行(我认为是) 问题答案: 任何 程序的32位和64位版本之间的唯一区别是机器字的大小,可寻址内存的数量以及所使用的操作系统ABI。对于Java,语言规
问题内容: 在Java中,是否保证int始终为32位,而长为64位,而不管体系结构是32位还是64位? 问题答案: Java是平台无关的。所以是32位,并且是64位的。