一种剖析cuda程序行为的方法

文档序号:6362921阅读:526来源:国知局
专利名称:一种剖析cuda程序行为的方法
技术领域
本发明属于高性能计算研究和程序行为剖析领域,具体涉及针对CUDA编程模型开发的高性能应用程序(例如在GPGPU平台上运行的高性能数据库和气象预测程序)的行为剖析以及剖析工具的研究,它适用于CUDA应用程序的行为研究和剖析方法的优化。
背景技术
GPU以其理论上计算性能显著超越同时代的多核CPU的技术优势,已经在近几年里进入了非图形计算领域,而像CUDA (Computing Unified Device Architecture,计算统一设备体系结构)这样的编程模型的涌现,鼓舞了开发者利用GPU来运行高性能应用的热情。在NVIDIA公司的官方网站上,已经有不同领域的几百个成功的典型应用,它们获得的加速比可以达到几十甚至上百,并且这一情况仍在继续发展。在产业界,也有不少公司希望把他们的应用,比如用于流媒体处理领域的H. 264编解码器,迁移到GPU架构上来,获得更高的并行性能。然而,目前缺乏一种优秀的剖析工具,来帮助开发者来深入理解CUDA应用程序的加速效果。NVIDIA公司开发的cudaprof工具受到硬件计数器数量的限制,提供的信息有限,而且不能扩展。而gpuocelot中的cuda程序剖析工具,主要是对源代码的静态剖析。我们希望开发一种CUDA程序剖析系统,来帮助开发者理解CUDA应用程序的动态行为特征,尤其是基本块特征、线程同步特征以及相似特征等现有的CUDA剖析工具无法剖析的特征。程序剖析一般分为静态剖析和动态剖析两种。静态剖析并不真正执行程序,而是通过对序源码进行分析,得到程序的结构信息(包括模块调用关系图、模块的控制流程图等)、逆向提取的对象模型和类关系及程序的复杂度度量等。动态剖析则要通过运行程序 (实际运行或模拟运行)来得到程序的动态行为信息,包括分析指令的覆盖率、监控内存的状态等等。动态剖析可以采用实际运行程序的方式,使用硬件计数器来统计程序的信息。这种方法受到了硬件计数器数量和功能的限制。也可以通过插装技术来实现,在对源程序预处理后,插装,汇编后,实际运行或者模拟运行。典型的插装方法可以通过修改编译器来实现。

