cpu-architecture 相关问题

CPU或微控制器的硬件微体系结构(x86,x86_64,ARM,...)。

发出负载时跳过 Gem5 中的存储队列搜索会导致崩溃

我正在为一个研究项目修改 Gem5(版本 22.0.0.1),我正在测试的一件事是使用特殊负载,该负载在发出时不会在存储队列中搜索潜在的存储转发。 我已经

回答 1 投票 0

为什么JVM是基于堆栈的而Dalvik VM是基于寄存器的?

我很好奇,为什么Sun决定让JVM基于堆栈,而Google决定让DalvikVM基于寄存器? 我想 JVM 不能真正假设一定数量的寄存器可用......

回答 4 投票 0

Intel AVX2中的异或指令“VPXORD”、“VXORPS”和“VXORPD”有什么区别

我看到在AVX2指令集中,Intel用不同的指令区分了整数、双精度和浮点的异或运算。对于整数,有“VPXORD”,对于双精度“VXORPD”,对于浮点数“VXO...

回答 1 投票 0

在 MIPS 中使用 $0 作为目的地的目的是什么

我在研究转发时检测危险的条件时,发现这句话很混乱。 '如果管道中的指令的值为 $0 目的地...

回答 2 投票 0

最近几代 CPU 架构的每个周期加载/存储

受到这个答案的启发 sandy-bridge 和 haswell SSE2/AVX/AVX2 每个周期的 FLOPS 可以在核心上发出的仅加载/加载和存储的数量是多少 - 对于 Sandy/Ivy Bridge,B...

回答 1 投票 0

如何将数据直接写入显存?

程序员有没有办法直接将数据写入显存?我知道操作系统对此非常严格,但是某些类型的应用程序(例如视频播放器或电脑游戏)可以如何

回答 2 投票 0

对于 x86-64 的 GCC,两种看似等效的计算前缀和的方法之间的速度差异非常显着

我尝试了两种几乎相同的计算前缀和的方法,发现它们编译后有显着差异。编译选项是-O2。 首先: #包括 我尝试了两种几乎相同的计算前缀和的方法,发现它们编译后有显着差异。编译选项是-O2。 第一: #include <numeric> #include <algorithm> int main() { unsigned a[5000]; std::iota(a, a + 5000, 0); for (int k = 0; k < 1'000'000; k++) for (int i = 1; i < 5000; i++) a[i] += a[i - 1]; return *std::min_element(a, a + 5000); } 第二个: #include <numeric> #include <algorithm> int main() { unsigned a[5000]; std::iota(a, a + 5000, 0); for (int k = 0; k < 1'000'000; k++) for (int i = 0; i + 1 < 5000; i++) a[i + 1] += a[i]; return *std::min_element(a, a + 5000); } 在编译器资源管理器中 编译器中出现此异常的原因可能是什么? 在版本 2 中我们看到 GCC 已经做到了这一点, .L4: add edx, DWORD PTR [rax] add rax, 4 mov DWORD PTR [rax-4], edx cmp rcx, rax jne .L4 因此在 edx 中累积值,向其中添加一个新元素并将累积和存储到内存中。这很好,这里没有问题。 在版本1中我们看到GCC已经做到了这一点, .L4: mov edx, DWORD PTR [rax-4] add DWORD PTR [rax], edx add rax, 4 cmp rax, rcx jne .L4 这里再次加载之前存储的部分和,然后将其添加到当前元素中。 这不好,存在通过内存的循环携带依赖,将存储+重新加载的延迟置于关键路径上。在各种 CPU 上,每次迭代可能有 5 或 6 个周期。在版本 2 中,类似的依赖关系通过 edx 而不是通过内存,这在每个 CPU 上都非常高效,让循环每次迭代执行接近 1.5 个周期。基于该效果,预计性能差异约为 4 倍。 在某些较新的 CPU 上,如果 CPU 在这种情况下可以使用内存重命名(零延迟存储来加载转发),那么效果可能不会那么糟糕。然而,关于英特尔 Ice Lake,Agner Fog 写道: 快进功能在以下情况下不起作用 根据我的测试,以下情况: ... 读取-修改-写入指令 我们这里确实有一个读取-修改-写入指令,所以这可能不好。 对于 AMD 风格的内存重命名,显然内存操作数必须完全匹配(不仅仅是计算的地址,而是指定的方式),我们这里没有,所以它可能也不好。 我不知道为什么 GCC 会以如此不同的方式编译这两个版本。也许有一个原因,但我只是想不到,但也许这只是运气不好。

