cpu-architecture相关内容
我想学习汇编,但我对此不太确定,但因为汇编是低级编程语言,所以在Windows计算机上为打印Hello编写的代码将与在Mac上不同。 如何解决此问题(如果此问题确实存在),以及从哪里开始学习实际的语言。 推荐答案 首先,您需要很好地掌握像C这样的语言的编程,因为它和汇编之前一样低级--其他语言很棒,但隐藏了更多的低级细节。 C有指针,这是汇编语言中常用的,所以在C中我们可以
..
/* Inner product. Accumulate in temporary */ void inner4(vec_ptr u, vec_ptr v, data_t *dest) { long i; long length = vec_length(u); data_t *udata = get_vec_start(u); data_t *vda
..
我的目标是将静态结构加载到L1D缓存中。之后,使用这些结构成员执行一些操作,并在操作完成后运行invd以丢弃所有修改后的高速缓存线。因此,基本上我希望在缓存中创建一个安全的环境,以便在缓存中执行操作时,数据不会泄漏到RAM中。 为此,我有一个内核模块。在那里我给结构的成员设置了一些固定值。然后禁用抢占,禁用所有其他CPU的缓存(当前CPU除外),禁用中断,然后使用__builtin_pref
..
我在一篇论文中读到关于末级缓存的介绍。在引言中,有人说末级缓存有很多片。每个片就像一个传统的集关联缓存。根据集合索引和切片ID找到对应的缓存集合(如下图所示)。 我想检查我的服务器有多少个切片。以及每个片的信息(多少个缓存组、每个缓存组中有多少缓存行)。我在Google上搜索的方法是查看/sys/devices/system/cpu/cpu0/cache/index3文件夹下的缓存信息。
..
我正在学习计算机结构。 我有一个关于MIPS的问题,这是计算CPU执行时间的方法之一。 MIPS公式如下。 并且如果时钟频率为4 GHz并且CPI为1。 我认为MIPS是4000赫兹。 因为它是4*10^9*Hz/1*10^6。 我不知道保留单位赫兹是否正确。 推荐答案 对于任何数量,了解其单位非常重要。除了标度因子(比如秒比埃长很多倍),单位还有维度,这是基本
..
我很难理解数据依赖和控件依赖之间的区别。 我看到的一个例子是: 数据依赖例如,指令使用另一条指令创建的数据 控制相关性例如,指令等待更新的注册表进行比较 我很难理解的是,例如在BEQ中,我等待寄存器更新,但我也依赖他的数据。 所以我不知道如何区分它们之间的区别。 推荐答案 指令等待更新注册表进行比较是对控制相关性的错误描述,难怪 条件分支指令本身对其
..
假设我们有: a = 0b11111001; b = 0b11110011; 如果我们手写Addition和Multiplication,我们就会得到这个结果,我们不在乎它是否签名: a + b = 111101100 a * b = 1110110001011011 我知道乘法会使宽度加倍,加法可能会溢出: Why is imul used for multiplyin
..
如果我有这个类: class MyClass{ short a; short b; short c; }; 我让下面的代码对上面的内容执行计算: std::vector vec; // for(auto x : vec){ sum = vec.a * (3 + vec.b) / vec.c; } 我知道CPU只从L1缓存加载它所
..
用于整数除法的硬件指令在历史上一直非常慢。例如,对于64位输入,Skylake上的DIVQ延迟为42-95个周期[1](倒数吞吐量为24-90)。 不过,也有性能更好的较新处理器:Goldmont有14-43个延迟,而Ryzen有14-47个延迟[1],M1的吞吐量显然是每个分频2个时钟周期[2],甚至Raspberry Pico也有每个内核的8周期带符号/无符号分频/模数电路(尽管这似乎是
..
已经有很多关于软件和硬件内存模型、内存栅栏、存储/加载重新排序等的信息。然而,这些信息似乎都集中在确保对共享内存的读取和写入的相对顺序。 这样的系统将线程的写入完全延迟很长时间是否合法? 例如,假设一个线程对内存中的数据结构进行了一些更新,然后引发了一个应该将更新通知其他线程的标志: (dataWritten is initially false) store value1 st
..
当我在https://godbolt.org上尝试不同的编译器时,我注意到编译器生成如下代码是非常常见的: push rax push rbx push rcx call rdx pop rcx pop rbx pop rax 我知道每个push或pop做两件事: 将操作数移入/移出堆栈空间 递增/递减堆栈指针(RSP) 因此
..
我一直在阅读x86内存模型的工作原理和x86上屏障指令的重要性,并将其与其他体系结构(如ARMv8)进行比较。在x86和ARMv8体系结构中,似乎(没有双关语意思)内存模型尊重传递性/累积性,即,如果CPU1通过CPU0看到存储,并且CPU2通过CPU1看到只有在CPU1看到CPU0存储时才可能发生的存储,那么CPU2也必须看到CPU0的存储。我提到的例子是Paul McKenney的著名论文6.
..
我用C语言实现了bubble sort,在测试它的性能时,我注意到-O3标志使它的运行速度比根本没有标志还要慢!同时,-O2使其运行速度大大快于预期。 未进行优化: time ./sort 30000 ./sort 30000 1.82s user 0.00s system 99% cpu 1.816 total -O2: time ./sort 30000 ./sor
..
假设我们有3个比特可以玩。我将在2的补码中表示正负3: +3 = 0b011 -3 = 0b101 执行加法时,当溢出发生时,您总是会遇到一个悬浮位(-3) + (+3): 1 0 1 + 0 1 1 ----- 1 0 0 0 但是减法(-3) - (+3)呢? 1 0 1 - 0 1 1 ----- 0 1 0 0b010为2,这不是我们预期为
..
我想知道这个x86寄存器标志在DOS/Windows程序调试中的含义: 辅助进位(AC = 1或NA = 0) 它与公共进位的含义相同吗?(CY = 1或NC = 0) 推荐答案 当指令导致进位或借出位3时,设置辅助进位标志。与CY的概念相同,只是用于字节中的低位半字节的高位。缩写AC是旧式,该标志在英特尔处理器手册中命名为“AF”,是“调整标志”的缩写。它被少数执行BCD
..
当我试图检查两个变量之间的差异时,我发现了一些有趣的东西(您可以在下面的代码中看到) #include #include int main() { int a, b; printf("%d", (int)&a - (int)&b); getch(); return 0; } 每一次的结果是12。我不知道为什么结果
..
据我所知,在现代无序CPU上,最昂贵的东西之一是状态,因为该状态必须在多个版本中进行跟踪,并在许多指令等方面保持最新。 一些指令集,如x86和ARM,广泛使用标志,这是在成本模型不是今天的时候引入的,标志只需要几个逻辑门。类似于每条算术指令设置标志以检测零、进位和溢出。 更新现代无序实现的成本是否特别高?使得例如ADD指令更新进位标志,并且这必须被跟踪,因为尽管它可能永远不会被使用,但是有
..
我正在读Hamacher的《Computer Organization and Embedded Systems》一书,我的问题是:计算机如何区分二进制模式是指令还是数字? 有人能帮我理解这个概念吗? 推荐答案 冯·诺伊曼处理器(几乎任何处理器)无法区分内存中的代码和数据。无论CPU的指令指针指向什么,都将作为指令加载到指令解码器中。如果它不是有效指令,它将在CPU中引发异常。
..
为什么LSL[0,31]允许移位值,而LSR允许移位值是[1,32]? LSL中的0位移位对任何应用程序都有什么用处?为什么在LSR中不允许0班次?为什么LSL不允许32位移位? 推荐答案 此限制适用于按立即数进行的班次。按寄存器移位不受此类限制。 LSL允许为0表示“不换档”。这是一个特例,因为不修改标志设置指令的C标志。 LSR和ASR乘以0的行为与LSL乘以0的行为
..
The Intel Architecture's Developer's Manual(第三卷,第8-26节),内容为: 奔腾处理器和更新的处理器系列使用 分支预测技术,以通过预取 分支指令之前的分支指令的目的地为 被处死。因此,指令执行不是确定性的 在执行分支指令时序列化。 这是什么意思? 听起来真的,真的很糟糕。这听起来像是一条序列化指令,如CPUID中断分支预测(反之亦然)
..