有人可以大致解释一下处理器\xe2\x80\x99s架构与其微架构之间的区别以及它们之间的关系吗?
\n一个应该与其功能部分相关,但另一个我没有看到
\n我一直在阅读有关x86内存模型如何工作以及屏障指令在x86上的意义,并与其他体系结构(例如ARMv8)进行比较。在x86和ARMv8架构中,内存模型都遵循(无双关),即传递性/累积性,即如果CPU 1看到CPU0的存储,而CPU2看到CPU1的存储,则只有在CPU1看到CPU0的存储时才会发生,然后CPU2还必须查看CPU0的存储。我指的示例是保罗·麦肯尼(Paul McKenney)著名论文6.1节中的示例1和2(尽管相关,但他最新的性能手册《http://www.puppetmastertrading.com/images/hwViewForSwHackers》中也存在同样的问题。 pdf格式)。如果我理解正确,那么x86使用商店队列(或商店订单缓冲区)对商店进行排序(以及其他微体系结构优化),然后使其成为全局可见(即写入L1D)。我的问题是x86拱(和其他拱)如何实现(微架构)传递性?存储队列确保按特定顺序使特定CPU的存储在全局范围内可见,但是又如何确保一个CPU进行的存储排序与其他CPU进行的存储排序呢?
x86 x86-64 cpu-architecture memory-barriers micro-architecture
英特尔推送微码更新以修复名为“跳转条件代码 (JCC) 勘误表”的错误。由于在某些条件下禁用将代码放入 ICache,更新微码导致某些操作效率低下。
已发布的文档,标题为跳转条件代码勘误的缓解措施不仅列出了JCC
,还列出了:无条件跳转、条件跳转、宏融合条件跳转、调用和返回。
MSVC 开关/QIntel-jcc-erratum
文档提到:
在 /QIntel-jcc-erratum 下,编译器检测跨越或结束于 32 字节边界的跳转和宏融合跳转指令。
问题是:
我正在尝试学习汇编,在我正在阅读的书中,我遇到了教科书表格中显示的功能单元及其延迟。
我想知道我的 CPU 的功能单元是什么,延迟是多少?整数加法、整数乘法、单精度加法、单精度乘法和双精度乘法。
My CPU is AMD Ryzen 5 3600
Run Code Online (Sandbox Code Playgroud)
我查看了这些链接:https : //www.amd.com/en/technologies/zen-core-3 https://en.wikichip.org/wiki/amd/microarchitectures/zen_3
但在我的处理器中找不到有关功能单元或其延迟的任何信息。
书中延迟表的示例:
英特尔酷睿 i7 Haswell 的功能单元信息示例:
任何帮助表示赞赏,谢谢!!:)
我知道有些库可以"解析"二进制机器代码/操作码来告诉x86-64 CPU指令的长度.
但我想知道,因为CPU有内部电路来确定这一点,有没有办法使用处理器本身来告诉二进制代码的指令大小?(甚至可能是黑客?)
我刚刚了解了超标量处理器(https://en.wikipedia.org/wiki/Superscalar_processor)。
我还了解到,随着超标量处理器宽度/方式数量的增加,事情变得更加复杂,复杂性也如此之快,以至于最好添加更多核心而不是更多宽度。我的教练说,在4路和8路超标量之间的地方添加更多的方法不再是值得的。
这让我想知道:英特尔在哪里停止添加方式并开始添加内核?我的英特尔第8代酷睿i7的每个内核有几种方式?
方式的概念是否甚至适用于这些处理器?
根据 AVR 微控制器的数据表以及 AVR 架构的指令集数据表,某些指令,例如ADD
,可以在仅 1 个时钟转换到 ALU 期间获取存储在 GP 寄存器中的 2 个操作数。指令的指令字ADD
包括 2 个 GP 寄存器地址;每个 5 位宽,一个用于目标/源,一个用于源。但是这是如何在硬件级别上实现的呢?当他们试图通过相同的直接寻址总线访问 GP 寄存器时,2 个寄存器的 5 位不会相互干扰吗?
Z80 cpu的Control部分有I和R寄存器,它们的用途和用途是什么?
由于其 TSO 内存模型,X86 保证所有商店的总顺序。我的问题是是否有人知道这是如何实际实施的。
我对所有 4 个围栏是如何实现的印象很好,所以我可以解释如何保留本地秩序。但是 4 个栅栏只会给 PO;它不会给您 TSO(我知道 TSO 允许旧商店跳到新负载前面,因此只需要 4 个围栏中的 3 个)。
单个地址上所有内存操作的总顺序是一致性的责任。但我想知道英特尔(特别是 Skylake)如何在多个地址的商店上实现总订单。
x86 intel cpu-architecture memory-barriers micro-architecture
像https://uops.info/和 Agner Fog 的指令表,甚至英特尔自己的手册这样的网站,都列出了相同指令的各种形式。例如add m, r
(在 Agner 的表格中)或add (m64, r64)
在 uops.info 上,或ADD r/m64, r64
在英特尔的手册中(https://www.felixcloutier.com/x86/add)。
这是我在 Godbolt 上运行的一个简单示例
__thread int a;
void Test() {
a+=5;
}
Run Code Online (Sandbox Code Playgroud)
添加是add DWORD PTR fs:0xfffffffffffffffc,0x5
。它以操作码开头64 83 04 25
。
有几种方法可以编写我的真实代码,但我想查找这可能需要多少个周期以及其他信息。我怎么找到这个指令的参考?我尝试在https://uops.info/table.html 中输入“add”并检查我的架构。但我不知道哪个条目是正在使用的指令。
现在在这种特定情况下,我猜测操作码是Add m64, r64但我不知道fs:
在地址之前使用是否有任何惩罚,或者是否有办法查看操作码,以便我可以确认我正在查看正确的参考
我最近对理解低级计算很感兴趣.据我所知,今天广泛使用的计算机遵循x86/x86-64架构.
据我所知,架构,更具体地说,指令集架构(ISA)是程序员能够向CPU发出的指令集.
第一个问题,ISA是不断发展还是保持不变?
我认为它不断发展(意味着新指令不断被添加/先前的指令被修改?)但是旧的处理器如何能够执行用新指令编写的代码?(它不知道新的指令,但应该能够执行代码,因为它具有x86架构).编译器是处理这个东西还是处理器?基本上,相同的指令集如何能够在所有处理器上运行,无论是旧的还是新的?
最后,除了微体系结构,这不是程序员的关注(如果我错了,请纠正我),程序员在处理新处理器时会看到哪些变化?由于微体系结构的变化,旧的指令可能因为有效的实现而快速运行.但是,是否引入了新的指令以允许以前无法完成的操作?或者之前可以用一堆指令做什么,但现在可以通过硬件的变化来完成一个?新的寄存器?还要别的吗?
它是否完成了 - 如果处理器支持这个新的强大指令以加快执行速度,那么使用新指令,否则回退到较慢的旧指令.如果是,谁实现了这个if - else子句?编译器?如果不是,那会发生什么?
汇编代码和机器代码是由架构指定的吗?我知道你如何实现架构对你来说是不重要的(微架构可以实现架构)。但我不明白汇编或机器代码是否是由架构指定的?
assembly instruction-set cpu-architecture machine-code micro-architecture
cpu-architecture ×11
x86 ×7
assembly ×5
x86-64 ×4
intel ×3
machine-code ×2
avr ×1
cpu ×1
disassembly ×1
opcode ×1
processor ×1
system ×1
z80 ×1