ATLAS在龙芯2F上的访存优化
发布时间:2020-09-19 14:42
BLAS是很重要的标准数学库,它主要是一系列矩阵与向量基本操作的集合,其运算性能的测试也是高性能计算机的重要评测手段。为发挥国产龙芯2F微处理器的计算性能,本文在基于龙芯2F处理器的高性能计算机系统KD-50-I上进行BLAS通用优化版本ATLAS的针对龙芯体系结构的优化。 本文首先介绍了BLAS的函数功能,并着重分析了ATLAS实现时采用的矩阵和向量的存储数据结构。不同的函数具有不同类型数据结构的参数,直接影响到ATLAS对各函数的优化和实现。随后介绍了龙芯2F体系结构,特别是对程序性能影响最大的流水线结构和存储器结构特点。 基于龙芯2F体系结构特点和ATLAS各级函数的运算特征,提出一系列方法来优化ATLAS各函数的性能。主要的优化目标在于函数的访存方式,通过调度指令,尽可能地将计算时间隐藏于访存之中,同时有效利用内存以及cache特性,减少内存访问时间,以达到加快程序运行的目的。 然后,根据BLAS二级函数的特点,将对BLAS2的优化目标确定在对内存的访问方式上,通过循环展开减少内存访问次数,并利用龙芯2F的非阻塞cache机制形成内存访问流水线,加快内存访问速度,消除ATLAS函数运行时的性能波动,最终将BLAS二级函数性能提升30%以上。 最后,通过对cache的有效利用,采用数据预取、矩阵分块以及部分拷贝等手段来减弱大规模参数下函数产生的cache失效问题,并使用循环展开方法减少对内存和cache的访问次数,优化后的BLAS3单精度函数性能较ATLAS提高近80%,而双精度函数性能提升50%以上。 本文提出的各种方法对即将推出的龙芯3号处理器上的高性能BLAS实现有重要的参考意义。
【学位单位】:中国科学技术大学
【学位级别】:硕士
【学位年份】:2009
【中图分类】:TP332
【部分图文】:
的 cache 中,内存中的许多块都可能映射到 cache 的同一组得当程序需要使用某一曾在 cache 中,但现在已被替换出的冲突失效。龙芯 2F 的 cache 便是四路组相连,并且采用随机问方式上来说,冲突失效出现是否频繁跟访问是否连续有路 cache 的分块,如果连续存储,则必然不会存在映射于同也就不可能出现 cache 冲突失效。但是如果是间隔存储,,其中就很可能存在大量数据块映射于同一组 cache,出现据的地址分布密切相关。3 是双精度矩阵向量乘函数(dgemv)经过部分优化前后的emv 在矩阵规模为 512 的倍数时会发生明显的下降,而且越为严重。
emv 函数的优化主要体现在循环展开方式、指令的调度和矩阵分块的作用是减少大规模矩阵运算中的 cache 容量失算过程中只访问一遍矩阵数据,而需要重复访问的只是两经过拷贝连续存储后所占用的空间已经很小,多次读取向不大,因此矩阵分块与否对整体性能影响很小,在多次的块方式对函数的性能影响并不明显,因此在优化后的函数
= *x;+= A0[ aij ] * x0; y1 += A1[ aij ] * x0;+= A2[ aij ] * x0; y3 += A3[ aij ] * x0;+= A4[ aij ] * x0; y5 += A5[ aij ] * x0;+= A6[ aij ] * x0; y7 += A7[ aij ] * x0;…= x[7]; x += 8;+= A0[aij+7] * x7; y1 += A1[aij+7] * x7;+= A2[aij+7] * x7; y3 += A3[aij+7] * x7;+= A4[aij+7] * x7; y5 += A5[aij+7] * x7;+= A6[aij+7] * x7; y7 += A7[aij+7] * x7; y0; Y[1] = y1; Y[2] = y2; Y[3] = y3; = y4; Y[5] = y5; Y[6] = y6; Y[7] = y7; Y += 8;展开循环后 sgemvt 运算速度提升到了 240Mflops 左右(图 30%,但非 8 倍数规模下的性能很低。
本文编号:2822638
【学位单位】:中国科学技术大学
【学位级别】:硕士
【学位年份】:2009
【中图分类】:TP332
【部分图文】:
的 cache 中,内存中的许多块都可能映射到 cache 的同一组得当程序需要使用某一曾在 cache 中,但现在已被替换出的冲突失效。龙芯 2F 的 cache 便是四路组相连,并且采用随机问方式上来说,冲突失效出现是否频繁跟访问是否连续有路 cache 的分块,如果连续存储,则必然不会存在映射于同也就不可能出现 cache 冲突失效。但是如果是间隔存储,,其中就很可能存在大量数据块映射于同一组 cache,出现据的地址分布密切相关。3 是双精度矩阵向量乘函数(dgemv)经过部分优化前后的emv 在矩阵规模为 512 的倍数时会发生明显的下降,而且越为严重。
emv 函数的优化主要体现在循环展开方式、指令的调度和矩阵分块的作用是减少大规模矩阵运算中的 cache 容量失算过程中只访问一遍矩阵数据,而需要重复访问的只是两经过拷贝连续存储后所占用的空间已经很小,多次读取向不大,因此矩阵分块与否对整体性能影响很小,在多次的块方式对函数的性能影响并不明显,因此在优化后的函数
= *x;+= A0[ aij ] * x0; y1 += A1[ aij ] * x0;+= A2[ aij ] * x0; y3 += A3[ aij ] * x0;+= A4[ aij ] * x0; y5 += A5[ aij ] * x0;+= A6[ aij ] * x0; y7 += A7[ aij ] * x0;…= x[7]; x += 8;+= A0[aij+7] * x7; y1 += A1[aij+7] * x7;+= A2[aij+7] * x7; y3 += A3[aij+7] * x7;+= A4[aij+7] * x7; y5 += A5[aij+7] * x7;+= A6[aij+7] * x7; y7 += A7[aij+7] * x7; y0; Y[1] = y1; Y[2] = y2; Y[3] = y3; = y4; Y[5] = y5; Y[6] = y6; Y[7] = y7; Y += 8;展开循环后 sgemvt 运算速度提升到了 240Mflops 左右(图 30%,但非 8 倍数规模下的性能很低。
【引证文献】
相关硕士学位论文 前1条
1 马萌;面向程序访存特征的存储优化技术研究[D];国防科学技术大学;2011年
本文编号:2822638
本文链接:https://www.wllwen.com/kejilunwen/jisuanjikexuelunwen/2822638.html