
很难,但越深入学习就越能体会其中的美。
熟悉体系结构就意味着要至少了解三个领域的知识:处理器微结构,操作系统和编译器。这三者就像铁三角一样,改动其中一个,另外两个也会跟着变。看一看体系结构领域的旗舰学术会议(比如ASPLOS/ISCA/MICRO)就能明白,所有文章都会讨论这三个方面的问题。
下面说说我的一些肤浅的见解,大神们应该会**至少**有如下体验:
1. 看到c/c++程序就能自行脑编产生汇编代码,想到cache,想到ISA,想到性能。看到java/python程序就想着VM优化,就想到trace cache。不管什么程序先抿一下哪段代码是bottleneck,profiler一般用来做验证抿对了。。。
2. parallelism和locality。会考虑怎么提高程序的ILP/DLP和TLP。ILP一般依靠编译器后端和微结构,这里面就包括CPUpipeline的设计balance,多发射/超标量/超长指令字,用分支预测器在运行时扩大数据流图等等技术;DLP一般要考虑如何使用SIMD/GPU来向量化;TLP就是要考虑如何利用多核/众核加速程序,这里面还要考虑同步。这三种并行性都还要考虑data locality,就是研究程序在什么时候访问什么数据以及数据放在哪个memory里(register/cache/memory/disk?)更合适。在多线程的时候还要考虑cache coherence/false sharing/row buffer locality等等。
3. bandwidth 和 latency。会在在硬件或者软件层面设计各种buffer来减少延迟,增加带宽。这里面要考虑cpu频率,memory controller, MSHR;还要考虑各种互联拓扑结构,routing policy里面还要考虑要程序的QoS。
4. control flow 和 data flow, 这个是个大坑,可以以后填。
9. 最重要的应该是看破一切,就好像骇客帝国里的neo,看到的一切都是代码;而一切代码又都会被编译器/解释器翻译成汇编,然后通过操作系统加载在各种处理器上执行。
