更全的杂志信息网

一种基于遗传算法的BLAS库优化方法*

更新时间:2009-03-28

1 引言

基本线性代数子程序BLAS(Basic Linear Algebra Subprograms)是核心的线性代数函数库,包含了向量与向量、矩阵与向量以及矩阵与矩阵之间的线性代数运算操作。经过多年的发展,BLAS已广泛应用于科学和工程运算,在大规模矩阵运算时通过BLAS库优化可以充分发挥处理的运算性能,使浮点运算效率得到大大提升。目前主流的BLAS库分为专用和通用两种类型。专用型BLAS库主要用于优化特定的体系结构,在特定的平台上能够极大地提升线性代数运算性能,如Intel的MKL和AMD的ACML;通用型BLAS库具有可移植性,同时在不同的平台上取得了一定的优化效果,如ATLAS[1]、GotoBLAS[2,3]库。

OpenBLAS[4]与BLIS[5]都是基于GotoBLAS数学库的开源项目,在不同平台上都取得了不错的性能表现。具体来讲,中国科学院软件所目前主导并维护的OpenBLAS开源项目,源自美国德克萨斯大学的GotoBLAS软件,在绝大部分计算平台上取得了令人满意的性能,德克萨斯大学最新开发的BLIS开源软件也可以看做GotoBLAS的重写,其极大地简化了软件开发人员针对新计算平台开发BLAS的工作量。通常情况下,针对具体平台OpenBLAS和BLIS生成BLAS库性能要优于ATLAS生成的BLAS库。

BLAS库按其函数运算规律和运算类型可以分为三个级别:BLAS1包含向量与向量之间的运算,运算量较小;BLAS2包含向量与矩阵之间的运算,受限于访存;BLAS3包含矩阵与矩阵之间的运算,访存量和运算量较大,具有较大优化空间。其中GEMM是第三级BLAS中的核心函数,其它函数都是通过调用它来实现的。在对矩阵乘法GEMM进行优化时,需要充分利用计算机的多层存储结构,合理地组织数据在内存、Cache和寄存器之间的传输。矩阵乘法运算通过循环分块的方式充分发挥处理器的运算性能。在循环分块中,最重要的就是矩阵乘法分块参数的选择,如果选择的参数过大或过小,则会使Cache的命中率降低,流水线停顿,从而使矩阵乘法运算性能变差,因此选择合适的分块参数至关重要。这里需要强调的是OpenBLAS和BLIS都有类似的分块方法。

目前选择矩阵乘法分块参数的方法是通过理论分析[6],根据平台的具体体系结构计算出理论上的最优矩阵乘法分块参数。文献[3,7-11]分别针对龙芯处理器、GPU和ARM处理器,以及异构平台的GEMM的优化展开了深入研究,文献中对具体平台的体系结构,包括寄存器个数大小、Cache层次结构和大小等展开了详细分析,给出了分块参数选择的相关理论依据。同样,DGEMM自动生成技术也是科研领域的重点,文献[12,13]取得了非常不错的效果。上述自动生成技术主要建立在平台体系结构的理论分析基础上,没有加入性能测试并反馈测试结果的自动测试步骤。上述文献研究的部分成果在绝大部分情况下能够找到非常接近理论峰值的分块参数,但需要对平台深入了解。文献[14-18]主要研究了面向GPU平台的稠密矩阵乘法GEMM自动调优技术。文献[19]还研究了稀疏矩阵乘法的自动调优,这些自动调优方法加入了性能测试的分析。文献[20]则更侧重从负载平衡角度研究GEMM分块参数的选择,选择的搜索模式为对角搜索和迭代搜索的混合模式。上述自动调优技术本质是优化问题的求解,而对于优化问题,智能算法往往会有非常不错的效果。

