三值光学计算机的初始SZG文件生成软件
2018-05-16刘跃军周时强
李 双,金 翊, 刘跃军,周时强
随着三值光学计算机(ternary optical computer,TOC)第一台整机系统——SD11的问世[1-7],TOC的应用研究已成为学者们关注的焦点.为了使TOC应用程序更好地发挥TOC的优势,同时能在编制时保持传统习惯,TOC研究团队采取了将TOC的应用特征隐藏于“运算-数据文件”(即SZG文件)中的策略,使SZG文件成为应用程序员使用TOC的主要桥梁,其功用近似于用户通过OpenACC程序使用的GPU或MIC等加速器[8].但SZG文件的工作原理与OpenACC完全不同.SZG文件更容易理解,更方便组织原始数据和运算,对已有原程序的改写和调试也更容易,编译好的目标软件无需因TOC硬件的更新而重新编译,且SZG文件技术也很容易扩展到对其他种类加速器的使用中.SZG文件技术将成为各领域学者使用TOC的常用编程技术,而方便地生成SZG文件是这一重要编程技术得以广泛应用的关键问题.SZG文件被分为简单数据类型文件和结构数据类型文件两大类,与TOC目前的发展状态相呼应.简单数据类型SZG文件是当前的研究重点,因此本工作主要研究该类型SZG文件的生成策略和生成软件.
经过近几年的发展,SZG文件的功能越来越接近实际使用的需要.Jin等[7]在TOC上实现了一种除法例程.该除法例程通过SZG文件向光学处理器提交用户请求和所需参数,实现了处理器位数的按需分配.胡晓俊等[9]基于TOC实现了40位乘法例程.该乘法例程通过SZG文件将用户的运算请求送入TOC中,使得用户在整个处理过程中无需了解例程本身的实现过程就可完成其运算请求.张茜等[10]在TOC上实现了矢量矩阵乘法,通过SZG文件将大量数据整合在一起发送给光学处理器,很大程度上降低了出错的概率.伴随着这些研究的不断深入,对SZG文件的要求也越来越高.鉴于此,2015年,第3版SZG文件问世.该版本包含了丰富的计算类型和详细的数据特征分类,已成为开发TOC应用程序的重要基础.为适应这一进展,TOC研究团队重新提出了SZG文件生成策略及相应的算法,并依据新的算法设计出SZG文件生成软件.SZG文件的生成分为两个分支:一个研究如何从已有SZG文件和计算结果文件来生成新的SZG文件,称为SZG文件链的生成;另一个研究将用户输入的大量原始操作数和所需的运算规则组织成SZG文件,称为初始SZG文件的生成.显然,后者是前者的基础,也是TOC联机操作的途径,因此获得了优先研究.本研究将全面介绍初始SZG文件生成的理论、策略和生成软件.
1 理论基础
1.1 SZG文件
TOC的优势可归结为处理器位数众多[11]、处理器位数可分组使用[12]、每个处理器位数的计算功能可在运行时重构这三大特征,而电子计算机则没有这三方面的能力.因此,在完全基于电子处理器特点而设计的常见编程环境中,无法编制出能发挥TOC优势的应用程序.如果针对TOC的三大特点重新设计一套编程环境,势必要求程序员学习和掌握更多的编程语言,而且要协调两种针对不同硬件的应用程序也会面临很大困难,很可能导致TOC与电子计算机在应用上的相互排斥.为解决程序员用熟悉的编程方式不能编制TOC应用程序这一问题,TOC研究团队创立了“程序员将计算规则和原始数据打包在SZG文件中,然后在程序中传送该文件给TOC去计算”的编程模式.在这个编程模式下,SZG文件为程序员消除了TOC与电子计算机之间的巨大差异.在保持传统编程理念、编程习惯和编程技术的同时,程序员能够方便地使用TOC提供的全新和高效的并行计算能力,实现两种计算机在同一个应用程序中的协同工作.
SZG文件是用户处理大批量数据时与TOC进行信息交换的唯一方式.用户输入的数据必须严格遵守SZG文件的协议才能被TOC识别并计算.SZG文件由文件头和数据区两部分组成.文件头用于记录*.SZG文件(*为用户给出的文件名通配符)的整体信息和用户的计算需求.TOC的任务管理系统将依据文件头中的信息为该SZG文件分配处理器位数资源,并重构三值光学处理器(ternary optical processor,TOP)[13-16].数据区用于存储用户输入的所有原始数据,并在TOC返回给用户的计算结果文件(*R.SZG)中放置计算结果.在SZG文件第3版中,文件头占26 920个字节,数据区为0∼(1 TB−26 920 B).图1给出了简单数据类型SZG文件第3版的格式.
图1简单数据类型SZG文件格式Fig.1 SZG fi le’s format of simple data types
图1 中字段(1)∼(10)是SZG文件的文件头(fi le head)部分.该部分记录了这个SZG文件的整体情况和必要参数,是为TOC节点的任务管理模块、处理器位管理模块和处理器重构模块服务的桥梁.在文件头中的字段(1)∼(9)是文件参数部分(fi le parameter),描述了这个SZG文件的整体情况,包括版本号(version number)、文件名(fi le name,即用户标识)、IP地址(IP address,即用户的通信地址)、优先级(priority)、预留1(reserved 1)、数据类型(data type,即哪一类运算)、运算标示数(sum of data indicator,即该SZG文件包含了多少种运算)、运算标示名(name of operation indicator,即某一个运算标示的名称,SZG文件总共有1 280个运算标示,故图中列出了1 280项运算标示名)、运算标示字符(characters of operation indicator,即三值逻辑运算中用于记录用户输入的3个字符,SZG文件总共有1 280组运算标示字符,故图中列出了1 280组运算标示字符名).字段(10)是运算标示(operation indicator,即运算标示的具体参数区,SZG文件总共有1 280个运算标示,故图中列出了1 280个运算标示名).图1的最右侧给出了一个简单运算的运算标示结构,包括数据b和数据a的位数(data bits of b,data bits of a,即所描述数据中的最多位数,是为该运算分配处理器位数资源的依据)、数据个数(sum of data,即该运算面对的具体数据量,是估算该运算任务量的依据)、结果的数据位数(data bits of result)、预留2(reserved 2)、运算规则(operation rule,即该运算要进行的运算规则,如加、减、与、或等)和数据块起始地址(start address of data block,即该运算数据在SZG文件中的偏移地址).
1.2 开发本软件的必要性
理论上,用任何一种文字编辑软件按照图1给定的格式都能生成初始SZG文件,但这样势必要求操作者熟知SZG文件格式,不能有任何输入错误,且必须保证图1中各个字段的顺序、参数、位数都完全正确,而这将花费大量的编制时间.即使生成了初始SZG文件,检查和纠错还会耗费大量时间和精力,因此这种方法实际并不可行.必须创立一种技术,使程序员不必知晓SZG文件格式的细节,就能很容易地编制出正确的初始SZG文件,否则以SZG文件为基础的TOC编程平台将成为无根之木、无源之水.本研究的重要意义和必要性正在于此.
随着TOC的问世,编制SZG文件的软件本身也是一个全新课题.SZG文件是一种全新的格式文件,其大部分字段的内容必须由用户输入,部分字段的内容可以从用户的输入中抽取,还有些字段的内容则要从用户的工作环境中获得.有些字段之间有相互制约性,当用户在某些字段内输入了特定内容后,就对其他相关字段的输入内容形成了限制.当用户违反了这些限制时,软件必须能够拒绝接受错误的输入值,并及时提醒用户更正.常见的文字编辑软件一般不考虑这些问题.数据库管理系统的输入界面技术虽然可以对输入的某些信息进行统计、限定输入值等,但它需要在庞大的数据库管理平台上工作,而且不便生成独立存在的SZG文件.本研究将数据库输入界面的一些技术与高级语言的文件操作指令相融合,再加上对SZG文件各字段关系与特征的深入理解,建立了一个新的完整算法,并以该算法为核心实现了初始SZG文件的生成软件.
从实用角度考虑,本软件首先要有十分友好的用户界面,达到无需培训就可使用的目的;其次要尽量少占用系统资源,达到不给用户端系统增加明显负担的目的;第三要及时将用户输入的信息保存到非易失存储器中,以免意外丢失;第四要能对已有的SZG文件进行追加和更新,以方便用户逐步完善和修改SZG文件.
基于上述考虑,本软件精心设计了一个能在显示屏上展现的用户输入界面.该界面上的每一个输入框都配有简明的提示信息.依照这些提示,用户能够准确地在各个输入框中键入正确的信息,而无需考虑这些信息对应于图1中的哪个字段.
本软件在接受用户输入信息前,先在内存中开辟了两个输入数据暂存区:一个称为文件头缓存区,另一个称为数据缓存区.文件头缓存区的结构和图1中给出的SZG文件头部分各字段的大小和顺序完全对应,因此可以根据各字段在SZG文件头中的偏移量来直接访问缓存区内的对应单元.这为快速查阅和更新各个运算标示(operation indicator)字段、填充各个数据个数(sum of data)字段、数据位数(data bits of b,data bits of a)字段和数据块起始地址(start address of data block)字段带来方便.数据缓存区则采用顺序存放和追加的方式,适应用户不断地送入原始数据.考虑到屏幕窗口编辑器EditBox在内存开辟的32 KB输入缓存区正好具有对输入数据进行顺序存放和追加的功能,故本软件引用EditBox控件构造原始数据输入框.相应地,该控件开辟的内存缓存区自然成为本软件的数据缓存区.
TOC众多的处理器位数使其特别适合对大批量数据进行计算.这一特点决定了初始SZG文件会包含大量原始数据.为了避免用户在输入过程中因突发状况(如突然掉电)造成数据丢失,本软件特别设计了一个计时器,保证每隔一段时间自动将两个缓存区中的数据保存到非易失性存储器中.
2 核心设计
2.1 软件主要功能和整体算法设计
本软件算法的概貌可用如图2所示的流程图表示.本算法的具体步骤可叙述如下.
步骤1 初始化各参数,i=1,j=0,n=0和全局变量fl ag=0,其中i用于记录当前的运算标示编号,j用于记录已经用过的运算标示数,n用于记录用户已经输入当前运算标示的原始数据对的总数,fl ag用于标记是否需要对操作数进行保存.
步骤2 建立运算标示信息输入缓存区szg fi le sign.
步骤3 接收用户输入的SZG文件名.当接收到的文件名在外存上不存在时,执行步骤4∼13.若已存在,程序进入图2左侧的检查修改部分,执行步骤14∼18.
步骤4 在外存新建该文件名的SZG空文件.
步骤5 将SZG文件格式中的版本号(字段(1))和文件名(字段(2))写入SZG文件,将IP地址(字段(3))、优先级(字段(4))、预留1(字段(5))设为默认值.
步骤6 接收运算标示i(1≤i≤1 280)的名称.若i未超过SZG文件设定的最大运算标示数1 280,则接收SZG文件的字段(6)∼(9)以及字段(10)中除“数据个数”和“数据块起始地址”以外的信息,并将满足要求的信息按照SZG文件进行格式化,保存至szg fi le sign中的相应位置.
步骤7 将szg fi le sign中缓存的信息写入SZG文件头的对应位置.
步骤8 启动定时器.
步骤9 接收用户在输入框中成对键入的操作数,并将其暂存入数据缓存区.操作数计数器n的值随着操作数的输入而累加.
步骤10 当数据缓存区满或收到保存数据命令时,判断fl ag值是否为1.若fl ag=1,说明有新的操作数输入,追加数据缓存区中的数据到SZG文件数据区的尾部.若fl ag=0,说明没有输入新的操作数,执行下一步.
步骤11 当运算标示i的操作数输入结束时,将计数器n的值以及该运算标示i的数据块起始地址写入第i个运算标示中的对应位置.
步骤12 接收到用户给出的SZG文件输入结束命令后,关闭定时器.此时在外存上已经生成了初始SZG文件.
步骤13 若用户给出检查或者修改命令,程序跳转到步骤3;否则,程序结束.
步骤14 打开步骤3中用户指定的SZG文件,将文件中字段(7)的值复制入变量j,并等待用户在输入界面上输入欲修改的运算标示i.
步骤15 当用户输入的运算标示i≤j时,将运算标示i的信息显示在输入界面上,并等待用户对该信息的修改或者查看操作.若用户对该运算标示的信息进行了修改,则将修改后的信息存入SZG文件的对应位置.
步骤16 若i>j,说明用户输入了新的运算标示项,则程序跳转到步骤6.
步骤17 若i=j,且用户输入了新的操作数,则程序跳转到步骤9.
图2 本算法流程图Fig.2Flowchartofthealgorithm
步骤18 若用户对SZG文件修改结束,则程序跳转到步骤13;否则,跳转到步骤15,继续执行修改操作.
2.2 输入界面设计
本软件的功能是协助用户通过原始数据和计算规则生成初始SZG文件,故用户输入界面的友好程度,以及引导用户输入信息的正确性、完整性和简洁性决定着本软件的成败.鉴于输入界面的重要性,本研究经过反复测试与修改,目前的输入界面如图3所示.界面上的每一个输入框前或按键上都有简明的提示信息,例如,左半部顶端的第一个输入框前有提示“文件名”,后面有提示“.SZG”.很明显地,这个输入框中应该填入用户为该SZG文件选择的文件名,如LS,其后的按钮上有字样“打开”,提示这个按钮的功能是“打开”前一个输入框中指定的SZG文件.图3所示的情况就是打开LS.SZG文件.如果非易失存储器中尚不存在这个文件,本软件就会在非易失存储器中新建这个文件,并打开.若LS.SZG文件已经存在,本软件就打开这个文件供用户修改和补充输入.其他输入框和按钮的提示情况相近,此处不再赘述.
图3 用户输入界面Fig.3 Input interface for the users
3 测试实验
本测试平台硬件配置为Intel(R)Core(TM)i5-2400处理器,4 GB内存,64位操作系统.软件环境为Microsoft Windows 7.编程环境为Visual Studio 2013.本测试采用白盒测试的条件覆盖法.
3.1 白盒测试实验
根据白盒测试技术,首先按照图2给出的算法流程构造测试用例,保证对程序中每个分支都至少执行一次.表1给出了拟定的测试用例和对应的实验结果.当观察到实验结果与理论期望结果一致时,在表1最后一列打“√”;当观察到二者不一致时,打“×”.由表1最后一列中的符号均为“√”可知,本测试中获得的程序运行状态和功能都与理论预测情况一致,故可以推断本软件有效.
表1 测试用例和实验结果Table 1 Test case and the experimental results
3.2 实例分析
为了验证算法的正确性,本软件还对多组数值运算(如加、减运算)、逻辑运算(如与、或、非运算)进行了功能测试.测试结果表明,本软件都能按照用户给出的运算要求和操作数生成与图1格式匹配的SZG文件.考虑到文章篇幅,下面仅用一个比较简单的具体案例来说明本测试的操作过程,同时简述使用本软件生成初始SZG文件的过程.
测试用例:f 1=a∧b,f 2=c∨d,其中自变量a,b为5位三值数据,值域为{X,Y,Z},共有10万对原始数据;自变量c,d为7位三值数据,值域为{K,M,N},共有10万对原始数据.
(1)生成初始SZG文件.
如图3所示:在“文件名”栏输入LS;在“计算器名”栏输入L1,标示第一个运算f 1;在“计算标示字符A,B和C”栏中输入X,Y,Z;在“真值表”栏中输入三值与(∧)运算对应的运算规则,从左到右第一排为Y,Z,Z,第二排为Z,Z,X,第三排为X,X,Y;“数据位数”栏输入5;“计算结果位数”栏输入5.完成上述信息输入后点击“保存运算标示”,将10万对原始数据逐对从“操作数a”栏和“操作数b”栏送入.
点击“下一计算器”,在“计算器名”栏输入L2;在“计算标示字符A,B和C”栏中输入K,V,W;在“真值表”栏中输入三值或(∨)运算对应的运算规则,从左到右第一排为W,V,K,第二排为K,K,V,第三排为W,V,W;“数据位数”栏输入7;“计算结果位数”栏输入7.完成上述信息输入后点击“保存运算标示”,将10万对原始数据逐对从“操作数a”栏和“操作数b”栏送入.
点击“检查/修改”对所有输入的内容与SZG文件格式匹配,修改无误后点击“生成SZG文件”.此时,在外存指定目录下可以看到LS.SZG文件已经生成.
(2)检查初始SZG文件的正确性.
用UltraEdit文本编译器显示LS.SZG文件的十六进制内容,如果如图4∼6所示.在图4中:红框是版本号和修改号(第3版的版本号为0300h);蓝框是30个字节对应文件名LS的ASCII码4C,53,未填满的28个字节为默认值0;黄框是用户的IPv4地址,默认为0;紫框的2表示共有两个运算标示,对应SZG文件头的字段(4)∼(7);绿框和橙框分别是两个运算标示的运算标示名和运算标示字符,文件头其余部分为缺省值0.
图4 SZG文件头参数Fig.4 Parameters of the SZG fi le head
在图5中,从1928h地址开始为运算标示开始部分.红框表示第一个运算器L1.05 05表示运算器L1中操作数a和操作数b的位数是5位,之后的4个字节00 01 86 A0表示运算器L1的10万个原始数据,其后的05表示结果位数,00表示预留位;接下来3个字节是L1的运算规则;最后5个字节表示运算器L1的原始数据在该SZG文件中数据区的偏移地址.同样地,蓝框是第二个运算标示的参数,经核对完全正确,此处不再赘述.
图5 初始SZG文件头运算标示部分Fig.5 Operation indicators of the SZG fi le head
在图6中,初始SZG文件的数据区从第26 920字节开始,即十六进制的6928h地址.红框的数据表示运算器L1中操作数b的部分值.在SZG文件中,用户输入的字符需要被全部转化为通信内码表示才能被TOC识别.例如:X对应字符00,Y对应字符01,Z对应字符10,它们的ASCII码转化为十六进制分别为30 30,30 31,31 30.
图6 初始SZG文件头操作数区Fig.6 Data area of the SZG fi le head
由图4∼6可以看出,生成的初始SZG文件与图1所示的SZG文件格式完全一致,算法正确性以及软件有效性得以验证.
4 结束语
随着TOC渐渐进入人们的视野,如何使用这种处理器位数众多、按需分配处理器位数资源和按需重构处理器硬件计算功能的新型计算机已成为广大学者关注的问题.以OpenACC为代表的常见编程平台都采用融合各计算机核之应用程序来实现异构系统协同工作的方法,但这种方法没有考虑为用户分配处理器位数资源和重构处理器硬件的计算功能.因此,TOC研究团队开发了以SZG文件为核心技术的异构系统编程平台.SZG文件为用户屏蔽了TOC硬件、底层软件和处理SZG文件的复杂性,仅仅展现出TOC的应用特征,便于用户理解和使用.考虑到用户把大量原始数据和计算要求组织成SZG文件非常困难,TOC研究团队设计了协助用户构造SZG文件的算法及生成软件,有助于用户高效使用TOC提供的强大计算能力.