在寒武纪从事软件架构工作期间,我深切体会到了软件开发的痛处。2016年我刚刚接手的时候,核心软件是由我和王禹卿两人负责开发,代码规模1万5千行;在2018年我离开的时候,开发团队增加到60余人,代码规模72万行。从代码行数来看,软件的复杂度每5个月就翻一倍。无论增加多少人手,团队仍旧承担着巨大的开发压力:客户需求急迫,需要立刻应对;硬件规模在变化,冲击了现有软件设计方案,很可能需要针对新硬件重新设计;新功能需要实现,老代码需要重构,越积攒越多;文档还没建立;测试还没建立……
我可能称不上一个专业的软件架构师,但是又有谁能在一开始就保证预见了未来的变化?试想一下,底层硬件一开始是单核,一年后变为多核,又一年后变为NUMA多核。在这种变化速度和幅度之下,同一套软件不经过大规模重构,怎么可能能够保持适应?问题的关键在于硬件的规模增加了,因而需要编程控制的抽象层次也在增多,使编程变得复杂。我们将问题定义为编程-规模相关性。
为了解决这个工程实践问题,我们开始了Cambricon-F的研究。
为了解决编程的规模相关性,需要引入一种规模不变量,我们找到的这种不变量是分形:分形的几何图形,在不同规模尺度上自相似。我们将应用负载以分形方式定义,将硬件结构也以分形方式定义,两个规模不变量均可自由缩放,直至找到互相适配的规模。
Cambricon-F首次提出分形冯·诺伊曼体系结构。该结构最大的特点是:
- 串行编程,自动展开为适合硬件规模的并行执行;
- 编程-规模无关性——程序中不体现硬件规模,可以在不同规模的Cambricon-F实例上迁移;
- 通过分形流水线,保持了高效率。
论文发表在ISCA 2019。[DOI]