Questions tagged «cpu-architecture»

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

6
为什么英特尔将内部RISC内核隐藏在其处理器中?
从Pentium Pro(P6微体系结构)开始,英特尔重新设计了其微处理器,并根据旧的CISC指令使用了内部RISC内核。从Pentium Pro开始,所有CISC指令都被划分为较小的部分,然后由RISC内核执行。 一开始,对我来说很明显,英特尔决定隐藏新的内部架构,并迫使程序员使用“ CISC shell”。由于这一决定,英特尔可以完全重新设计微处理器架构而不会破坏兼容性,这是合理的。 但是我不明白一件事,为什么英特尔仍然将内部RISC指令集隐藏了这么多年?他们为什么不让程序员像使用旧的x86 CISC指令集那样使用RISC指令? 如果Intel保持了向后兼容性这么长的时间(我们仍然在64位模式旁边拥有虚拟8086模式),为什么它们不允许我们编译程序,因此它们将绕过CISC指令并直接使用RISC内核?这将为自然放弃如今不推荐使用的x86指令集开辟一种自然的方式(这是Intel决定在内部使用RISC内核的主要原因,对吧?)。 看到新的Intel“ Core i”系列,我发现它们仅扩展了CISC指令集,添加了AVX,SSE4等。

4
“性能统计”结果中的停滞周期前端和停滞周期后端是什么?
有人知道perf stat结果中的stalled -cycles-frontend和stalled-cycles-backend是什么意思吗?我在互联网上搜索,但没有找到答案。谢谢 $ sudo perf stat ls Performance counter stats for 'ls': 0.602144 task-clock # 0.762 CPUs utilized 0 context-switches # 0.000 K/sec 0 CPU-migrations # 0.000 K/sec 236 page-faults # 0.392 M/sec 768956 cycles # 1.277 GHz 962999 stalled-cycles-frontend # 125.23% frontend cycles idle 634360 stalled-cycles-backend # 82.50% …

6
检测CPU架构的编译时间
编译C或C ++代码时找出CPU体系结构的最可靠方法是什么?据我所知,不同的编译器有自己的一组非标准预处理器定义(_M_X86在MSVS中__i386__,__arm__在GCC中等)。 有没有检测我要构建的体系结构的标准方法?如果不是,是否有针对各种编译器的此类定义的完整列表的来源,例如带有所有样板文件的标头#ifdef?

5
为什么有条件移动不容易受到分支预测失败的影响?
在阅读了这篇文章(关于StackOverflow的答案)(在优化部分)之后,我想知道为什么条件移动不容易受到分支预测失败的影响。我在一篇关于cond move的文章中找到了该文章(AMD撰写的PDF)。同样,他们声称cond的性能优势。动作。但是为什么呢?我没看到 在评估该ASM指令时,尚不清楚先前的CMP指令的结果。

4
L1和L2缓存的行大小
从该论坛上的上一个问题中,我了解到,在大多数内存系统中,L1缓存是L2缓存的子集,这意味着从L2删除的所有条目也将从L1删除。 所以现在我的问题是我如何确定L1缓存中对应于L2缓存中的条目的条目。L2条目中存储的唯一信息是标签信息。基于此标签信息,如果L1和L2缓存的行大小不同,则如果我重新创建addr,它可能会跨越L1缓存中的多行。 该体系结构是否真的要对两条线进行刷新,还是只是将L1和L2高速缓存保持为相同的线大小? 我知道这是一项政策决定,但我想知道常用的技术。

8
如何计算CPU使用率?
在我的桌面上,我有一个小部件,可以告诉我当前的CPU使用率。它还显示了我两个内核中每个内核的用法。 我一直想知道,CPU如何计算正在使用多少处理能力?此外,如果CPU挂断了一些密集的计算,那么它(或处理此活动的任何对象)如何检查使用情况而又不挂断?