本文基于OpenBLAS和BLIS开源线性代数基础算法库,对数学库中重要函数—稠密矩阵乘法GEMM运算的性能优化展开研究。在研究实现过程中,首先深入分析两个开源BLAS库的软件架构,理解稠密矩阵乘法多层分块并行计算实现的相关理论。接着针对如何选取稠密矩阵乘法分块参数这一问题,建立性能优化模型。该模型将关键分块参数作为输入,将稠密矩阵乘法的测试性能值作为目标函数。进一步,考虑到解空间(即各种分块参数组合)的范围较大,且目标函数的不可导,本文选用智能算法中应用较为广泛的遗传算法求解上述优化模型,将一些不同分块参数组合定义为一个种群,将某一分块参数组合(种群个体)所对应的稠密矩阵乘法的性能值作为该个体的适应度,通过不断迭代地进行选择、交叉、变异操作,找到最优的分块参数组合,使得稠密矩阵运算的性能值最优。基于上述设计思想,采用Python语言实现了利用遗传算法自动优化数学库性能的相关代码。数值实验结果验证了所提方法的有效性。

2 基于遗传算法的数学库优化方法

2.1 分块稠密矩阵乘法GEMM的实现简介

BLAS库中运算量最大的BLAS3级核心函数矩阵乘法GEMM的性能能够体现出微处理器的运算能力,根据处理器体系结构级和微结构级特性对GEMM优化的意义不言而喻。GEMM的核心公式是:

C=αA×B+βC

其中,CM×N的矩阵,AM×K的矩阵,BK×N的矩阵。GEMM算法在BLAS库中的实现主要通过利用计算机存储结构中的多级缓存使矩阵乘法通过循环分块的方法来实现,图1给出了GEMM矩阵分块算法以及存储层级关系。选取合适的矩阵分块[mckcnc]大小可以极大地优化矩阵乘法的计算效率。

  

Figure 1 Blocking and packing algorithms of GEMM图1 GEMM矩阵分块算法流程图

首先第一步是nc分块参数将矩阵B按照列方向分成宽度为nc的矩阵,这里要注意的是在多线程情况下,如果线程数nt比较多,而N值较小的时候,nc的取值将为N/nt,而不是在头文件中指定的值。接着分块参数kcmc在GEMM的分块算法中的具体操作如下:

“九三”的名字来源于北大荒人对9月3日抗日战争胜利的纪念,既代表着对民族抗争精神的传承,也蕴含着十万转业官兵对“战天斗地”拓荒精神的凝炼。九三集团从1985年在黑龙江省九三管理局破土动工的年加工6万吨大豆的油脂化工厂,发展到目前资产总额超200亿元,年加工大豆总能力1200万吨,销售收入超过450亿元,进出口贸易总额超过60亿美元,集种植、收储、物流、加工、营销全线资源的中国农业产业化领军企业,靠的就是从不服输、不甘落后的“抗争精神”和勇于突破、敢闯新路的“拓荒精神”。

(1)最外层循环(第一层循环)先将矩阵A按列划分成多个M×kc的子列矩阵,将矩阵B按行分为多个kc×nc的子行矩阵,并通过矩阵乘法累加计算出矩阵C

近年来,因火灾引起的车辆事故时有发生,按照起火原因,汽车火灾大致分为自燃、引燃、碰撞起火、爆炸和雷击五种类型,这五种类型的前三项,成为了司法鉴定的重点。本文结合一起实际案例,利用激光拉曼光谱法对现场残留物进行成分分析,使用“排除法”确证了现场起火的根本原因。保险公司的理赔工作提供了法律依据。[1-3]

(2)第二层循环的运算是将矩阵A的子列矩阵分为多个mc×kc的块状子矩阵,并通过与矩阵B的子行矩阵的矩阵乘法累加到矩阵C的行子矩阵,这一步运算的数据存储在L3 Cache中;

(3)第三层循环将矩阵B的行子矩阵按列分成多个kc×nr的列状子矩阵,将其与mc×kc的块状子矩阵进行矩阵乘法运算,这一步运算的数据存储在L2 Cache中;

