- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
索引寻址模式通常用于访问数组,因为数组是连续存储的。我们有一个索引寄存器,该寄存器在每次迭代中都会递增,当添加到基地址时,它会给出数组元素的地址。
我不了解此寻址模式的实际需求。为什么我们不能直接寻址呢?我们有基本地址,每次访问时都可以在其中添加1。为什么需要索引寻址的索引寻址模式呢?
我不确定隐式寻址模式的指令格式。假设我们有一条指令INC AC。指令中指定了交流电的地址,还是有一个特殊的操作码,表示“ INC AC”,我们不包括交流电(累加器)的地址?
最佳答案
我不了解此寻址模式的实际需求。为什么我们不能直接寻址呢?
您可以; MIPS只有一种寻址模式,编译器仍然可以为其生成代码。但是有时它必须使用额外的shift + add
指令来计算地址(如果它不只是遍历数组)。
寻址模式的重点是保存指令和保存寄存器,尤其是在诸如x86之类的2操作数指令集中,其中的add eax, ecx
用结果(eax
)覆盖eax += ecx
,这与MIPS或其他3指令ISA不同,其中< cc>执行addu $t2, $t1, $t0
。在x86上,这需要一个副本(t2 = t1 + t0
)和一个mov
。 (或者在特殊情况下,add
:x86可以使用与内存操作数相同的指令编码进行复制和添加(和移位)。)
考虑一个直方图问题:您以不可预测的顺序生成数组索引,并且必须对数组进行索引。在x86-64上,lea edx, [eax+ecx]
将使用单个4字节指令来递增内存中的32位计数器,该指令解码为前端仅2 oups即可发布到现代Intel CPU的乱序内核中。 (http://agner.org/optimize/)。 (add dword [rbx + rdi*4], 1
是基址寄存器,rbx
是缩放的索引)。具有缩放索引非常强大。 x86 16位寻址模式支持2个寄存器,但不支持缩放索引。
经典MIPS仅具有单独的移位和加法指令,尽管MIPS32确实为地址计算添加了定标加法指令。这样可以在此处保存说明。作为装载存储机器,装载和存储始终必须是单独的指令(与x86上的方法不同,x86的添加和解码是微融合的装载+添加和存储。请参见INC instruction vs ADD 1: Does it matter?)。
对于MIPS,也许ARM是更好的比较:它也是一台负载存储RISC计算机。但是它确实可以选择寻址模式,包括使用桶形移位器的缩放索引。因此,您无需为每个数组索引单独进行移位/添加,而可以使用具有相同寻址模式的rdi
,LDR R0, [R1, R2, LSL #2]
/ add r0, r0, #1
。
通常在遍历数组时,最好仅递增x86上的指针。但这也是使用索引的一种选择,尤其是对于具有多个使用相同索引的数组的循环,例如str
。但是,索引寻址模式有时可以为slightly less efficient in hardware,因此,当编译器展开循环时,它通常应使用指针,即使它必须分别递增所有3个指针而不是一个索引。
指令集设计的重点不仅在于图灵完善,还在于使高效代码能够以更少的时钟周期和/或更小的代码大小完成更多的工作,或者为程序员提供针对这些目标的选择。
可编程计算机的最低阈值非常低,例如,请参见各种One instruction set computer体系结构。 (没有真正实现的,只是在纸上设计的,目的是表明可以编写程序,仅用减法和分支运算法则(如果小于零),并在指令中编码内存操作数。
在易于解码(尤其是并行解码)与紧凑之间需要权衡。 x86令人恐惧,因为它是作为一系列扩展而演变的,通常没有太多计划为将来的扩展留出空间。如果您对ISA设计决策感兴趣,请访问Agner Fog的博客,以有趣的讨论方式为结合高性能x86的高性能CPU设计ISA(很多工作与一条指令结合在一起,例如,内存操作数作为一个指令的一部分)。具有RISC最佳功能(易于解码,寄存器很多)的ALU指令:Proposal for an ideal extensible instruction set。
在如何使用指令字中的位上也要权衡,尤其是在像大多数RISC一样的固定指令宽度ISA中。不同的ISA做出了不同的选择。
PowerPC使用许多编码空间来存储功能强大的位域指令,例如C[i] = A[i] + B[i]
(向左旋转并掩盖位窗口)和大量操作码。 IDK,如果通常不可发音且难以记忆的助记符与此有关...
ARM使用高4位基于条件码来执行任何指令。它为the barrel shifter使用更多位(第二个源操作数可以有选择地移位或旋转另一个寄存器的立即数或计数)。
MIPS具有相对较大的立即操作数,并且基本上很简单。
x86 32/64位寻址模式使用可变长度编码,当有索引时带有一个额外的字节SIB(比例/索引/基数)字节,以及可选的disp8或disp32立即位移。 (例如,rlwinm
需要2 +1 + 4字节进行编码,而add esi, [rax + rdx + 12340]
需要2字节。
x86 16位寻址模式受到更多限制,并将除可选的disp8 / disp16位移以外的所有内容打包到ModR / M字节中。
假设我们有一条指令INC AC。指令中指定了交流电的地址,还是有一个特殊的操作码,表示“ INC AC”,我们不包括交流电(累加器)的地址?
是的,某些ISA中某些指令的机器代码格式包括隐式操作数。许多机器都有add esi, [rax]
/ push
指令,这些指令隐式地将特定寄存器用作堆栈指针。例如,在x86-64的pop
中,RAX是显式寄存器操作数(encoded in the low 3 bits of the one-byte opcode using the push rax
short form),而RSP是隐式操作数。
较早的8位CPU通常具有诸如DECA(减法累加器A)之类的指令。即该寄存器有一个特定的操作码。这可能与使用DEC指令以及在操作码字节中的某些位指定哪个寄存器(例如x86在x86-64将short INC/DEC encodings用作REX前缀之前使用x86所做的操作)相同:请注意64中的“ NE”(不可编码)位模式列(push r64
)。但是,如果没有常规模式,则可以肯定将其视为隐式操作数。
有时将事情归为整洁的类别会失败,因此不必担心使用带操作码字节的位是x86的隐式还是显式。这是一种花费更多操作码空间以节省常用指令的代码大小,同时仍允许与其他寄存器一起使用的方法。
一些ISA按照约定只使用某个寄存器作为堆栈指针,而没有隐式使用。 MIPS就是这样。
ARM32(在ARM中,不是Thumb模式)在push / pop中也使用显式操作数。它的push / pop助记符只是实现多个存储递减-之前/存储多个递减-的别名(LDMIA / STMDB)。有关LDM / STM的说明,请参见ARM's docs,其中说明了这一点,以及您可以使用这些说明的一般情况做什么,例如LDMDB递减指针,然后加载(与POP相反)。
关于cpu-architecture - 索引寻址模式和隐式寻址模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47868145/
我想知道在谈到 CPU 使用率和 CPU 利用率时,术语是否存在科学差异。我觉得这两个词都被用作同义词。它们都描述了 CPU 时间和 CPU 容量之间的关系。 Wikipedia称之为 CPU 使用率
我研究了一些关于处理器和 Tomasulo 算法的指令重新排序的内容。 为了更深入地了解这个主题,我想知道是否有任何方法可以(获取跟踪)查看为给定程序完成的实际动态重新排序? 我想给出一个输入程序并查
我有一台配备 2 个 Intel Xeon CPU E5-2620 (Sandy Bridge) 和 10Gbps 82599 NIC(2 个端口)的服务器,用于高性能计算。从 PCI 关联性中,我看
您能详细解释一下“用户 CPU 时间”和“系统 CPU 时间”吗?我读了很多,但我不太理解。 最佳答案 区别在于时间花在用户空间还是内核空间。用户 CPU 时间是处理器运行程序代码(或库中的代码)所花
我想知道如何识别 CPU 是否与 ARM v5 指令集兼容。 假设 ARM v7 指令与 ARM v5 兼容是否正确? 最佳答案 您可以阅读 CPUID base register获得PARTNO。然
我目前在具有多个六核 CPU 的服务器上使用 C 多线程。我想将我的一些线程的亲和性设置为单个 CPU 的各个核心。我使用过 pthread_setaffinity_np() 和 sched_seta
1) 独占时间是在方法中花费的时间2) 包含时间是在方法中花费的时间加上在任何被调用函数中花费的时间3)我们称调用方法为“ parent ”,称方法为“子”。引用链接:Click here 这里的问题
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
好的,所以编译器可以出于性能原因自由地重新排序代码片段。让我们假设一些代码片段,在没有应用优化的情况下直接翻译成机器代码,看起来像这样: machine_instruction_1 machine_i
我在 zabbix 中有以下默认图表,但我不知道如何解释这些值。谁能解释一下? 最佳答案 操作系统是一件非常忙碌的事情,尤其是当你让它做某事时(即使你没有做)。当我们看到一个活跃的企业环境时,总会发生
换句话说,L1、L2、L3 等缓存是否总是反射(reflect) CPU的字节序 ? 或者总是将数据存储在某些 的缓存中更有意义吗?特定字节序 ? 有没有总体设计决策 ? 最佳答案 大多数现代缓存不会
我想知道当前的 cpus 是否避免在其中至少一个为零时将两个数字相乘。谢谢 最佳答案 这取决于 CPU 和(在某些情况下)操作数的类型。 较旧/较简单的 CPU 通常使用如下乘法算法: integer
我有一个 CUDA 应用程序,它在一台计算机(配备 GTX 275)上运行良好,而在另一台配备 GeForce 8400 的计算机上运行速度慢了大约 100 倍。我怀疑有某种回退使代码实际上在 CPU
例如,对于 8 位 CPU,堆栈大小预计为 8 位宽,16 位 CPU 与 16 位堆栈宽度,以及 32 位、64 位 CPU,等等。是否适用于所有架构? 最佳答案 CPU 具有数据总线和地址总线。它
实现 SIMD 是否需要多核 CPU? 在阅读有关 SIMD 的维基百科时,我发现了以下短语“多处理元素”。那么这句话和“多核CPU”有什么区别呢? 最佳答案 不,每个内核通常都可以执行指令集中的大多
我遗漏了一些基本的东西。 CPU 流水线:在基本层面上,为什么指令需要不同数量的时钟周期才能完成,为什么有些指令在多级 CPU 中只需要 1 个周期? 除了明显的“不同的指令需要不同的工作量才能完成”
超线程 CPU 是实现并行还是仅实现并发(上下文切换)? 我的猜测是没有并行性,只有通过上下文切换的并发性。 最佳答案 单个物理 CPU 具有超线程的核心显示为 两个逻辑 CPU 到操作系统。 CPU
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
背景是这样的:下周我们的办公室将有一天因为维护而没有暖气。预计室外温度在 7 至 12 摄氏度之间,因此可能会变冷。可移植电取暖器数量太少,无法满足所有人的需求。 但是,在我大约 6-8 平方米的办公
我开发了一个应用程序,该应用程序在我的开发箱上的三个容器中运行,该开发箱具有带超线程的四核,这意味着系统和 docker 使用 8 个核心。 容器的 CPU 分配由 docker-compose 完成
我是一名优秀的程序员,十分优秀!