在西宁,我碰见了季宇,他也是CCF优博。 他一见到我就提了很多问题:那么复杂的系统,怎么可能就用分形来刻画呢?你在寒武纪真的是这么做的? 时间有限,我和他解释说,分形是并行计算里非常基础的本质特征,而不是我们刻意制造的概念。 在当日的新人脱口秀环节中,我也重新为分形做了一个新定义:分形(并行计算)是问题的一种基本性质,指能够用一段有限的程序控制任意规模的并行计算机、在有限时间内计算任意大的问题。

不止是季博士,很多同行也都有类似的疑惑。不能服人,是因为我的工作仍然还在非常初级的阶段。我必须承认,现在对一线开发者而言,分形计算系统的概念实践意义有限。 但是,我有一言(确信):如果你的系统不是分形的,那你要小心了!

分形的基本要求是用同一套程序跑在任意大的机器上。不分形,对一个并行机各部分分别编程,会引来很奇怪的情况: 额外的程序会根本性地让计算过程变质。因为在计算理论中,它们可以作为建议串。理论计算机学家立刻就明白这是什么含义了,我将对工程师们再多解释一点。

以MPMD模型为例。 既然有个并行节点可以分别编程,我可以在每一个程序里硬编码一个比特的额外信息而不违反模型的任何约束(每个程序依然是有限的)。 开始计算时,我将这些比特搜集起来,组成一个比特的自然数,然后可以将这个数广播到全部计算节点上。 记这个数为。当然,能表达的最大值是

是“夹带”到程序中的外部输入信息,而且和机器规模有关,机器规模又可以随着问题规模一同扩展,因此引入了非均一性。假如,我们让表示描述长度为的全部图灵机中,会在空纸带上停机的个数。 于是我们立刻就有这样一个算法:

  1. 输入一个图灵机的描述串比特长).
  2. 搜集并广播.
  3. .
  4. 并行循环,对每一个
    1. 在空纸带上模拟执行,直到停机.
    2. 使用原子操作递增.
    3. 如果,终止整个并行循环.
  5. 返回结果取决于第个循环的模拟是完成了还是被终止了.

这个算法在有限时间内判定停机问题

如果你的系统不允许发生这种事情(判定非递归问题;你当然不应该允许发生这种事情),那么它就已经是分形的了,即使形式上可能和我在论文中描述的不一致。 根本问题在于,超额的程序是有害的——理论上它会导致能够计算不可计算问题,实践中导致的问题有多种形式:包括我们曾经在寒武纪遇到的每年一重构即是根源于此(Cambricon-F:一种具有分形冯·诺伊曼体系结构的机器学习计算机)。 分形计算系统是在反对这种错误实践。

希望这段论述能让分形的概念更清楚一些。

参考文献