并行机在专有机时代分两大阵营,共享内存和分布式内存结构。
共享内存所提供的编程界面是非常优雅的。分布式内存机器的编程界面是基于消息传输库,不够优雅。串行程序的并行化相对容易的多,因为任何一个线程都可以访问到所有的数据,因此不需要对原来串行程序在结构上作大的改动。 而为分布式内存机器写程序却不同,首先应用域的数据就要分块,每个进程不光需要本地数据,还要边界数据。在本地计算完后,还要和邻进程交换数据。程序结构上要做大改动。
共享内存最大的缺陷是物理上的。是因为其扩展性差。当时80年代的处理机是很慢的了,可是到了32个就出现瓶颈。 这无法能够满足美国能源部许多宏大挑战性问题(Grand Challenge Problems)。所以当时分布式内存的拥护者流行的一句话就是:“Speed beats beauty”。
一个很自然生发的美好愿望就来了:能不能使用物理分布式内存,在其上建立共享内存的界面。 这样我们不是就取两者精华去两者之糟粕吗? 分布式共享内存(Distributed Shared Memory – DSM)这样的机器就成为了专有机时代最后一个大创举。
这个基因杂交出来的机器却有致命性的DNA缺陷。我一九九一年加入了曼彻斯特大学新奇计算中心 (CNC) (Centre for Novel Computing) 在John Gurd教授下作研究员。John Gurd 是数据流机器的知名学者。
我加入后不久,CNC就拿到一笔科研补助金(research grant) ,Gurd 教授在诸多的专有机厂商中挑选了一个Kendal了 Square Research (KSR)。其用意在于这个中心的名字里有个“新奇”。九十年代初的英国,爱丁堡和不利索托(Bristol)的中心里有不少大型专有机。绝大部分都是分布式内存。所以,Gurd教授觉得再买一个属于重复。正好KSR 是一个分布式共享内存的机器。这也就给了我一个和这个杂交机器零距离接触的机会。在这个机器上可以用标准的Pthread库,可以用锁来同步对于共享内存的访问。操作系统自动将不同线程分布到不同的节点上。而节点之间的操作系统实现了定制的多机内存的一致性协议。这样编程的确简单了。 机器及软件环境的细节大家可以参考维基百科:http://en.wikipedia.org/wiki/Kendall_Square_Research。 恕不赘复。
我当时对于这种新奇机器是充满热忱。在短短半年内,我移植了许多并行逻辑和功能性语言(Parallel Logic and Functional language) e.g. Strand, PCN 等。我之所以能够很快地移植这些语言,是因为共享内存不需要对程序结构有大的改动。
那么KSR致命DNA弱点在哪里呢?就是性能和扩展性差。为什么物理分布内存还会有性能和扩展性问题呢?
首先,它是在硬件和操作系统实现内存缓存一致性协议。为此它的RISC 芯片是专有定制的。这就意味着它无法和业界的豪门IBM, Sun, SGI, HP等RISC 芯片的性能匹敌。第二,也就是最关键的, 这点还是后来我加入Platform Computing后和公司的CEO周松年聊起后受的启发。周松年说:“DSM 在性能上无法和消息传输库并行化的比拟的原因是,DSM的管理单元是进程的地址空间的页(page),它无法反映应用对数据的访问情况(access pattern)。而消息传输库使程序员能够充分利用应用对数据访问的知识来优化并行算法数据访问的局部性(locality)“。 他的透视使我顿悟。缺乏对于应用访问数据的知识,就无法优化对于数据的访问的局部性。 分布式内存的机器造成了多层内存(本地和远程内存)状况,影响应用性能最大的因素,就是是否能够极大限度地访问本地内存。
自KSR 破产后,我再没有看见过一个DSM的机器。
(待续)