8x8矩阵NxN矩阵.docx
文本预览下载声明
《计算机系统结构》实验报告专 业: 年 级: 学 号: 姓 名: 评 分: 2013年11 月 21 日题目名称Windlx编写和实现两个8*8矩阵乘法程序题目内容使用windlx编写8*8矩阵的乘法程序观察并分析程序运行时流水线的状态分析使用前向数据关联和不使用前向数据关联时的流水线差别,观察其对运行速度的影响分析并改进使用多个加法器乘法器,观察其对运行速度的影响实验步骤及结果利用windlx环境编写的程序主要分为三个模块:1.输入模块 2.运算模块 3. 输出模块。结构图如下:其中输入模块的主要功能是读取输入的矩阵元素,然后存储到内存空间中去;运算模块的功能是分别读取矩阵1和矩阵2的元素进行乘法和加法运算,按照矩阵的行和列分别进行换行和换列操作,将计算结果对应存储到输出矩阵的存储空间中去,结构图如下:输出模块主要功能是对存储的计算结果进行格式化输出,使输出的结果构成一个矩阵的形式。在实验过程中,我首先完成的是输入模块和输出模块的编写工作,首先要把输入的矩阵数据存到存储空间中去,然后再用输出模块观察是否数据都已存储正确,这是整个程序测试的基础,其中因为输入两个8*8矩阵要输入128个元素,是一项非常繁琐的工作,所以我改进了一下输入模块,增加了一个重复赋值的功能来自动设置两个矩阵中的元素,便于以后的乘法测试;而输出模块也增加了格式控制,使输出形式成为矩阵的形式,便于观察。输入时可以采用两种输入模式,示意图如下:在windlx中实现时,手动输入方式截图如下:得到计算结果如下:与matlab计算结果相比较,发现结果计算正确使用程序设置的自动输入模块,自动设置的两个矩阵如下所示:得到结果如下(经过简单的计算可以验证是正确的)观察程序的单步运行时的流水线工作流程:发现程序可以以流水线的方式执行可以观察到程序在执行时会根据if指令进行跳转及设定延时等操作,来使流水线可以正常运行。分析程序在处理数据相关时采用的方法:在程序的输入模块中有如下三条指令:subir3,r3,48multu r1,r1,r4add r1,r1,r3这三条指令是会发生先写后读相关的,而观察程序时运行时(默认采用前向数据关联)的流水线,发现流水线中会利用专用数据通路将前面寄存器r3和r1的值送入到第三条指令的执行部分而如果取消前向数据关联,流水线运行状况如下图:由上图可以见到,在取消了前向数据关联之后,相关的数据通路被取消了,同时可以看到,三条指令的运行完成时间也加长了(从11个时钟周期变为13个时钟周期),对应整个程序的运行时间也加长了(使用MatrixF.s :采用前向数据关联会比关闭前向数据关联的速度加快20s左右)。设置多个乘法器与加法器,观察其对运行速度的提升:在进行这一步时,我发现我第一次编写的程序在使用不同个数的加法器乘法器时并没有出现运行速度上的区别,经过观察代码,我发现我第一次编写的程序在有这样的特点:在每个循环只执行一次乘法,相邻的两次乘法和加法之间夹杂着大量其他的指令,这样会导致即使使用多个加、乘法器,程序运行也很难同时并行执行多个乘法和加法操作,所以我又改进了原来的MatrixC.s的程序的计算部分,重写其中的循环和乘法部分,同时进行8个乘法运算,然后利用向量处理机里面单一向量组的元素求和的算法来来计算八个乘法的结果的求和(可以有效减少指令之间的相关),重新运行之后,得到运算结果如下图所示。使用单个加、乘法器(s)使用8个加、乘法器(s)改进前的运行速度103103改进后的运行速度5131可以看到,在改进后的运行速度有较大的提升,由改进前的103秒变为现在的51秒,同时使用多个加、乘法器时也有了相应的性能提升(加快了约20s) 程序代码 见附录:MatrixC.s :这个程序是按照最初思路写的,优点是可以通过修改程序中的几个参数便可以实现不同阶数的矩阵乘法的运算,使用的寄存器较少且数目固定,具有比较好的可扩展性;缺点是基本还是按照高级语言编程的思路来编写的,运算速度比较慢。MatrixF.s :这个程序是专门针对8*8矩阵的乘法做的优化,优点是运算速度相比之前的程序有较大提升,并可以通过使用多个乘法器和加法器来加快程序运行的速度;缺点是使用了大量的寄存器,扩展到不同阶数的矩阵乘法运算需要修改比较多的代码,并且在阶数过高时这种多个乘法并行执行的方式会出现瓶颈(寄存器的数目不足以同时存储一行和一列的元素),需要重新设计实现方式。心得体会编写这个程序前前后后一共做了6个版本,从版本1的实现输入输出功能到版本2对2阶矩阵的测试,再到版本3完成8*8矩阵的正确运算,到版本4又加入了自动输入模块并完善了输出格式,到版本5时又重新优化了一下程序,减少了循环中的一次不必要的乘法,减少了一个寄存器的使用,又增加了几个输出
显示全部