5
什么是缓存命中和缓存未命中?为什么上下文切换会导致高速缓存未命中?
从第11章(性能和可伸缩性)以及JCIP书籍中名为上下文切换的部分开始: 切入新线程时,所需的数据不太可能位于本地处理器高速缓存中,因此上下文切换会导致大量高速缓存未命中,因此在首次调度线程时,它们的运行速度会稍微慢一些。 有人能以一种易于理解的方式解释高速缓存未命中的概念及其可能的对立面(高速缓存命中)吗? 为什么上下文切换会导致很多缓存丢失?

7
更新到Xcode 5之后-ld:找不到架构armv7或armv7s链接器错误的符号
我刚将iPhone 4S软件更新到iOS 7 Beta 2时,我正处于对新应用程序(Phonegap)进行最后修改的过程中。 完成后,Xcode无法检测到我的iPhone,因此我安装了Xcode 5 beta。经过修改后,我终于得到了它来检测我的手机。现在唯一的问题是所使用的体系结构有错误。 这是产生的错误: ld: warning: ignoring file /Users/-----------/Library/Developer/Xcode/DerivedData/testtest-bmnbmujiosugcmgeiceofgcfmsec/Build/Products/Debug-iphoneos/libCordova.a, file was built for archive which is not the architecture being linked (armv7s): /Users/--------/Library/Developer/Xcode/DerivedData/testtest-bmnbmujiosugcmgeiceofgcfmsec/Build/Products/Debug-iphoneos/libCordova.a Undefined symbols for architecture armv7s: "_OBJC_METACLASS_$_CDVCommandDelegateImpl", referenced from: _OBJC_METACLASS_$_MainCommandDelegate in MainViewController.o "_CDVLocalNotification", referenced from: -[AppDelegate application:didReceiveLocalNotification:] in AppDelegate.o "_OBJC_CLASS_$_CDVCommandDelegateImpl", referenced from: _OBJC_CLASS_$_MainCommandDelegate …

2
是什么导致Cortex-A72上带有-O0而不是-O3的简单紧密循环的周期如此高的变化?
我正在围绕获取一段代码的高度一致的运行时进行一些实验。我当前正在计时的代码是一个相当随意的CPU约束工作负载: int cpu_workload_external_O3(){ int x = 0; for(int ind = 0; ind < 12349560; ind++){ x = ((x ^ 0x123) + x * 3) % 123456; } return x; } 我已经编写了一个内核模块,该模块禁用中断,然后运行上述功能的10次尝试,通过获取前后时钟周期计数器的差值来计时每次尝试。其他注意事项: 该机器是ARM​​ Cortex-A72,具有4个插槽,每个插槽具有4个内核(每个插槽都有自己的L1缓存) 时钟频率缩放关闭 不支持超线程 机器几乎没有运行,除了一些简单的系统进程 换句话说,我相信大多数/所有系统可变性的原因都可以解决,尤其是当通过禁用了中断的内核模块运行时spin_lock_irqsave(),代码在运行时应该获得几乎相同的性能(可能对性能造成很小的影响)在第一次运行时,首先将某些指令拉入缓存,仅此而已)。 的确,当使用编译基准测试代码时-O3,我平均看到了大约135,845,192个周期中的最多200个周期,并且大多数测试花费的时间完全相同。但是,当使用编译时-O0,范围从262,710,916上升至158,386个周期。范围是指最长和最短运行时间之间的差。而且,对于-O0代码而言,哪个试验是最慢/最快的试验并没有太多的一致性-违反直觉,在某些情况下,最快的试验是最先的,而最慢的试验是在后的! 那么:是什么原因导致-O0代码的可变性如此高的上限?看一下程序集,似乎-O3代码将所有内容(?)存储在寄存器中,而-O0代码中有很多引用sp,因此似乎正在访问内存。但是即使那样,我也希望所有内容都可以放入L1缓存中,并且在确定的访问时间内就可以坐在那里。 码 被基准测试的代码在上面的代码段中。组件在下面。两者都编译时gcc 7.4.0没有标记,除了-O0和-O3。 -O0 0000000000000000 <cpu_workload_external_O0>: 0: d10043ff sub sp, sp, …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.