回答 1 投票 0

内存地址通常以位为单位有多长

我对老师讲的很多术语感到困惑,例如字、字节寻址和内存位置。 我的印象是,对于 32 位处理器, 它可以解决...

回答 2 投票 0

MIPS静态数据段有最大大小吗?

这与另一个关于不同内存段的非常相似的问题相呼应 - 我认为答案是相同的,但我想要求确认。 对于 Patterson &

回答 1 投票 0

如何处理链接器错误-错误-“找不到-lgcc”

这是我的makefile: 任务0:main.o 数字.o 添加.o gcc -m32 -g -Wall -o task0 main.o 数字.o add.o 主.o:主.c gcc -g -Wall -m32 -ansi -c -o main.c 数字.o : 数字.c ...

回答 2 投票 0

如何将线程亲和性设置为性能或高效核心?

我熟悉使用 pthread_attr_setaffinity_np 来设置线程想要运行的 cpu。在下面的代码中,线程 t 请求在 cpu_target(设置为 13)上执行,通过设置 aff...

回答 1 投票 0

在 PTE 中设置脏标志时,x86_64 CPU 会注意到页表条目已更改为不存在吗?

有一个场景如下: PAGE A 的 pte a 设置以下字段: BIT(0) 存在 BIT(1) 可写 BIT(M-1,12)页框 未设置脏标志 CPU0 CPU1...

回答 1 投票 0

x86_64 IDT 在 Linux 内核中的 CPU 之间共享吗?

TLDR: Q1:Intel x86_64 架构是否有每个 CPU 的 idtr?如果是这样,那么 IDT 应该被加载 N 次,其中 N 是 CPU 的数量?我的意思是针对每个CPU,而不是针对一个CPU N 次。 Q2:我找到了那个ID...

回答 1 投票 0

如何将管道中产生的微架构值与其相应的架构指令相匹配?

我的目标是匹配由执行标量、有序 RISCV pro 的相应指令产生的所有管道值(处理器中微架构状态的所有信号)...

回答 1 投票 0

为什么 sstatus 和 mstatus 虽然是同一个寄存器的不同视图,但它们的寄存器地址不同?

sstatus 寄存器是 mstatus 寄存器的子集。 在简单的实现中,读取或写入 sstatus 中的任何字段相当于 读取或写入 ms... 中的同名字段...

回答 1 投票 0

CPU中哪个执行单元执行预取指令?

根据Intel的手册,预取指令一般不会触发故障或异常,这与常规加载指令不同。 PREFETCH 向硬件提供提示;它确实...

回答 1 投票 0

CPU中的L2毒是什么意思?

我也遇到过和这个一样的问题。 L2毒是什么意思? 我使用的是AMD CPU。

回答 1 投票 0

超线程对低延迟开发有何影响

我读过一篇关于低延迟开发的文章,如下。 “我们总是避免(相对)缓慢的语言功能,例如异常、内存分配和关键虚拟函数调用......

回答 1 投票 0

我想知道为什么这两个代码之间的执行时间有两倍的差异

在计算机体系结构课上,我了解到汇编语言执行“if”语句时,涉及到分支预测策略的使用。此外,还强调...

回答 1 投票 0

x86 如何处理存储条件指令?

我试图找出 x86 处理器在遇到存储条件指令时会做什么。例如,它是否会停止管道的前端并等待 ROB 缓冲区变为...

回答 3 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.