金 翊,张素兰,李 双,沈云付,欧阳山,彭俊杰
(上海大学 计算机工程与科学学院,上海 200444)
随着人们处理的问题越来越复杂,新型计算机不断出现,如DNA计算机,量子计算机等[1].2000年出现了用偏振方向相互正交的2个偏振光状态(如垂直偏振光与水平偏振光)和无光态来表示信息的三值光学计算机(TOC)理论和体系结构[2-3].2017年11月7~11日TOC原型机SD16在第十九届中国国际工业博览会上展出.随着SD16问世,TOC的应用研究成为关注焦点,如何编制TOC的应用程序成为亟待解决的问题.
为尽快开展对TOC的应用研究,2010年作者就开始研究如何编制TOC的应用程序.考虑到这种应用程序既要充分发挥TOC的优势,又要尽量保持传统的编程习惯,使程序员容易接受和方便使用,作者采取了将这种计算机的应用特征包含在运算-数据文件(简称SZG文件)中,在应用程序中将这种文件送三值光学处理器(TOP)去计算的策略来构建TOC编程平台.这个策略包含两方面:一是构建SZG文件;二是对现有编程语言扩充必要的新指令,这些新指令包括将SZG文件送TOP的指令、查询这种文件在TOC上处理情况的指令和等待TOC回送结果文件的指令.本文将全面总结这方面的研究成果并归纳出编制TOC应用程序的基本理论和技术.
随着TOC理论、结构和实验系统日益丰富,它在计算能力方面的特性被逐步认知,其主要优势被归结为三大特征:数据位数众多、数据位可分配和每个数据位的计算功能可在运行时重构[4-7].众所周知,电子计算机的数据位数基本固定、数据位不能拆分给不同的用户使用、处理器的计算功能不可改变.显然,在完全基于电子处理器特点而设计的常见编程环境中无法编制出发挥TOC优势的应用程序,电子计算机的编程方法和程序中使用的管理数据的方法也不宜直接使用在TOC上.
金翊等[8]认为:解决这个问题需要2个层面上的努力,首先要在概念上使用户清晰地认识到TOC和电子计算机在计算能力方面能够一脉相承、相互补充、协同工作.其次要在编程技术上使用户保持习惯的思维方式,并以升级编程平台的形式实现TOC的编程环境.于是提出了TOC是简单结构量计算机之概念,而简单结构量是指其所有分项都为逻辑型或数值型数据的结构量.简单结构量计算机概括了TOC的应用特征,在计算能力上,使得TOC成为电子计算机的延续和扩展.完成了在概念上将2种计算机协调一致的任务.
另一方面,简单结构量包含了向量和标量,因此当TOP能够被重构成简单结构量运算器时,也必然能被重构成多个向量运算器和多个标量运算器,下文称其为复合运算器.将TOP重构成复合运算器必须解决两个问题:一是如何将复合运算器的构造参数在开始计算前送给TOP;二是程序中用何种简单方法将大量的原始数据送入TOP.这两个问题有密切关联.作者采取将复合运算器的构造参数和原始数据组织在一个专门文件——SZG文件中、在程序中将SZG文件适时送TOC进行处理、并等待运算结果返回的策略,一举解决了这两个问题.
2012年宋凯[9]建立了SZG文件的第一个版本,其主要贡献有:① 确立SZG文件分为记录整体信息的头部和记录原始数据的数据区2个部分;② 确立TOC运算-数据文件的表达形式为*.SZG,相应的结果文件表达形式为*_R.SZG,通配符*是用户给出的文件名全称,包括存储路径;③ 基于该版本完成了对C语言和MPI语句的基本扩充命令[10-11],从而在理论和实验上证明了以SZG文件为基础,对现有编程语言做少量扩充后,即可形成TOC的应用程序编制平台,并能实现2种计算机在一个应用程序中协同工作.
2013年金翊等[8]建立了SZG文件的第2版,这一版仔细地定义了SZG文件头部的格式,给出了文件头部包含的各个项的名称、功用和位数,给出了预留位的多少和位置.这一版不仅使SZG文件有了基本的实用价值,还为构建TOC的任务管理软件、数据位分配软件、处理器重构软件等底层核心软件奠定了基础.
2014年以来,随着TOC底层软件研究的进展,要求对SZG文件头部各个项给出更详尽的定义,以确保TOC的底层核心软件能够无歧义地理解用户在SZG文件中表达的意图.随着TOC的40位乘法运算例程[12]、除法运算例程[13]、FFT和DFT算法例程的建立[14-15],又要求SZG文件能够表达更加复杂的运算请求,并为第三方开发更多的数学运算例程和常用算法例程创造条件.随着对TOC潜在应用场景的探索不断深入,还要求能方便地从已有SZG文件或其结果文件中提取原始数据或运算结果来生成新的SZG文件——形成SZG文件链.因此,在2015年建立了SZG文件格式的第3个版本.下文将对这个版本做简要介绍.
包含电子处理器和TOP 2个计算核心的系统可以用图1所示的多心洋葱结构来表述.图中:每个核心有自己的底层软件——操作系统,以这2个操作系统为基础,加上扩充了SZG文件传送指令的程序语言、构造SZG文件链的指令和初始SZG文件生成软件就形成了完整的编程平台.在该编程平台上,程序员只需熟悉SZG文件生成技术和扩充后的程序语言,即可编制各种应用程序,不必关心2种计算核的特点和它们之间的关联性和通信过程.
图1 计算机系统的多核心结构及SZG文件的功用示意图Fig.1 Multi-centre architecture of computer system and the functions of SZG file
与仅有电子处理器可用的应用程序相比,在图1所示编程平台上完成的应用程序伴有多个SZG文件,每个SZG文件中整合了大量的原始数据和相应的运算器规则.如图1所示,TOP中包含了一个辅助处理器,用于完成各种事务性工作,如管理存储器、管理运算任务、管理I/O操作、管理SZG文件的传送和管理TOP的重构规划等,鉴于这些工作中的大部分与电子计算机的事务性工作相同,而电子计算机的操作系统已经完善了这些方面的技术,故目前用一个电子处理器来担当辅助处理器,其上运行流行的操作系统,再加上研究团队开发的TOC任务管理软件、处理器重构软件和SZG文件传输软件,构成了TOC的底层软件系统.这个辅助处理器使得TOP充分利用了计算机科学和技术已取得的各种成果.
在概念上,以2个计算核心的底层软件为基础,安装常见的程序语言,如C、C++等,再补充上研究团队开发的SZG文件传送扩充指令和生成SZG文件的软件,就形成了这个多计算中心系统的编程平台.在实施上,这个编程平台运行在程序员手边的计算机上,编制的应用程序和多个SZG文件都保存在电子处理器的非易失性存储器中.应用软件工作时,在电子处理器上运行应用程序,由应用程序在运行时将SZG文件送到TOP去进行计算,并等待TOP回送结果文件.
当电子处理器和TOP地理距离较远时,两者通过网络连接,这时图1中2个操作系统共用的虚线段为网络通信链路.当2个计算核心地理距离临近时,两者可以通过USB连接,这时2个操作系统共用的虚线段为USB链路.当2个计算核心在一个机箱中时,电子处理器可以同时承担TOP的辅助处理器.当TOP作为一个计算结点而位于超级计算机系统中时,图1中的电子处理器代表一个或多个电子计算机结点,它们之间通过超级计算机的内网相互连接.无论两个计算核心之间如何连接,程序员只看到完全一致的编程平台.
SZG文件为用户编写应用程序提供了TOC的一个简洁虚拟机,遮蔽了TOC硬件和底层软件的细节,成功地协调了电子计算机和TOC在应用特性上的差异.SZG文件传送机制为用户遮蔽了2种处理器的连接关系,从而实现了电子计算机和TOC在一个应用程序中协调工作.因此,SZG文件成为编程应用TOC的必需技术.经过对SZG文件的反复试验、试用、分析、修正和补充,目前可以确定它具有以下优势:
(1)保持编程习惯.采用SZG文件后,程序员可以保持编制应用程序的基本习惯.一般而言,编制应用程序时会沿用以下步骤和习惯:
① 对应用问题进行数学描述,也就是建模.
② 按建立的数学模型组织数据,包括:确定各类操作数和相应的运算规则等.
③ 构造出解决问题的各种流程图,如数据流图、控制流图、伪码程序等.
④ 按照程序流程图写出指令序列.
⑤ 在程序的前部设置运行环境、变量、常量、初始化系统等.
⑥ 在程序的适当位置写出运算指令.
⑦ 判断运算结果,确定程序转移或结束.
应用SZG文件编制TOC的应用程序时,仍然保持了上述7个基本步骤和习惯,仅是在①中要考虑到有了一个新的计算工具——复合运算器或简单结构量计算机,故要考虑哪些量用TOC计算更有效.在②中要考虑将适合TOC计算的数据和相应的运算器构造参数组织成SZG文件.在⑥中要使用扩充的操作指令将SZG文件送TOC,然后根据具体情况使程序执行其它任务或等待TOC返回运算结果.新增的工作是生成SZG文件,这可以与写程序的过程分开,由不同的人分别完成,从而使这2个繁琐工作同时进行,且互不干扰.TOC更新后只需升级SZG文件,无需经常增加编程指令.
(2)多用户共享TOP.多个用户可以分别将自己的SZG文件送入同一个TOC,并等待各自的运算结果返回.如果几个用户的SZG文件对TOP而言不产生矛盾,TOC就会将这几个SZG文件合并处理,使它们共享一个TOP.对于熟知SZG文件和TOC的程序员,也可以将多个任务的SZG文件合并成一个SZG文件,实现多任务共享TOP的应用程序,或将一个任务中可以并行计算的部分组织在一个SZG文件中,实现一种新的并行计算技术.
(3)提高系统效率.当TOC接收到多个SZG文件后,就能知道各个SZG文件的运算要求、数据位要求和总的计算工作量,于是可以根据自身的当前状况,如有多少可用数据位、已构成了什么样的运算器等,来统筹安排各个SZG文件的数据位和计算时机,并适度合并几个SZG文件等,使整个系统的效率得以提高.另外,SZG文件和SZG结果文件都是用一条指令来传送一个文件,而这2个文件都包含了大量的数据,其通信效率远远高于每个指令传送一个数据的通信方式,从而有效减轻了通信压力,进一步提高了系统的整体效率.
(4)电子处理器与TOP协同工作.从方便用户编程和保持运行应用程序的习惯考虑,设计SZG文件的工作方式时,将应用程序运行在电子计算机上,未运行的SZG文件和结果文件也存储在用户端的外存中,只是当应用程序运行到适当的时机才将SZG文件送TOC.虽然TOC计算SZG文件中的数据比电子计算机快很多,但仍需一个较长的时间,有经验的程序员可以在把SZG文件送TOC后让电子计算机运行其它工作,只是在一段时间后检查一下结果文件是否返回即可,利用这种工作模式可以实现2种计算机为一个任务服务.显然,在这个情景中可以把TOP视为电子计算机的协处理器,但在以SZG文件计算为核心的程序中又可把电子计算机视为TOC的数据预处理机.因而视2种计算机是完成同一个任务的协同工作机,更为合适.
目前,SZG文件是TOC获知用户运算意图的惟一途径,SZG文件由文件头和操作数据(文件体)2部分组成.文件头记录用户需要的各个运算器的构造参数和操作数据的整体参数,文件头中的信息主要是为重构光学处理器提供参数,数据区是用户输入的操作数,包含操作数b和操作数a.为确保对用户意图的无歧义理解,用户构造SZG文件和TOC识读SZG文件必须是完全一致的格式.因此,SZG文件格式定义是这项技术的核心.
在设计SZG文件格式时,研究团队采用的原则有:
(1)文件头包含任务的整体信息和用户要求的运算器.TOP的按位可重构和按位可分配之特点决定了要先重构好运算器,才能计算用户的数据,故文件头要包含重构处理器的全部信息.另外,TOC的任务管理软件要选择针对该任务的调度策略,所以文件头中还要包括用户的优先级、数据总量和数据位数等信息.
(2)便于解析.由于TOC的任务管理软件运行在一个辅助PC上,该PC在解析SZG文件时以32位或64位的二值数据为单位,故SZG文件头的设计也要同时以32位和64位二值数据为基本单位,以方便辅助PC对文件头的解析.
(3)避免冗余信息.文件头中包含的冗余信息会占用存储空间和浪费通信带宽,必须被清除.
(4)预留必要的扩展位.随着TOC解决问题的能力越来越强,SZG文件的功能和内容也会不断丰富和变化,为了适应这种发展,必须在SZG文件头的合适位置预留一些位数,以便SZG文件版本升级.另外,为了便于解析,预留的扩展位也起到使关键信息的字段同时凑成32位和64位数据的作用.
遵循上述原则,最新设计的SZG文件格式第3版(SZGSJWJGS-JY-ZHSL2015)如图2所示.图2(a)为SZG文件的总体格式;(b)为针对简单数据类型SZG文件的运算标示格式;(c)为针对结构数据类型SZG文件的运算标示格式;数字序号1)~10)为字段编号,而10-i)(i=1,2,…,17)表示字段10)中的分字段编号;每个字段名称后面的括号中的数字表示该字段所占用的位数,每个计算标示可描述1种运算,1个SZG文件最多可描述 1 280 个不同的运算.
图2 三值光学计算机运算-数据文件格式SZGSJWJGS-JY-ZHSL2015版Fig.2 Computing-data file format of SZGSJWJGS-JY-ZHSL2015
遵守SZG文件格式,可以用任何文字编辑软件生成具体的*.SZG文件,但对一般用户而言,用这种方法写出正确的SZG文件很困难.为减轻使用TOC的难度,研究团队提供了初始SZG文件的生成软件[10],以及从已有的SZG文件和SZG结果文件中生成新的SZG文件的指令集.本文论述的核心是SZG文件本身的功用和结构,故文中仅介绍生成简单数据类型的初始SZG文件的方法,并以这种SZG文件来展现本文的核心内容.
图3 简单数据类型SZG文件的输入界面Fig.3 Input interface for simply data type SZG file
随着SZG文件格式的更新,生成初始SZG文件的软件也在逐步升级.该软件为用户提供一个输入界面,图3所示是该软件的最新版本(SZGSRRJ-LS2015)生成简单数据类型SZG文件的输入界面[16],它与图2(a)和(b)所示的简单数据类型SZG文件格式配套.用户只需在这个界面上输入所需的各个运算规则和对应的原始数据,点击“生成SZG文件”按钮,该软件自动将界面上输入的各类信息生成SZG文件,并按用户给出的存储路径和文件名保存之.
软件SZGSRRJ-LS2015包含3个主要功能模块:
(1)信息输入模块.该模块的任务是协助用户输入构成SZG文件的各种信息,并对输入的信息进行格式和匹配性检查.
(2)SZG文件生成模块.该模块的功能是将由输入界面送入的信息组织成本地非易失存储器上的SZG文件.
(3)运算结果显示模块.该模块的功能是将SZG结果文件中的运算结果显示在用户输入界面的最右边列.
具体输入过程及图3中各输入信息的含义将在下文的实验部分介绍.
当SZG文件被高级语言的扩充语句送入TOC后,处理过程可分为4大步骤:
(1)接收SZG文件并将其分类;
(2)解析SZG文件获得重构信息,并重构TOP;
(3)从SZG文件中取出数据、整理数据并计算;
(4)收集计算结果生成结果文件,并把结果文件返回用户程序[17-18].
对任何程序语言增添少量扩充指令后,都能在其应用程序中使用SZG文件,目前已经完成了对C语言的扩充指令和对MPI的扩充指令[10-11].C语言扩充指令的后台支持包含在插件SZGX中,在C语言平台安装这个插件后,在应用程序中能使用的扩充指令有:
(1)void SZG_Init().建立针对SZG文件的扩充指令环境.它必须是程序中出现的第一条扩充指令,且只允许出现一次.
(2)int SZG(char *path).将path所指的SZG文件发送到TOP.
(3)int SZG_SearchResult(char *path).查询path所指的SZG文件在TOP上的运行状态.
(4)void SZG_Suspend().挂起本程序,直到对应的结果文件返回时被唤醒.
另外,在应用程序的头部还必须加上头文件#SZG.h.对于其它程序语言的扩充与此类似,不再赘述.
文献[10]中对SZG文件第1版的有效性进行了严格的实验,文献[11]中对SZG文件传送机制进行了严格的实验,因此本文仅对图2给出的SZG文件第3版的有效性进行实验,对仍然保持原有技术的其余部分不重复实验.
考虑到SZG文件的功用在于为应用程序员屏蔽掉TOC的硬件特征,其作用范围在应用程序和TOC任务管理软件之间[18],而任务管理软件是运行在辅助处理器上的一个 C++ 程序,故本实验可以在由多台电子计算机构成的TOC软件模拟实验环境中进行,该模拟实验环境中的计算机通过局域网相互连接.对应于图1所示的多核心计算机系统,在该实验环境中用一台电子计算机模拟TOP的辅助处理器,其上运行TOC的底层软件,称为后台机;在另一台电子计算机上运行图1中的编程平台,形成完整的程序员手边计算机,称为前台机.鉴于本实验的目标是验证SZG文件新版格式的有效性,设计实验步骤为:
(1)在前台机上分别生成SZG文件和应用程序.
(2)在前台机上运行应用程序.该应用程序中包含将SZG文件送TOP的扩充指令.
(3)在后台机查看收到的SZG文件内容.
如果该SZG文件的内容符合图2给出的新版格式,则本SZG文件新版的有效性得到证实,否则该新版格式失效.
实验用例:程序中包含4个简单数据类型的计算,分别是f1=a+b,f2=c-d,f3=e∧g和 f4=h∨i.其中自变量a和b为8位十进制数,共有20万对原始数据;c和d为5位十进制数,共有10万对原始数据;e和g为5位三值数据,值域为{X,Y,Z},共有10万对原始数据;h和i为7位三值数据,值域为{M,N,P},也有10万对原始数据.
图4 SZG文件起始部分的内容Fig.4 The contents in the beganing section of SZG file
4.2.1生成SZG文件 运行生成初始SZG文件的软件(如SZGSRRJ-LS2015),在图3所示界面上的“文件名”栏输入jy,即设定该SZG文件的名称为jy.SZG,存储在当前目录下;在“运算器名”栏输入s1,即定名第一个运算器为s1;在“数据位数”栏填入8,则在10-1)和10-2)字段都记入8H;“运算结果位数”栏输入9,因为f1的原始数据为8位十进制数,考虑到可能有进位,故运算结果的位数取9位十进制数,于是在SZG文件头的10-4)字段记入9H;在“运算规则”区选择“+”;将20万对原始数据逐对从“操作数A”和“操作数B”栏送入;送入过程中如果某个数据不足8位十进制数,可点击“确定”,来开始下一个数据的输入.图3给出了输入完f1运算的第32个原始数据后,在左侧查看已输入数据(前21个)情况的屏幕截图.当f1的所有原始数据输入完毕,点击“下一运算器”,则“运算器名”后的“1”自动变为“2”,然后在其后的栏内键入s2;在“运算结果位数”栏输入5;在“运算规则”区选择“-”;“数据位数”栏填入5;将10万对原始数据逐对从“操作数A”和“操作数B”栏送入.点击“下一运算器”,在“运算器名”栏输入L1;在“运算结果位数”栏输入5;在“逻辑运算变量字符A、B和C”的栏中分别送入X、Y和Z;在“逻辑运算真值表”栏送入三值合取(∧)运算的真值表;“数据位数”栏填入5;将10万对原始数据逐对从“操作数A”和“操作数B”栏送入.点击“下一运算器”,在“运算器名”栏输入L2;在“运算结果位数”栏输入7;在“逻辑运算变量字符A、B和C”的栏中分别送入M、N和P;在“逻辑运算真值表”栏送入三值析取(∨)运算的真值表;“数据位数”栏填入7;将10万对原始数据逐对从“操作数A”和“操作数B”栏送入.点击“检查/修改”对所有输入内容进行检查和修正.检查无误后,点击“生成SZG文件”.检查当前文件夹看到jy.SZG 文件已经存在.
4.2.2编制应用程序 应用程序的名称为 xbSZG,在该程序中加入头文件#SZG.h.程序中使用扩充语句送d:szgjy.szg到后台机.
4.2.3在前台机上运行应用程序xbSZG 本实验仿照实际情况将应用程序运行在前台机中,在运行时,应用程序包含的扩充指令将SZG文件送入后台机.
4.2.4在后台机上查看SZG文件的有效性 在后台机上查看磁盘文件,找到了jy.SZG文件,说明实验中的应用程序xbSZG已经通过SZG文件传送机制将正确的SZG文件送达TOP.
进一步用UltraEdit文本编辑器显示后台机磁盘上jy.SZG文件的二进制内容,图4所示是SZG文件起始地址部分内容的截图.图中:最前面的2个字节给出了这个SZG文件所依据格式的版本号0300H;随后在绿色框中的30个字节给出了这个文件的名称jy的ASCII码6A和79;随后的红框中给出的是所用计算机的IP地址:192.168.10.1;黄色框中的 4表示本SZG文件包含4个运算标示;4个蓝色框中前两个字节顺序给出本例中4个运算标示的名称s1、s2、L1和L2,后3个字节给出各运算器使用的字符,其中 00 00 00 表示该运算为数值计算.
图5所示是SZG文件头部中前几个运算标示的截图.图中:红、蓝、黄、绿4个色框中顺序是4个运算器s1、s2、L1和L2的运算标示,红框位于1928H-1937H地址,与图2的设计一致,其中前2个字节的内容为 08 08,记录了s1的2个输入数据都是8位十进制数;随后的4个字节记录了s1的原始数据个数,在本例中为20万个数据,十六进制表示为 03 0D 40;随后一个字节中的9记录了该运算器输出的计算结果的十进制位数;随后的一个字节为预留,取值00;再后的3个字节给出s1的运算规则,加法的编码为 04 00 00;最后的5个字节给出s1运算器的原始数据在该SZG文件数据区中的偏移地址,由于s1是第一个运算器,所以这个偏移地址为0,其对应的物理地址为5000H.其余3个运算标示的含义与此类似,不再赘述.(f2数据从18BA00H开始,偏移地址为186A00H.f3数据从21E1C0开始,偏移地址为2191C0.f4数据从27FC40开始,偏移地址为27AC40).
图6所示是该SZG文件数据区的截图.图中:蓝色框中是s1运算器b的操作数的前21个数据.
图5 SZG文件中间部分的内容Fig.5 The contents in the middle section of SZG file
图6 SZG文件数据区的内容Fig.6 The contents in the data section of SZG file
图4~6表明,后台机收到的SZG文件完全符合图2给出的SZG文件第3版格式,并且该SZG文件送达三值光学计算机后,能够被TOC的底层软件正确解读.完成解读后,TOC底层软件就能正确获得用户在SZG文件中给出的运算和数据信息,从而得到构造各个运算器的必要参数和所有原始数据,进而完成计算任务.这个测试说明,图2给出的SZG文件格式功能有效.
三值光学计算机的众多数据位数,这些数据位可以被任意分组,并分配给不同的用户使用,每个数据位的计算功能可以在运行时重构的特点是电子计算机所没有的特性,这些特性带来了新的并行计算能力,同时也强烈冲击着传统的编程技术.TOC研究团队创立的SZG文件将TOC的特征包含在一种特定格式的文件中,并以SZG文件作为扩充指令的操作对象,实现了在保持传统编程思想和编程技术的前提下,充分发挥TOC优势的编程技术.数年的研究成果及模拟实验表明SZG文件是将TOC的优势融合于传统编程技术的有效途径,这一途径不仅为TOC的应用提供了有效的技术,还实现了电子计算机与TOP的协同工作方式.显然,这种工作方式很容易移植到其它种类的处理器,使用每种处理器各自的运算-数据文件和对程序语言的相应扩充指令,就可实现多种不同体系结构的处理器协同工作,对于高性能计算和超级计算机系统,这是很有意义的并行工作方式.