在一次采访中,有人问我是否知道x64指令的行为因所使用的CPU而异,我无法在任何地方找到任何文档,有谁知道这些指令是什么以及为什么会这样?
英特尔和AMD有很多不同之处
https://en.wikipedia.org/wiki/X86-64#Differences_between_AMD64_and_Intel_64
有些会留下寄存器或一些具有未定义值的标志。英特尔和 AMD 可能有所不同。
在某些情况下,对于这些未定义的情况,真实硬件的实际行为保留了一些依赖它的旧软件的向后兼容性。例如,输入=0的BSF
设置ZF并保持目标寄存器不变。(在当前的英特尔和AMD硬件上。IDK如果任何旧的英特尔硬件有所不同,如果没有,bsf
/bsr
实际上并不是执行方式不同的指令的示例,只是缺乏面向未来的文档保证。)
但不同之处在于,英特尔将其记录为在目标寄存器中留下“未定义”的内容。AMD的手册明确记录并保证AMD CPU在这种情况下不会修改目标。
AMD的< code > bsr /< code > BSF 的AMD64手册(2017年3月):< br >如果第二个操作数包含0,则指令将ZF设置为1,并且不改变目标寄存器的内容
因此,理论上不能保证将tzcnt/implementationstd::countr_zero
模拟为mov eax,32
/
是安全的,即使这在实践中有效,并且可能会在未来的CPU上继续工作。(这就是为什么
bsf
/
bsr
具有输出依赖性的原因。)英特尔可能最终会记录这种行为,在这种情况下,编译器将能够在没有BMI1的情况下使用它来实现更高效的
如果性能差异算的话,有很多(请参阅x86标签wiki中的链接)!
您不只是在谈论不受支持的指令,对吗?就像 LAHF/SAHF 在一些非常早期的 x86-64 CPU 上不受长模式支持一样?或者CMPXCHG16B在早期的K8上也不受支持。
最有趣的不支持指令的情况是,LZCNT在不支持它的CPU上解码为BSR,REP前缀被忽略。即使对于非零输入,它们也会返回相反的结果。(_lzcnt_u32(x)==31 bsr(x)
)。TZCNT在不支持它的CPU上类似地解码为(REP)BSF,但除了input=0之外,它们都做同样的事情。我之前没有提到这一点,因为以不同的方式运行相同的机器代码与以不同的方法运行相同的指令不是一回事,但听起来这正是您所要求的。
我们只谈论非特权指令吗?特权指令的行为可能有更多的不同。例如,英特尔和AMD在SYSRET中都有不同的错误,Linux必须解决这些错误,以避免恶意用户空间导致内核挂起。
另一种我不确定是否算数的情况:PREFETCHW在至少从Core2到Haswell的Intel CPU上作为NOP运行,但在AMD CPU(以及Broadwell以来的Intel)上作为实际预取运行。
因此,一些CPU将它作为NOP运行,一些CPU将其作为预取运行(因此无论如何都没有架构上可见的效果),除了在古代CPU上,它作为非法的insn出现故障。64位Windows8.1显然要求PREFETCHW可以无故障运行(这阻止了它在(一些?)64位奔腾CPUs)。
类别表 元表 meta和cats表公共是c_id meta表cats c_id(1)meta表有2(Abhijit1,Abhijit2)行和m_id(1,2) 事务表 交易和元表通用的是m_id交易m_id 1有两行t_id(1,2)。此表主要用于支付金额和日期 我想为每个类别求和()所有成本(从元表)和金额(从事件表)。 表与 这是错的。猫的成本ID 1是300,但这里我有400 这里的总和(m
我们在一个基于Swing/Spring的大型应用程序中看到以下异常。该错误发生在用户交互过程中,触发Spring通过commons logging报告警告,后者反过来调用log4j。不幸的是,我无法将这个问题分解为一个独立的示例。 Windows XP SP3、log4j-1.2.17、commons-logging-1.1.1、spring-4.1.2上的Java 8u40 未使用OSGI、we
我有相同的图像和相同大小的画布,但是输出是不同的。我想要同样的输出,该怎么做呢?
有一个问题让我意识到,在某些正则表达式引擎中,量词的贪婪程度并不总是一样的。从这个问题中提取正则表达式并稍加修改: (我知道在这里是多余的,但我发现下面的行为非常有趣) 如果我们试图与之匹敌: 我希望第一个捕获组为空,因为是懒惰的,它会在遇到第一个时停止。这确实是发生在: PCRE Python 但不是Javascript,它匹配整个。(jsfiddle) 我环顾了一下其他一些语言,比如ruby、
问题内容: 我有这样的CSS声明: 这里的font1是嵌入式的eot / ttf字体,但问题是该字体比其他字体要小,所以我想为此字体(font1)使用不同的字体大小(1.8em)。所有其他字体(font2,font3)保持不变。 问题是,我无法验证用户的浏览器是使用font1,font2还是font3。是否有任何CSS声明允许不同家族使用不同的字体大小? 谢谢。 问题答案: 这里 是 一个办法做到
问题内容: 使用JMeter,我要检查仅允许1次更新的锁定部分 我正在运行具有10个线程的线程组,并且期望只有1个(并非总是第一个)线程返回0,而其他9个线程返回1如何断言呢? 线程组(10)-HTTP采样器– 断言 编辑 10实际上是一个动态属性。因此,我需要任何线程计数来期望只有1个断言才能返回成功。 该测试是为了检查记录锁定是否正常工作,即使在压力/负载测试中也只能更新一次记录。 编辑2 使