问题标签 [cpu-architecture]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
x86 - x86/x64 芯片还使用微编程吗?
如果我理解这两篇文章,那么英特尔架构的最低级别已经过渡到使用 RISC 指令,而不是英特尔众所周知的传统 CISC 指令集:
http://www.hardwaresecrets.com/article/235/4
http://www.tomshardware.com/reviews/intel,264-6.html
如果是这样,那么 x86/x64 芯片是否仍然是微程序化的,或者它是否像传统的 RISC 芯片一样使用硬连线控制?我猜它仍然是微程序的,但想要验证。
assembly - 汇编程序:为什么存在 BCD?
如果您不了解二进制,我知道 BCD 就像更直观的数据类型。但是我不知道为什么要使用这种编码,因为它以 4 位表示浪费(当表示大于 9 时),所以它没有多大意义。
另外我认为 x86 只支持直接添加和订阅(您可以通过 FPU 转换它们)。
这可能来自旧机器或其他架构?
performance - 组装:我们为什么要为寄存器烦恼?
我有一个关于装配的基本问题。
如果寄存器也可以在内存上工作,为什么我们还要费心只在寄存器上做算术运算呢?
例如,以下两个原因(本质上)将相同的值计算为答案:
片段 1
片段 2
据我所知,大多数文本和教程主要在寄存器上进行算术运算。使用寄存器是否更快?
编辑:那很快:)
给出了一些很好的答案;最佳答案是根据第一个好的答案选择的。
vhdl - 在单周期数据路径中加载半字和加载字节
有人问过这个问题,即在无需更改数据存储器的情况下将加载字节实现到单周期数据路径中,解决方案如下。
替代文字 http://img214.imageshack.us/img214/7107/99897101.jpg
这实际上是一个很现实的问题;大多数内存系统完全基于字,单个字节通常只在处理器内部处理。当您在许多计算机上看到“总线错误”时,这通常意味着处理器试图访问未正确字对齐的内存地址,并且内存系统引发了异常。无论如何,因为字节地址可能不是 4 的倍数,我们不能直接将它们传递到内存。但是,我们仍然可以获取任何字节,因为每个字节都可以在某个字中找到,并且所有字地址都是 4 的倍数。所以我们要做的第一件事是确保我们得到正确的字。如果我们取地址的高 30 位(即 ALUresult[31-2])并将它们与低端的两个 0 位组合(这就是“左移 2”单元真正在做的事情),我们得到了包含所需字节的字的字节地址。这只是字节自己的地址,向下舍入为 4 的倍数。此更改意味着 lw 现在也将地址向下舍入为 4 的倍数,但这没关系,因为未对齐的地址无论如何都不适用于此内存的 lw单元。好的,现在我们从内存中取回数据字。我们如何从中得到我们想要的字节?好吧,请注意,字中字节的字节偏移量仅由字节地址的低 2 位给出。因此,我们只需使用这 2 位来使用多路复用器从字中选择适当的字节。注意大端字节编号的使用,这适用于 MIPS。下一个,我们必须将字节零扩展为 32 位(即,只需将其与高端的 24 个零组合),因为问题指定这样做。实际上,这是问题中的一个小错误:实际上, lbu 指令对字节进行零扩展,但 lb 对其进行符号扩展。那好吧。最后,我们必须扩展 MemtoReg 控制的多路复用器以接受一个新的输入:lb 情况下的零扩展字节。MemtoReg 控制信号必须加宽到 2 位。原来的 0 和 1 的 case 分别变成了 00 和 01,我们添加了一个新的 case 10,它只在 lb 的情况下使用。lbu 指令对字节进行零扩展,但 lb 对其进行符号扩展。那好吧。最后,我们必须扩展 MemtoReg 控制的多路复用器以接受一个新的输入:lb 情况下的零扩展字节。MemtoReg 控制信号必须加宽到 2 位。原来的 0 和 1 的 case 分别变成了 00 和 01,我们添加了一个新的 case 10,它只在 lb 的情况下使用。lbu 指令对字节进行零扩展,但 lb 对其进行符号扩展。那好吧。最后,我们必须扩展 MemtoReg 控制的多路复用器以接受一个新的输入:lb 情况下的零扩展字节。MemtoReg 控制信号必须加宽到 2 位。原来的 0 和 1 的 case 分别变成了 00 和 01,我们添加了一个新的 case 10,它只在 lb 的情况下使用。
即使在阅读了解释之后,我也不太了解它是如何工作的,尤其是关于将 ALU 结果左移 2 会给出字节地址......这怎么可能?所以如果我想加载一个半字然后我会做一次左移,我会得到半字的地址??什么是更好的方法来加载字节,通过修改数据存储器加载半字?(上面的问题提出了我们不能修改数据存储器的限制)
memory - 理解内存地址
我在 MIPS 中遇到内存寻址问题。它说寻址是字对齐的……在下面的文本中,我不明白为什么它要查看地址的 2 个最低有效位?为什么?有人可以给我一个例子来澄清/说明这里的观点......所以它是说一个有效的半字地址都是其 2 个最低有效位是 00 或 10 吗?
那么如果我想从一个字对齐的内存中加载一个字节呢?我怎样才能做到这一点?据说我需要左移2,即使至少2个有效位为0 ...然后提取这些位...
assembly - 程序员“隐形”寄存器呢?
这些是“程序员可见” x86-64 寄存器:
(来源:usenix.org)
看不见的寄存器呢?刚才我了解到MMU寄存器,中断描述符表(IDT)使用这些不可见的寄存器。我正在艰难地学习这些东西。是否有任何资源(书籍/文档/等)可以立即为我提供完整的图片?
我知道程序员可见的寄存器并且对它们进行编程很舒服。我只想了解隐形寄存器及其功能。我想得到一张完整的照片。我在哪里可以获得这些信息?
编辑:
我想得到一张完整的照片。我在哪里可以获得这些信息?
这两本书帮助我理解了这些底层细节。
assembly - P6 架构 - 除了寄存器重命名之外,有限的用户寄存器是否会导致更多的操作花费在溢出/加载上?
我正在研究有关动态语言 VM 实现的 JIT 设计。自从 8086/8088 天以来,我没有做太多的组装,只是在这里或那里做了一点,所以如果我心情不好,那就太好了。
据我了解,x86 (IA-32) 架构今天仍然具有与以往相同的基本受限寄存器集,但内部寄存器数量已大幅增长,但这些内部寄存器通常不可用,并与寄存器重命名一起使用实现代码的并行流水线,否则无法并行化。我非常理解这种优化,但我的感觉是,虽然这些优化有助于提高整体吞吐量和并行算法,但我们仍然坚持使用的有限寄存器集会导致更多的寄存器溢出开销,如果 x86 有两倍或四倍的寄存器对我们可用,典型指令流中的推送/弹出操作码可能会显着减少?或者是否有其他处理器优化也可以优化这一点,我不知道?基本上如果我
任何关于研究的参考,或者更好的是,个人经历?
编辑:x86_64 有 16 个寄存器,是 x86-32 的两倍,感谢您的更正和信息。
cpu-architecture - Mips 数据布局计算
我在密歇根大学自学计算机体系结构。我不明白为什么 d 的内存布局从 312 到 319 而不是 308 http://www.flickr.com/photos/45412920@N03/4442695706/ 开始。( http://www.flickr.com/photos/45412920@N03/4442695706/ ) 也许我没有理解黄金法则 http://www.flickr.com/photos/45412920@N03/4441916461/sizes/l /这里(http://www.flickr.com/photos/45412920@N03/4441916461/sizes/l/)很好。
performance - 原子操作成本
原子操作的成本是多少(比较和交换或原子加/减)?它消耗多少周期?它会暂停 SMP 或 NUMA 上的其他处理器,还是会阻止内存访问?它会在乱序 CPU 中刷新重新排序缓冲区吗?
对缓存会有什么影响?
我对现代流行的 CPU 很感兴趣:x86、x86_64、PowerPC、SPARC、Itanium。