ALU在CPU内部无论是面积占比还是晶体管数量占比都是很低的,各种cache和各种reorder buffer之类的东西面积占得比ALU大太多了,但是它们能尽可能保证ALU满载。GPU才是堆ALU的呀。
补充一个视角,一个CPU内部包含的架构可见通用ALU的数量大家都提到了,Intel现在是4个,但是实际上,加法器的数量远多于这个数目,它作为一个基础逻辑部件广泛存在于各个地方
比如现在在做prefetcher,得算出当前的访问地址和过去访问地址的delta,要加法器,CPU内部配备的各种PMU counter和架构不可见的event counter,都要加法器,之前组里做过memory bandwidth的流控,也得加法器,之前组里讨论过流水线前端的PC + 4 / PC + relative address是不是也要加法器,检查了一个工业级CPU的设计,果然也是一个加法器摆在那里。
现代芯片除了包含处理器核心,一般还有含有其他的计算单元。以intel i7-6700K (Skylake 架构) 为例,真正处理器核心所占用的芯片面积只占到总面积的1/3左右,见Fig.1 。另外2/3的晶体管还用于图像处理单元,缓存,I/O 接口以及内存控制器等等。
对于每一个处理器核心来说,暴露给程序员使用的ALU单元数量是确定的 。再具体一点的话,还要区分整型ALU,浮点型ALU还有向量ALU。还是以Skylake架构来说,见Fig.2,若干个ALU单元被分散在8调度窗口中。其实指令调度上还有其他的一些限制,这里就不展开了,总的来说每个周期的加法操作很有限的。但即使每个周期只执行1次标量加法操作,在3.0Ghz的频率下,一个处理器核心就可以达到“30亿次(3x10^9)加法计算”。
可以看看spec benchmark的相关分析文献,看看ILP的分析和instruction mix,就知道实际上处理器不需要那么多ALU。
Fig.2 Intel., 2017, Intel® 64 and IA-32 Architectures