cpu-architecture相关内容
我正在寻找将 VM 构建到游戏中,并且想知道是否有人知道任何非常简单的 VM(我认为 RISC/PIC 接近我想要的),这些 VM 通常用于嵌入式项目,例如控制机器人、电机、传感器等.如果我自己动手,我主要担心的是必须编写一个编译器/汇编器.我很高兴使用已经存在的工具,或者以最简单的形式使用可以为其编译的 C 编译器:-p. 我真的不想在这里重新发明轮子,但我还需要在虚拟世界中运行数千个这样
..
考虑以下取自 Wikipedia 的示例,稍作修改,其中程序的步骤对应于各个处理器指令: x = 0;f = 0;线程#1:而(f == 0);打印 x;线程#2:x = 42;f = 1; 我知道,由于无序执行,当线程在两个不同的物理内核/处理器上运行时,print 语句可能会打印不同的值(42 或 0). 但是我不明白为什么这在单核机器上不是问题,因为这两个线程在同一个核心上运行(通
..
我一直在阅读 Memory Barriers: A Hardware View For Software Hackers,Paul E 的一篇非常受欢迎的文章. 麦肯尼. 论文强调的一件事是,像 Alpha 这样排序非常弱的处理器可以重新排序依赖负载,这似乎是分区缓存的副作用 论文摘录: 1 struct el *insert(long key, long data)2 {3 结构
..
在 C++ 中, 为什么布尔值是 1 字节而不是 1 位大小? 为什么没有像 4 位或 2 位整数这样的类型? 在为 CPU 编写模拟器时,我错过了上述内容 解决方案 因为 CPU 无法处理小于字节的任何内容.
..
我正在从事一个二进制分析项目,我正在构建一个将程序集转换为 llvm 的升降机.我建立了一个内存模型,但对 str 和 ldr arm 汇编指令如何在内存上工作有点困惑.所以我的问题是.例如,给定一个内存地址 0000b8f0,我想在其中存储一个 64 位十进制值 20000000.str 指令是将整个 20000000 存储在地址 0000b8f0 中还是将其划分为字节并将第一个字节存储在 00
..
这是什么意思:我只有 12 位用于立即常数,所以我可以只表示从 0 到 2^12 = 4096 的立即常数吗?操作数 2 如果是寄存器,可以有 32 位,但为什么立即数只有 12 位呢?这个数字是从哪里来的? 解决方案 由指令集定义.例如.MOV 指令编码为 31 28 |27 26 |25 |24 23 22 21 20 |19 16 |15 12 |11 0 |条件 |0 0 |我
..
据我了解,ARMv7 处理器(例如 Cortex-A9)大多向后兼容旧 ARM 架构版本的代码.但是,我阅读了有关 尝试在 Cortex-A8 上运行 ARM9 代码 的报告,例如. ARMv4/5/6 (ARM7TDMI/ARM9/ARM11) 代码的哪些部分不能在 ARMv7 处理器上运行?这些旧 ARM 架构版本中存在哪些功能或架构特征会导致为这些版本构建的程序在 ARMv7 上失败?
..
我想知道为什么需要内存屏障,我已经阅读了一些关于这个主题的文章. 有人说这是因为 cpu 乱序执行,而 others 说是因为缓存一致性问题导致存储缓冲区和队列失效. 那么,需要内存屏障的真正原因是什么?cpu乱序执行还是缓存一致性问题?或两者?cpu乱序执行和缓存一致性有关系吗?x86和arm有什么区别? 解决方案 当 ISA 的内存排序规则弱于您的算法所需的语义时,您需要屏障来排序
..
根据我对 ARM 处理器的理解,以下是顺序执行的特点(1) 按顺序执行指令(2) 直到当前指令执行完毕,才会执行下一条指令.(3) 执行速度较慢. 乱序执行与 In-order 的行为正好相反.(1) 以非顺序执行指令(2) 即使当前指令未完成,也会执行下一条指令.(仅当下一条指令不依赖于当前指令的结果时才会这样做)(3)更快的执行速度. 除了上面提到的,还有其他的功能区别吗??
..
我想知道 Raspberry Pi 1 中的 ARM1176JZF-S 内核和 Raspberry Pi 2 中的 Cortex-A7 内核每个周期的峰值 FLOP. 来自 ARM1176JZF-S 技术参考手册似乎VFPv2可以每个时钟周期执行一个SP MAC,每隔一个时钟周期执行一个DP MAC.此外,还有三个可以并行运行的流水线:MAC 流水线 (FMAC)、除法和 sqrt 流水线
..
自 Skylake(?) 架构以来,英特尔一直在内部将 CISC 指令解码为 RISC 指令,而 AMD 自 K5 处理器以来一直在这样做.那么这是否意味着 x86 指令在执行过程中被翻译成一些奇怪的内部 RISC ISA?如果这是正在发生的事情,那么我想知道是否有可能创建一个能够理解(即内部转换为自己的专有指令)x86 和 ARM 指令的处理器.如果可以的话,性能会是怎样的?为什么还没有完成?
..
在阅读ARM核心文档时,我有这个疑问.CPU如何区分读取数据和数据总线,是作为指令执行还是作为可以操作的数据执行? 参考文档摘录—— "数据进入处理器内核通过数据总线.数据可能是执行指令或数据项目." 提前感谢您启发我!/MS 解决方案 每个操作码将包含一个 N 字节的指令,然后期望后续的 M 字节为数据(内存指针等).因此 CPU 使用每个操作码来确定以下字节中有多少是
..
ARM 允许使用后续存储重新排序加载,因此以下伪代码: //CPU 0 |//CPU 1温度0 = x;|温度1 = y;y = 1;|x = 1; 可以导致 temp0 == temp1 == 1 (并且,这在实践中也是可以观察到的).我无法理解这是如何发生的;似乎按顺序提交会阻止它(据我了解,几乎所有 OOO 处理器中都存在这种情况).我的推理是“负载在提交之前必须有它的值,它在存
..
这是常见声明 将字节存储到缓存中可能会导致内部读取-修改-写入周期,或者以其他方式损害吞吐量或延迟与存储完整寄存器相比. 但我从未见过任何例子.没有 x86 CPU 是这样的,我认为所有高性能 CPU 也可以直接修改缓存行中的任何字节.一些微控制器或低端 CPU 是否有不同(如果它们有缓存的话)? (我不计算字可寻址机器,或者 Alpha,它是字节可寻址但缺少字节加载/存储指令.我说的
..
从这里我知道英特尔实现了几个静态分支预测这些年的机制: 80486 年龄:始终未采取 Pentium4 时代:Backwards Takes/Forwards Not-Taken Ivy Bridge、Haswell 等较新的 CPU 变得越来越无形,请参阅 Matt G 的实验在这里. 而且英特尔似乎不想再谈论它了,因为我在英特尔文档中找到的最新材料是大约十年前写的.
..
我找不到足够的信息来决定我应该使用哪个编译器来编译我的项目.在不同的计算机上有几个程序模拟一个过程.在 Linux 上,我使用的是 GCC.一切都很好.我可以优化代码,它编译速度快并且使用的内存不多. 我用 MSVC 和 GCC 编译器做我自己的基准测试.后来的一个产生稍微快一点的二进制文件(对于每个子架构).虽然编译时间远远超过 MSVC. 所以我决定使用 MinGW.但是在MinG
..
我很难理解超线程.如果逻辑核心实际上不存在,那么使用超线程有什么意义?wikipedia 文章指出: 对于物理上存在的每个处理器内核,操作系统会寻址两个虚拟(逻辑)内核并尽可能在它们之间共享工作负载. 如果两个逻辑核心共享同一个执行单元,这意味着其中一个线程必须在另一个线程执行时被搁置,话虽如此,我不明白超线程如何有用,因为您实际上并没有引入新的执行单元.我无法理解这个 解决方案
..
单线程中的代码具有一定的内存保证,例如先写后读(即,将一些值写入内存位置,然后将其读回应该给出您写入的值). 如果线程被重新调度以在不同的 CPU 内核上执行,这种内存保证会发生什么情况?假设一个线程将 10 写入内存位置 X,然后被重新调度到不同的核心.该内核的 L1 缓存可能具有不同的 X 值(来自之前在该内核上执行的另一个线程),因此现在读取 X 不会像线程预期的那样返回 10.当线程
..
一般来说,我知道一个进程无法写入具有不允许写入的保护的内存(在其地址空间中).但是什么检查进程是否可以做到这一点?是否有任何汇编指令通过操作系统?它是如何工作的? 解决方案 在大多数现代 CPU(Intel x86,大多数 ARM 版本)中,是 CPU 本身进行检查.CPU在寄存器之一中存储数据结构的地址,该地址指定存储器的布局(“页表")——具体而言,哪些地址是可读的,哪些是可写的,哪些
..
这里有一个操作系统/计算机架构问题.我正在阅读有关缓存的内容,关于如何虚拟索引缓存是减少地址转换时间的一种选择.我遇到了以下情况: "虚拟缓存困难包括:别名两个不同的虚拟地址可能具有相同的物理地址." 我想不出什么情况会发生这种情况.自从我的 O/S 天以来已经有一段时间了,我正在画一个空白. 有人可以举个例子吗?谢谢 解决方案 两个进程可能有一个共享的mapping.例如,在
..