一种适用于网格计算的主动存储计算机模型

分类: 技术前沿

保留所有版权,请引用而不是转载本文(原文地址 https://yeecode.top/blog/80/ )。

图灵机作为一种基础的理论模型,在解决可计算性问题上十分重要。但是,在实际使用中,这种模型过于简单。通常,在算法设计和分析领域,我们使用随机访问计算机模型RAM(Random Access Machine)。但是,在网格计算中,RAM模型过于基础,因此产生了众多其他模型。

本文讨论一种适用于网格计算的主动存储计算机模型CAM(Computer with Active Memory),包括其提出背景,使用范围,局限性等。本文主要内容参考中科院计算所徐志伟等人编著的《网格计算技术》一书以及徐志伟先生的论文《一种主动存储计算机模型》。

同时,我们也对徐志伟先生所提的理论进行了一些修改,包括将字长等元组从模型中删除,修改了一些定义等。但具体思想仍由原作给出。

RAM模型

RAM模式是我们展开讨论的基础,因此我们先形式化定义RAM模型。

一个RAM计算机C可以定义为一个三元组,$C=(P,M,Ci)$,其中:

  • P是计算机的处理器
  • M是计算机的存储器。存储器M中包含众多的存储单元,我们依次记为$M(0),M(1),M(2)……$,因此M是以上各个存储单元的集合,即$M= { M(0),M(1),M(2)…… } $。
  • Ci是计算机的指令集。指令集Ci能够覆盖完成图灵机的操作,例如可以是下列指令的集合:load,store,add,subtract,multiply,divide,jump,jzero,halt。

在计算机C上执行一次计算Q可以被定义为一个四元组,$Q=(C,R,I,O)$,其中:

  • C为计算机
  • R为有限条指令组成的程序
  • I是M的一个有限子集,其中存储有输入数据
  • O是M的一个有限子集,用于存储输出数据

这样,在运行一次计算Q时,计算机C可以按照R的指令,从I中取出输入数据进行一系列运算,并将结果存入O中。

如果最后R调用了halt函数,则计算机最后停机,此时O中就是计算结果;如果Q不能结束,则Q是一个发散计算,例如流处理。

CAM模型

在讨论CAM模型之前,我们先粗略介绍网格计算中涉及的两个基本的参与者:

  • 客户机:计算命令的发起者
  • 服务器:网格中的一个节点,是计算命令的执行者

另外,这两个概念是相对的。在不同的计算任务中,以上角色都可以互换,而且我们对其中的一些协调层角色进行了省略。

使用RAM模型来进行网格计算是十分复杂的,这需要客户机完成大量的数据发送、任务下发工作,服务器完成大量的数据接收、计算等工作。因此,提出了CAM模型。

一个CAM计算机D是一个三元组,$D=(P,M,CI)$,其中这三个元素我们分别介绍。

P

P是计算机的处理器。要注意,这里的处理器不仅仅包含客户机的处理器,也包含网格上各个服务器的处理器。

M

M是计算机的存储器。同样的,不仅包含客户机的存储器,也包含网格上各个服务器的存储器。这些存储器统一编号,即也有$M={M(0),M(1),M(2)……}$。

另外要注意,CAM中的存储器M中的每个存储单元内部是划分区域的,例如将其划分为三个区域。这样,$M(1)$包含三个区域,我们分别记为$M(1,in)$,$M(1,f)$,$M(1,out)$。其中,我们可以让$M(1,in)$存储输入数据,让$M(1,f)$存储计算函数,让$M(1,out)$存储输出结果。对于每个存储单元都遵循这样的三个区域划分。

因此,对于任意一个$M(i)$,它包含了一个$M(i,in)$存储输入数据,一个$M(i,f)$存储计算函数,一个$M(i,out)$存储输出结果。于是,仅依赖这些信息,它可以完成一个计算。我们也让$M(i)$具有运行能力。

当运行$M(i)$时,实际是触发了下面的计算:

$$M(i,out)=(M(i,f))(M(i,in))$$

因此不同于RAM中的存储器,这里的存储器具有执行能力。

CI

CI是计算机的指令集合,该集合是RAM中指令集合Ci的超集。

例如,在CI中存在$Execute M(i)$表示触发运行$M(i)$,这条指令是Ci中没有的。

另外要注意,$Execute M(i)$指令在计算机中仅代表触发运行$M(i)$,而不需要等$M(i)$运行结束。因此,如果存在下面的指令序列:

a;
Execute M(i);
b;

则不等$Execute M(i)$执行结束,便会触发指令$b$。这种定义实际是在发挥计算网格的并行计算能力。

CAM模型讨论

相比于RAM,CAM是RAM的扩充,其P变为一个集群,M具有了运行能力,CI扩充了命令集合。

其中最重要的一点是M具有了运算能力,我们可以将其看做一个包。只要将包中的内容发送给网格中的一个节点$i$,然后使用$Execute M(i)$指令触发它,便可以在节点$i$上并发地进行这个任务。

例如,下面的程序片段便完成了任务下发、执行、回收的过程:

MOV InputData M(7,in);
MOV Function M(7,f);
Execute M(7);
MOV M(7,out) LocalFile;

但是CAM理论并不完善,因为各个节点之间的计算往往是有依赖关系的。例如,节点7的结果作为节点9和节点17的输入等。按照$Execute M(i)$指令的定义,这种异步执行的方式不能满足这种要求。

而如果将$Execute M(i)$修改为非并发的,则会导致网格计算失去并行能力。

因此,我们可以设计两条指令:

  • $sExecute M(i)$:表示串行执行
  • $pExecute M(i)$:表示并行执行

对于存在依赖的计算任务采用串行执行。通过两种指令的选用,保证系统的并行能力和节点关联能力。

这种CAM的模型中,最重要的思想实际是M中存储单元的分区设计思想,使得M的每个存储单元具有可执行能力。进而将网格中的节点转化为了一个或者几个存储单元。

可以访问个人知乎阅读更多文章:易哥(https://www.zhihu.com/people/yeecode),欢迎关注。

作者书籍推荐

作者书籍推荐