(4)最内层循环(内核)将A的块状子矩阵按行分为数个mr×kc行子矩阵,并将此子矩阵与Bkc×nr列状子矩阵进行矩阵乘,此阶段运算数据位于L1 Cache中。

教师叙述的这个故事,描绘出一个自学成才的学生形象,并阐述了自己认同的观点,即学生要有自我意识,要学会自学。他在叙事过程中重新组织了自己的教学经验,将故事和观点进行了有机结合,对学生学习和自己教学进行了一次深刻的反思,通过这种方式生成了自己的实践性知识,可以说叙事就是教育经验的一种理论形式。

可以说相比于nc的值,kcmc对性能的影响更大一些。

2.2 性能测试流程

OpenBLAS库和BLIS库自动测试优化的主要思想是先根据处理器的各级缓存大小,理论分析一下处理器运行稠密矩阵乘法取得峰值时的各个关键参数的合理猜测值,并以该参数值为基准设置参数范围,然后在范围内选取若干值作为输入。将其写入OpenBLAS和BLIS的对应头文件中,然后编译并安装OpenBALS和BLIS,生成测试用的BLAS库。

在单次GEMM测试中,通过运行GEMM测试程序,调用所生成的BLAS库,将其运算的输入定位GEMM分块参数[mckcnc],输出为该参数组合下矩阵乘法性能值。在此动态连接库下测试出的结果就是基于具体分块参数运算出来的结果。图2给出了OpenBLAS下测试方法流程图。BLIS库下测试GEMM的方法与OpenBLAS库下的测试方法基本相同,BLIS库将新的mckcnc代入bli_kernel.h替换三个参数值DEFAULT_MC_DDEFAULT_KC_DDEFAULT_NC_D,生成BLAS动态链接库,并将测试结果值返回。

  

Figure 2 Test method of GEMM performance in OpenBLAS图2 OpenBLAS下矩阵乘法性能值测试方法

2.3 遗传算法优化模型

遗传算法GA(Gentic Algorithms)是模拟生物进化过程的计算模型,是启发式搜索算法的一种。主要思想是从一个可能出现最优解的种群中开始计算,通过自然选择优胜劣汰,每一代中适应度好的种群个体通过基因交叉、变异产生适应度更高的种群,经过多次遗传迭代,最终找到问题的近似最优解。遗传算法的一般解题步骤包含编码、初始化种群、评估适应度、选择、交叉、变异、迭代、终止条件判断等。

(1)通过理论分析设置初值参数的范围,并在该范围内生成指定个数的初始种群;

本文的遗传算法自动调优的思想如下:

英语视听说课程采用过程性评价和终结性评价相结合的考查方式。过程性评价占40%,关注学生在整个学习过程中所养成的良好的学习习惯、逐步建立起的独立思考能力以及与同伴沟通、合作的能力。过程性评价包含3个评价维度:学习态度与习惯(15%)、课堂表现(15%)、小组合作(10%)。终结性评价共有两次,分别在第8次和第16次课进行,以测试的形式考查学生对所学话题的掌握情况。

(2)将GEMM分块参数[mckcnc]定义为个体,将该个体通过2.2节的方法生成BLAS库,并将测试得到的GEMM性能值作为该个体适应度,计算初始种群中每个个体的适应度;

(3)通过选择、交叉、变异来不断对种群个体进行优化,通过指定的迭代次数最终得到适应度最高的种群个体,找到该个体的GEMM矩阵乘法分块参数,就是遗传算法所找到的最优性能值分块参数。

本研究基于吉尔的精力模型,提出了精力上限使译者在翻译过程中出现产出欠佳甚至是失败。因而,译员应当提高精力分配的协调能力,使译员在有限精力下完成同传任务。

图3给出了本文采用遗传算法自动调优GEMM的基本流程,算法使用Python语言编写。

  

Figure 3 Flow chart of the genetic algorithm图3 遗传算法流程图

2.3.1 编码

采取实值编码生成随机种群染色体,将随机生成的mckcnc值作为染色体参数,方便在进行适应度测试时将矩阵分块实值代入测试。编码程序如图4所示。