发明内容
本发明的目的是设计和实现一种剖析CUDA程序行为的方法,它能够对CUDA程序的动态行为特征尤其是基本块特征、同步以及线程相似特征进行剖析,从而获得CUDA程序重要而且独特的行为特征。本发明提供的一种剖析CUDA程序行为的方法,其特征在于,该方法包括下述步骤(1)使用GPU模拟器软件,修改它的配置文件开启指令跟踪和程序信息调试功能后,运行CUDA程序;
(2)记录CUDA程序运行过程中产生的线程的id信息、指令操作码、指令依赖距离以及基本块的块号、平均大小、前驱、后继结点信息;(3)通过CUDA程序中的基本块的前驱、后继结点的连接信息,计算CUDA程序中的基本块之间跳转的概率;(4)显示CUDA程序的控制流-基本块跳转的逻辑关系,获取基本块的总数;(5)针对每一个线程,搜索步骤(2)记录的线程号和基本块号,找出它经过的所有基本块的块号;(6)针对每一个线程经过的所有基本块,搜索步骤( 记录的信息里的线程id和基本块块号,计算出每个基本块被该线程访问的次数;(7)以每个基本块被某线程访问的次数为数组的元素,建立该线程的基本块向量;(8)针对每一个线程的基本块向量,计算出不同的线程的基本块向量之间的距罔;(9)以不同的线程的基本块向量之间的距离为矩阵的元素,建立线程的相似矩阵;(10)根据与现有CUDA程序的行为特征进行比较的结果,判断该CUDA程序是否属于该行为特征显著型程序;所述行为特征表现为数学统计结果,如果该结果超过预设的临界值,则判断该CUDA程序属于该行为特征显著型程序;(11)如果不需要剖析其它的程序,结束;反之,转入步骤(1)。本发明方法对CUDA程序的行为进行剖析,修改模拟器软件配置文件开启指令跟踪和程序信息调试功能,产生原始的程序运行数据。我们对原始的程序运行数据进行提取和过滤后,通过计算同一线程组中的线程之间的基本块向量距离,建立同步矩阵和相似矩阵模型来分析程序的线程特征。这样,我们提供了一种现有的CUDA剖析工具尚不具备的基本块级别和线程级别的特征剖析方法。具体而言,本发明方法具有以下特点和优点(1)基本块级别的特征剖析。其它 CUDA程序剖析工具尚未提供基本块的剖析方法,而基本块级别的特征剖析仍然是CUDA程序剖析中非常重要的一个环节,本发明提供的方法填补了这一空白。( 把同步向量和相似矩阵应用到线程级别的剖析。本发明针对CUDA程序的特点,优选采用欧几里得距离来计算同一线程组内线程之间的相似性,经实践检验,该数学模型的效果较好。


图1为本发明方法的一种具体实施方式
的流程图,其中,(IA)为整体流程,(IB)为基本块级别剖析流程;图2为实现图1所述方法的体系结构图;图3为本发明的线程剖析过程参考图。
具体实施例方式本发明通过对模拟器的修改和扩充,来收集CUDA应用程序模拟运行时的信息,从而剖析基本块特征以及线程级特征等现有的CUDA剖析工具未提供的功能。CUDA应用程序的基本块特征,与传统的CPU架构上运行的应用程序的基本块特征相比,有其独特之处,需要CUDA剖析工具开发者提供合适的工具来研究。线程同步特征和相似特征,是CUDA程序很重要的线程级特征,而现有的CUDA程序剖析工具对此无能为力。本发明设计了向量矩阵的数据结构,通过合适的数学方法,实现了对线程同步和相似特征的剖析。本发明针对剖析CUDA程序的关键行为特征方面的需求,以及现有CUDA程序剖析工具所提供的方法的局限性,提出了基于模拟器的修改和扩充来剖析CUDA应用程序基本块级别和线程级别行为特征的方法。下面结合附图和实例对本发明进行详细说明。如图1所示,本发明方法的步骤为(1)使用GPU模拟器软件,修改与它的配置选项相关的环境变量并保存到脚本文件中,以开启指令跟踪和程序信息调试功能。例如,向Linux的环境变量里添加PTX_SIM_ DEBUG值,在用户主目录下的.bashrc脚本文件的末尾添加export PTX_SIM_DEBUG = 5这一句命令来打开GPU模拟器软件的指令跟踪和信息调试功能的第5个级别。然后,开始运行CUDA程序。(2)记录CUDA程序运行过程中产生的线程的id信息、指令操作码、指令依赖距离以及基本块的块号、平均大小、前驱、后继结点信息。(3)根据⑵中所记录运行过程中的基本块的后继结点出现的次数,汇总得到每个基本块与它的后继结点的连接次数。对于每个基本块,根据它与它的后继结点的连接次数,来计算CUDA程序中的基本块之间跳转的概率。例如,A结点的后继结点是B和C,如果在程序运行完成时A结点与B结点总共连接了 b次,A结点与C结点总共连接了 c次,那么 A结点跳转到B结点的概率为b/(b+c)。(4)使用graphiviz软件以及图像软件来显示程序的控制流——基本块跳转的逻辑关系。根据基本块之间相互跳转的概率,动态地显示出程序的控制流图。(5)针对每一个线程,搜索第(2)步记录的线程号和基本块号,找出它经过的所有基本块的块号。(6)针对每一个线程经过的所有基本块,搜索第(2)步记录的信息里的线程id和基本块块号,计算出每个基本块被该线程访问的次数。(7)以每个基本块被某线程访问的次数为数组的元素,建立该线程的基本块向量 (BBV Basic Block Vector)。(8)针对每一个线程的基本块向量,计算出不同的线程的基本块向量之间的距离。(9)以不同的线程的基本块向量之间的距离为矩阵的元素,建立线程的相似矩阵。例如,对于一个线程组里的256个线程,我们建立256行256列的矩阵,其中第i 行第j列的元素是这个线程组里的第i个线程的基本块向量与第j个线程的基本块向量之间的距离。距离的计算采用欧几里得距离公式或者曼哈顿距离公式,以第(8)步所提出采用的欧几里得距离公式为优。(10)根据与现有CUDA程序重要行为特征进行比较的结果,判断该CUDA程序是否属于该行为特征显著型程序。本发明所剖析的CUDA程序的该行为特征表现出来的数学统计结果(采用数学统计方法所得出的结果)超过了预设的临界值,我们就判断这个CUDA程序属于该行为特征显著型程序。
方法之一是判断CUDA程序是否为分支发散(Branch divergence)显著型程序把相似矩阵里的元素值归一化,使用归一化后的值作为亮度值,使用Matlab工具以黑白图形显示相似矩阵,并使用像素扫描器检查剖析的CUDA程序运行过程中的线程的起伏变化率, 当像素扫描器检查到的CUDA程序的线程起伏变化率大于预先设定的临界值时,系统做出以下判断所检查的CUDA程序是分支发散(Branch divergence)显著型程序。分支发散 (Branch divergence)是CUDA程序剖析领域公知的技术名词。所述临界值可以取已知的 Branch divergence显著型程序的起伏变化率的平均值。方法之二是判断CUDA程序是否为同步显著性程序根据第( 步记录的BAR指令操作码在程序执行完所经过的基本块中出现的次数,除以程序执行完所经过的基本块的总数,得到线程的同步率,来对CUDA程序是否是同步显著型进行判断。当所运行的CUDA程序的同步率大于预先设定的另一临界值时,系统做出以下判断所运行的CUDA程序是同步显著型程序。同步是CUDA程序剖析领域公知的技术名词。所述另一临界值可以取已知的同步显著型程序的同步率的平均值。(12)如果不需要剖析其它的程序,结束;反之创建新的处理实例,跳到第⑴步, 重复上面的剖析过程。实例本发明的运行过程参考图3,下面用一个实例来详细说明(1)修改gpgpusim的功能模拟器的配置文件,打开指令跟踪和程序信息调试功能。(2)调用gpgpusim模拟的CUDA库函数来运行CUDA 二进制程序。(3)通过将指令跟踪和程序信息调试功能所收集的原始数据保存到文件里,基本块跳转的逻辑保存为.dot文件。(4)通过Python或Perl脚本来提取和过滤程序的原始运行数据,使用外接的 graphviz软件将.dot文件绘制成图形。(5)对于提取的的BBV数据,采用Euclidean距离公式来计算同一线程组内不同的线程之间的BBV向量距离,建立同步矩阵和相似矩阵模型来分析程序的同步一致度和线程相似度。(6)如果不需要剖析其它的程序,结束;反之创建新的处理实例,跳到第⑵步,重复上面的剖析过程,比较不同类型的CUDA程序之间的程序行为特征的差别,分析并研究计算密集型与数据密集型CUDA程序之间性能差异的因素。以上所述,仅为本发明最佳的具体实现方式,本发明的实现方法并不局限于此,任何在本发明领域内不脱离本发明精神下的改变,都应涵盖在本发明范围内。
权利要求
1.一种剖析CUDA程序行为的方法,其特征在于,该方法包括下述步骤(1)使用GPU模拟器软件,修改它的配置文件开启指令跟踪和程序信息调试功能后,运行CUDA程序;(2)记录CUDA程序运行过程中产生的线程的id信息、指令操作码、指令依赖距离以及基本块的块号、平均大小、前驱、后继结点信息;(3)通过CUDA程序中的基本块的前驱、后继结点的连接信息,计算CUDA程序中的基本块之间跳转的概率;(4)显示CUDA程序的控制流-基本块跳转的逻辑关系,获取基本块的总数;(5)针对每一个线程,搜索步骤(2)记录的线程号和基本块号,找出它经过的所有基本块的块号;(6)针对每一个线程经过的所有基本块,搜索步骤( 记录的信息里的线程id和基本块块号,计算出每个基本块被该线程访问的次数;(7)以每个基本块被某线程访问的次数为数组的元素,建立该线程的基本块向量;(8)针对每一个线程的基本块向量,计算出不同的线程的基本块向量之间的距离;(9)以不同的线程的基本块向量之间的距离为矩阵的元素,建立线程的相似矩阵;(10)根据与现有CUDA程序的行为特征进行比较的结果,判断该CUDA程序是否属于该行为特征显著型程序;所述行为特征表现为数学统计结果,如果该结果超过预设的临界值, 则判断该CUDA程序属于该行为特征显著型程序;(11)如果不需要剖析其它的程序,结束;反之,转入步骤(1)。
2.根据权利要求1所述的一种剖析CUDA程序行为的方法,其特征在于,步骤(10)中, 将相似矩阵里的元素值归一化,使用归一化后的值作为亮度值,使用Matlab工具以黑白图形显示相似矩阵,并使用像素扫描器检查剖析的CUDA程序运行过程中的线程的起伏变化率,当像素扫描器检查到的CUDA程序的线程起伏变化率大于预先设定的临界值时,则认为该CUDA程序是分支发散显著型程序。
3.根据权利要求1所述的一种剖析CUDA程序行为的方法,其特征在于,步骤(10)中, 将步骤( 记录的BAR指令操作码在程序执行完所经过的基本块中出现的次数,除以程序执行完所经过的基本块的总数,得到线程的同步率,当所运行的CUDA程序的同步率大于预先设定的另一临界值时,由认为所运行的CUDA程序是同步显著型程序。
4.根据权利要求1、2或3所述的一种剖析CUDA程序行为的方法,其特征在于,步骤⑶ 中采用欧几里得距离来计算同一线程组内线程之间的相似程度。
5.根据权利要求1所述的一种剖析CUDA程序行为方法,其特征在于所述CUDA程序行为包括CUDA程序的基本块级别的特征和线程级别的特征。
全文摘要
本发明公开了一种CUDA程序行为剖析的方法,该方法通过修改模拟器的配置文件开启指令跟踪和程序信息调试功能,来记录CUDA程序运行过程中的线程id号、指令操作码等信息。在对原始的程序运行数据进行提取和过滤后,采用欧几里得距离公式来计算同一线程组中的线程之间的基本块向量距离,建立同步矩阵和相似矩阵模型来分析程序的线程特征。这样,我们提供了现有的CUDA剖析工具尚不具备的基本块级别和线程级别特征的剖析方法。
文档编号G06F11/36GK102567206SQ20121000627
公开日2012年7月11日 申请日期2012年1月6日 优先权日2012年1月6日
发明者喻之斌, 程伟, 金海 申请人:华中科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1