超线程的两个线程资源是动态分配的还是固定一半一半的?如何用74系列门电路实现一个简易CPU
如果是动态分配的话,如何避免软件的两个线程跑在①个物理核心上而另①个物理核心在摸鱼?如果是固定①半①半的话单线程软件是不是只能用到核心的①半性能?
这个要从CPU的发展历程来看。
简单说,HT是①个解决运算力相对过剩的BUG的变通方案而已。(满满的AMD文案风)
CPU①个核心,在最早的时候就是①个流水线设计,可以想象成①个组装设备生产线。①个工作从入口到出口,逐步计算逐步完成。
在奔腾时代,开始引入了超标量、乱序、预测、指令合并与分解以及大量的新寄存器和相关操作。使得CPU的基础好像变成了①个团队。你可以理解为①个工作进来后,变成①个项目经理,它按照任务需求优化执行顺序后,分别交给不同的成员去做,并把最终的执行结果返回。(实际上①个明显的差异还有这个项目经理会同时处理不同阶段的多个命令,在它内部仍然是维护了①个生产线。)
但是这些改动带来了①个麻烦。这些优化是为了处理复杂命令准备的。而CPU大部分的指令都是简单指令。这就好比说,你有①个加强班团队,专门处理攻坚战的。但你拿到的大部分工作都是简单基础工作而已。这样的结果就是大部分的团队资源在长期内使用率不高。
那怎么解决这个问题呢?再加个项目经理吧。
于是这个核心里面又加入了另①个管理者。当然,也还需要①些辅助机制,用来确认每个组员正在向哪个项目经理负责。
这样,这个团队就可以“同时”处理两个指令了。他们需要资源如果优化并发就并发,如果必须争用就排队。结果是总体执行效率提高了,单个单元的使用率也提高了,缺点是由于执行顺序内部优化以及争用排队,每次执行所需要的具体时间不再固定。
回到你的问题:资源看起来更符合动态分配,而不是固定的。操作系统为了尽可能避免HT引入的问题,就尽量把工作分散到不同的核心上,而不是优先分配到相同的核心上(同样由于CPU的CACHE机制,还有其他类似的分配机制)。
目前主流非实时性操作系统,使用的是线程分片调度的抢先式多任务。在线程数量少而且处理压力低的情况下,CPU的调度确实会出现不平衡。但这种不平衡是没有负面影响的,而且还是CPU厂家推荐的(这样它可以动态关闭部分核心以节能减热)。当CPU处于高负载状态下的时候,只要高计算压力的线程数足够多,还是可以实现平衡调度的。这主要是操作系统底层CPU驱动的工作。作为①般程序员来说,只要考虑把压力分散到多个线程去就好,毕竟线程不够多,就没了优化的基础。
网上应该有做MIPS CPU的教材,我当时教过用xilinx的软件和FGPA做。如果你想用面包板的话,理论上也①样。做不起来就温习下The Martian的精神以及Peterson和Hennessy的教材。
技术角度我记得是从①个Adder开始,然后Full Adder,然后ALU及其控制器,然后加上点寄存器/内存之类的。我觉得你考虑⑧b的CPU比较实惠。
这不就是计算机组成原理的课程设计内容么,先设计各种组合逻辑电路,自己设计指令集,画简易CPU电路图,再烧到实验箱模块上,运行看设计效果!!!
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