2.3.2 初始化步骤

初始化过程中,设置了每一代种群的个体数量,每个个体的染色体和核心的大小。每一个染色体代表了一种GEMM分块参数组合,这里有个限制条件:分块参数mckcnc分别是内核参数mrkrnr的整数倍。这里需要指出的是OpenBLAS针对不同平台的内核参数是不同的,BLIS也是同样,且针对同一平台,BLIS的内核和OpenBLAS的内核也不同。

编码程序如下:

村小在李打油眼里,是李湾唯一的最高学府。带我去报到那天,他当着全校师生郑重宣布,学校“借钱做衫裤——一身是债”的日子一去不复返啦!而且,当场给每位师生发一套服装。我记得很清楚,当时有二百五十三个学生,十九位老师,无论男女、师生,一律的白衬衣蓝长裤。是的确良的,大家都美滋滋地叫真凉快。

def initialize(self):

''' initialize the population '''

伦理不分国界,对受试者的关爱和保护不分国界。建议国内的伦理委员会在充分掌握、学习、申请国际伦理认证的同时,多总结教训、积累经验,以期根据我国国情、法规以及医药行业的现状等建立起符合我国实际情况的临床试验伦理认证协会(如中医药临床研究伦理审查平台),在同样确保伦理审查独立、公正之余更好地为中国受试者服务,保障他们的健康和利益[21]。

self.population=newpop

ind=GAIndividual(self.vardim,self.bound,self.kernel)

ind.generate()

self.population.append(ind)

2.3.3 评估适应度

遗传算法中对种群进行进化操作,以个体适应度大小评定个体的优劣程度,从而决定其遗传机会的大小。在本次实验中,计算种群中每个个体对应的GEMM性能值,并将GEMM的性能值作为适应度。

for j in xrange(0,self.sizepop-1):

2.3.4 选择

选取可行性较好的轮盘赌选择法为遗传算法的选择方法,策略是在选择时,种群个体的适应度所占总适应度概率范围越大,产生的随机数存在该范围区间内的可能性也就越大,因此适应度高的个体容易被选择。下面给出了轮盘赌选择法的部分实现代码:

增城万家旅舍是广州市增城区政府于2014年牵头创立,并协同农户和企业共同构建的民宿品牌,现由广州增城万家旅舍管理有限公司管理,按照规定必须符合经营服务规范和接受统一管理等加盟条件方可加入。万家旅舍管理有限公司给加入的民宿以电商技术、策划、营销等方面的指引。2015年增城区拟定并通过《增城市万家旅舍计划工作方案》,里面明确了增城区要在3年内构建10 000家左右的万家旅舍,并加以规范化的营销、品牌等管理⑤。

基因选择子程序如下:

def selectionOperation(self):

''' selection operation for Genetic Algorithm'''

newpop=[]

idx=0

sigmodFitness=np.zeros((self.sizepop,1))

T=0.5

expFitness=np.zeros((self.sizepop,1))

softmax= np.zeros((self.sizepop,1))

sigmodFitness=[1.0/(1.0+math.exp(-i+np.average(self.fitness))) for i in self.fitness]

expFitness=[math.exp(i/T) for i in sigmodFitness]

totalFitness=np.sum(expFitness)

idx2=random.randint(0,self.sizepop-1)

sum1=0.

for i in xrange(0,self.sizepop):

大理居民脑卒中患者危险因素的Logistic回归分析………………徐弘扬,杜小珊,杨锡彤,马 蓉,王光明(63)

accuFitness[i]=sum1+softmax[i]

sum1=accuFitness[i]

for i in xrange(0,self.sizepop):

r=random.random()

idx=0

“从年满3岁到小学、初中、普通高中、中等职业、技工教育,再到大专、本科、硕士研究生、博士研究生,学历教育的各个阶段和类型都覆盖到了。”从事高校教育工作的黄建英教授说,“这传递出,无论接受什么样的教育,国家都一视同仁来对待。”

if j == 0 and r < accuFitness[j]:

accuFitness=np.zeros((self.sizepop,1))

break

elif raccuFitness[j] and r<accuFitness[j+1]:

idx=j+1

break

newpop.append(self.population[idx])

for i in xrange(0,self.sizepop):

PJM的备用服务市场价格几乎为0,因为PJM规定容量市场的中标者必须提供备用服务。所以PJM对于备用的补偿主要集中在容量市场。

需要指出的是,由于测试的性能值比较接近,如果采用原有的轮盘赌方法,优秀的个体被选择的概率不是很大,本文采用了机器学习领域应用较为广泛的sigmod函数,通过指数化性能值,并采用softmax函数改进的轮盘赌方法,增大了优秀个体被选择的概率。

2.3.5 交叉

交叉方法有实值交叉、二进制交叉、单点交叉、多点交叉等,本文选取单点交叉,当生成的0到1区间内的随机数小于交叉率时,则进行交叉,将两个染色体的同一位置进行交叉,交换两染色体的mckcnc

下面给出了交叉操作子程序,交叉操作中的概率是用来判断两个个体是否进行交叉操作,一般大于0.85,本文设置交叉率为0.9。

俗话说:学好数理化,走遍天下都不怕。这里的“理”就是指物理。由此可见,物理知识的重要性。实际上,高中物理知识与我们的实际生活具有极其密切的关系,更是进行电能、热能、核能等科学研究的基础学科。随着课程改革的不断深入,在核心素养语境下,如何帮助学生找到学习的方法,使他们掌握提分的技巧,就成为当前高中物理教师亟待解决的问题。接下来,本文将阐述在高中物理教学中有效的学习方法和提分技巧。

基因交叉子程序如下:

def crossoverOperation(self):

''' crossover operation for genetic algorithm '''

newpop=[]

for i in xrange(0,self.sizepop,2):

idx1=random.randint(0,self.sizepop-1)

softmax=[round(i/totalFitness,5) for i in expFitness]

“我喜欢学习成绩好,会踢足球,开朗幽默……”叶子一点都不避讳,连珠炮似地描绘着她理想中的白马王子,只是全程都专心对付着餐盘中的鸡排,没有正眼看我一眼。这些要求每一条都能将我秒杀,空气中似乎每个分子都是锐利的,扎疼了我的自尊。酝酿许久的“喜欢你”,还是没敢说出口。

while idx2 == idx1:

idx2=random.randint(0,self.sizepop-1)

newpop.append(copy.deepcopy(self.population[idx1]))

newpop.append(copy.deepcopy(self.population[idx2]))

r=random.random()

if r<self.params[0]:

crossPos=random.randint(1,self.vardim-1)

for j in xrange(crossPos,self.vardim):

(newpop[i].chrom[j],newpop[i+1].chrom[j])=(newpop[i+1].chrom[j],newpop[i].chrom[j])

self.population=newpop

2.3.6 变异

变异操作是对种群中个体某一个或某一些基因座上的基因按某一较小的概率进行改变。变异概率的设置可以从陷入局部最优的情况下跳出,进而搜索全局最优解,其值一般小于0.1,本文设置变异率为0.1。

下面给出了变异子程序,变异方法选择二进制变异,首先通过变异率确定是否变异;然后在三个参数中选择变异的部分(mckc或者nc);接着将该部分作预处理(mc/mr,kc/kr,或者nc/nr);下一步,将其从十进制数转化为二进制数,再对二进制数中的随机一位取反,之后再通过分别乘以mrkr或者nr转换为十进制数。这样一来,保证了变异后的值仍然是mrkrnr的倍数。这里需要强调的是取反操作可能有特殊值,即可能变异后的值为零,因此需增加判断,如值为零,则重新选择取反位置。

基因变异子程序如下:

def mutationOperation(self):

''' mutation operation for genetic algorithm '''

newpop=[]

for i in xrange(0,self.sizepop):

newpop.append(copy.deepcopy(self.population[i]))

r=random.random()

if r<self.params[1]:

mutatePos=random.randint(0,self.vardim-1)

code=int(newpop[i].chrom[mutatePos])/self.kernel[mutatePos]

strlist=list(bin(code))

mutaidx=random.randint(2,len(strlist)-1)

strlist[mutaidx]=str(int(not int(strlist[mutaidx])))

while int("".join(strlist),2)==0:

strlist=list(bin(code))

mutaidx=random.randint(2,len(strlist)-1)

strlist[mutaidx]=str(int(not int(strlist[mutaidx])))

newpop[i].chrom[mutatePos]=int(''''.join(strlist),2)<FounderNode name="ZK" value=")"/>

*self.kernel[mutatePos]

if newpop[i].chrom[mutatePos]==0:

sys.exit()

self.population=newpop

2.3.7 迭代

种群P(t)进行一轮选择、交叉、变异运算后得到新一代的种群P(t+1),新一代的种群P(t+1)通过遗传变异后优于种群P(t)。重复上述步骤,对产生的新一代种群进行重新评价适应度、选择、交叉、变异、迭代数次,直到达到迭代次数的最大值,使种群中最优个体的适应度和平均适应度不断提高,产生的最优个体就可以看作为问题的近似最优解。

3 算法测试与分析

实验平台所采用的处理器为Intel(R)-Core(TM)i5-3320M,属于Ivy Bridge架构[7]。主频为2.6 GHz,CPU核数为2,每一个CPU核独享一个32 KB的L1级Cache和一个256 KB的L2级Cache,双核共享一个3 MB的L3级Cache。内存为4 GB。CPU理论峰值计算公式如下:

CPU峰值计算能力=CPU频率*CPU核心数*SIMD向量长度*浮点运算单元数(每秒多少次浮点运算)

由于Intel处理器特有的Turbo模式,默认情况下是开启的。当开启Turbo超频模式时,CPU活跃核数为单核时,支持7倍时钟超频;当CPU活跃核数为双核时,支持5倍时钟超频。双核峰值计算性能为49.6 GFlops/s,单核峰值计算性能为26.4 GFlop/s。关闭超频时,双核峰值计算性能为41.6 GFlops/s,单核峰值计算性能为20.8 GFlops/s。

OpenBLAS内核参数为[4,8,4],BLIS库内核参数为[8,4,4],它们略有不同。

3.1 BLAS库默认分块参数测试

OpenBLAS库和BLIS库针对成熟的体系结构给出了默认的矩阵乘法分块参数,该值是开发人员针对该平台设计并测试的效果较好的分块参数。但是,同一体系结构下,计算平台有可能略有不同,比如Sandybridge架构的产品线就有很多,对应的Cache结构略有不同,那么不同的计算平台所采用的分块参数将不同。表1为在此默认矩阵分块参数下测试的性能值,通过与之对比,可判断本文遗传算法自动优化方法是否有效的择优选择。理想的结果是:本文方法从一组随机参数值进行迭代自动优化,最后得到的最优性能值将接近并略有超越该默认分块参数对应的性能值。

 

Table 1 Test results of default block parameters of GEMM表1 默认矩阵乘法分块参数测试结果

  

核数及线程数OpenBLAS/(GFlops/s)BLIS/(GFlops/s)开启超频双核双线程43.44342.517开启超频单核单线程24.62023.132关闭超频双核双线程38.24936.853关闭超频单核单线程19.62218.627

3.2 遗传算法测试

遗传算法初始种群个数设置为50个,遗传迭代次数设置为5代,考虑到理论分析后的结果,为了使种群个体尽可能地分散,矩阵分块的参数范围设置为[64 64 64]到[1280 1280 1280]。从不同测试条件的测试数据和结果看,遗传算法种群的平均性能都处于上升趋势,同时每一代的最优性能值也比前一代的更好。

表2给出了OpenBLAS库在不同实验条件下,遗传算法5次迭代产生的最优性能值、相对应的矩阵分块参数,并给出了浮点效率,通过与不同测试条件下的理论峰值进行除法操作,可以得到相对应的实测性能值的所占百分比。从表2中可以得出单核情况下效率超过90%,双核情况下效率达到80%以上,达到了预期优化效果。

 

Table 2 Test results of the genetic algorithm in OpenBLAS表2 遗传算法在OpenBLAS库下测试结果

  

核数及线程数遗传算法/(GFlops/s)矩阵分块参数浮点效率/%开启超频双核双线程45.542[2962681232]91.82开启超频单核单线程24.428[6242761112]92.53关闭超频双核双线程38.560[344256180]92.69关闭超频单核单线程19.727[848256912]94.84

BLIS库下遗传算法优化方法与OpenBLAS库优化方法基本相同,设置与上述OpenBLAS相同的遗传算法种群个数、迭代次数和分块参数范围。表3为BLIS库下通过遗传算法计算出的最优矩阵分块参数以及GEMM性能值。通过浮点效率得出遗传算法提升了处理器的矩阵运算性能,但是与OpenBLAS比较,存在一定的差距,说明OpenBLAS在矩阵乘法优化方面具有一定优势。

 

Table 3 Test results of the genetic algorithm in BLIS表3 遗传算法在BLIS库下测试结果

  

核数及线程数遗传算法/(GFlops/s)矩阵分块参数浮点效率/%开启超频双核双线程42.963[80260884]86.62开启超频单核单线程23.289[6242761112]88.22关闭超频双核双线程36.587[1042441052]87.95关闭超频单核单线程18.728[6562481136]90.04

图4给出了遗传算法在OpenBLAS库和BLIS库下得出的最优GEMM性能值与默认分块参数GEMM性能值的对比。不同测试条件下,遗传算法得出的最优分块下GEMM性能值基本都优于默认分块参数测试的GEMM性能值。从图4中还可以看出,在开启超频单核单线程和关闭双核双线程两种情况下,两种BLAS数学库遗传算法计算的GEMM性能值略低于默认参数下的性能值,遗传算法本身是通过理论计算或者随机生成初始种群,然后遗传迭代产生近似最优解,初始种群范围与迭代次数可能会对最优解产生影响,同时GEMM的默认参数是经过理论验证的近似最优参数,其性能值与遗传算法计算的性能值差距非常微小。其他情况下遗传算法所得最优解都好于默认参数。这能够说明遗传算法优化在两种BLAS库下的有效性。

  

Figure 4 GEMM performance comparison图4 GEMM性能对比

4 结束语

GEMM函数是BLAS库中核心函数,在绝大部分科学计算应用程序中占据大部分运算时间,具有较大优化空间。本文在Intel平台上建立遗传算法优化模型,优化OpenBLAS与BLIS的DGEMM,其性能值随自动遗传算法的迭代而增长,最优性能值达到了并高于当前已知的最优分块下的性能值,说明了遗传算法优化模型的有效性。本文不足之处在于只有单一平台的实验结果,由于时间和条件所限,缺少其他实验平台的验证,下一步的工作是在其他不同平台上验证提出的遗传算法模型的有效性,进一步完善本文所述优化方法。

参考文献:

[1] Whaley R C,Dongarra J J. Automatically tuned linear algebra software [C]∥Proc of IEEE SC’98,1998:1-27.

[2] Goto K,van de Geijn R. Anatomy of high-performance matrix multiplication [J].ACM Transactions on Mathematical Software,2008,34(3):1-25.

[3] Goto K, van de Geijn R. High-performance implementation of the level-3 BLAS [J].ACM Transactions on Mathematical Software,2008,35(1):1-14.

[4] Zhang X Y,Wang Q,Zhang Y Q.Model-driven level 3 BLAS performance optimization on Loongson 3A processor [C]∥Proc of IEEE ICPADS’12,2012:684-691.

[5] Smith T M, van de Geijn R A,Smelyanskiy M,et al.Anatomy of high-performance many threaded matrix multiplication [C]∥Proc of IEEE IPDPS’14,2014:1049-1059.

[6] Low M L T, Igual F D, Smith T M, et al.Analytical modeling is enough for high performance BLIS [J].ACM Transactions on Mathematical Software,2016,43(2):12.

[7] Tan G M, Li L, Triechle S,et al.Fast implementation of DGEMM on Fermi GPU [C]∥Proc of IEEE SC’11,2011:1-11.

[8] Wang Feng,Jiang Hao, Zuo Ke, et al.Design and implementation of a highly efficient DGEMM for 64-bit ARMv8 multi-core processors [C]∥Proc of IEEE ICPP’15,2015:200-209.

[9] Jiang Hao,Wang Feng, Li Kuan, et al.Implementation of an accurate and efficient compensated DGEMM for 64-bit ARMv8 multi-core processing [C]∥Proc of IEEE ICPADS’15,2015:491-498.

[10] Li J J,Li X J,Tan G M,et al.An optimized large-scale hybrid DGEMM design for CPUs and ATI GPUs [C]∥Proc of the 26th International Conference on Supercomputing (ICS’12),2012:377-386.

[11] Wang Lin-nan, Wu Wei, Wu Zeng-lin,et al.BLASX:A high performance level-3 BLAS library for heterogeneous multi-GPU computing [C]∥Proc of the 30th International Conference on Supercomputing (ICS’16),2016:No.20.

[12] Wang Q,Zhang X Y,Zhang Y Q,et al.AUGEM:Automatically generate high performance dense linear algebra kernels on x86 CPUs [C]∥Proc of IEEE SC’13,2013:25.

[13] Cui H M,Wang L,Fan D R,et al.Automatic library generation for BLAS3 on GPUs [C]∥Proc of IEEE IPDPS’11,2011:255-265.

[14] Zhang Yong-peng,Mueller F.Auto-generation and auto-tuning of 3D stencil code on GPU clusters [C]∥Proc of the 10th International Symposium on Code Generation & Optimization,2012:155-164.

[15] Cui Xiang,Chen Yi-feng,Zhang Chang-you,et al.Auto-tuning dense matrix multiplication for GPGPU with Cache [C]∥Proc of IEEE ICPADS’10,2010:237-242.

[16] Li Yinan,Dongarra J,Tomov S.A note on auto-tuning GEMM for GPUs [C]∥Proc of IEEE ICCS’09, 2009:884-892.

[17] Jakub K,Stanimire T,Jack D.Autotuning GEMM kernels for the Fermi GPU [J].IEEE Transactions on Parallel and Distributed Systems,2012,23(11):2045-2057.

[18] Sørensen B.Auto-tuning of level 1 and level 2 BLAS for GPUs [J].Concurrency and Computation:Practice and Experience,2013,25(8):1183-1198.

[19] Byun J, Lin R, Yelick K,et al.Autotuning spasrse matrix-vector multiplication for multicore:UCB/EECS-2012-215[R].Berkeley:University of California at Berkeley,2012:1-25.

[20] Sawa Y, Suda R. Auto tuning method for deciding block size parameters in dynamically load-balanced BLAS [M].New York:Springer,2011:33-48.

 
孙成国,兰静,姜浩
《计算机工程与科学》2018年第05期文献

服务严谨可靠 7×14小时在线支持 支持宝特邀商家 不满意退款

本站非杂志社官网,上千家国家级期刊、省级期刊、北大核心、南大核心、专业的职称论文发表网站。
职称论文发表、杂志论文发表、期刊征稿、期刊投稿,论文发表指导正规机构。是您首选最可靠,最快速的期刊论文发表网站。
免责声明:本网站部分资源、信息来源于网络,完全免费共享,仅供学习和研究使用,版权和著作权归原作者所有
如有不愿意被转载的情况,请通知我们删除已转载的信息 粤ICP备2023046998号