CN110399182A - 一种cuda线程放置优化方法 - Google Patents
一种cuda线程放置优化方法 Download PDFInfo
- Publication number
- CN110399182A CN110399182A CN201910680644.2A CN201910680644A CN110399182A CN 110399182 A CN110399182 A CN 110399182A CN 201910680644 A CN201910680644 A CN 201910680644A CN 110399182 A CN110399182 A CN 110399182A
- Authority
- CN
- China
- Prior art keywords
- program
- information
- cuda
- instruction
- function
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4482—Procedural
- G06F9/4484—Executing subprograms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F18/00—Pattern recognition
- G06F18/20—Analysing
- G06F18/24—Classification techniques
- G06F18/241—Classification techniques relating to the classification model, e.g. parametric or non-parametric approaches
- G06F18/2411—Classification techniques relating to the classification model, e.g. parametric or non-parametric approaches based on the proximity to a decision surface, e.g. support vector machines
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
一种CUDA线程放置优化方法,涉及基于机器学习的线程优化技术。本发明的目的是提供一种CUDA线程放置优化方法,以实现降低编程人员工作难度以及减少训练数据的获取时间的目的。技术要点:程序信息采集、程序信息处理、机器学习模型训练,程序信息处理是对静态信息和程序运行时信息进行信息汇总、数值化处理、归一化处理得到训练集程序特征,并利用程序执行时间信息集设置标签从而完成标签数据的生成;将训练集程序特征和标签数据作为输入,利用支持向量机算法进行性能建模,得到程序性能预测模型;在线程优化放置应用时,首先需调用程序信息采集模块,采集待优化程序的程序信息,然后输入已训练好的程序性能预测模型,即可获得合适的线程块设置方案。
Description
技术领域
本发明涉及一种CUDA线程放置优化方法,涉及基于机器学习的线程优化技术。
背景技术
GPU是现代计算机中的常见硬件,它们主要为CPU提供基本的图像操作。近年来,基于强大的数据并行处理与浮点计算能力,GPU被广泛应用于工程应用和科学计算领域。但GPU结构复杂并且具有完全不同于CPU的多线程编程模型,这就使得在GPU上开发高效并行程序变得相对复杂,因而降低GPU编程复杂度并提升程序运行性能就显得尤为重要。2007年,NVIDIA公司发布了GPU下开展并行计算的程序模型及开发环境——统一计算架构CUDA。依托于CUDA提供的C语言扩展,程序开发人员可以开发出GPU上的并行计算程序。CUDA除了提供支持GPU程序的C语言扩展外,还提供了必要的编译器(nvcc)、调试器、运行时环境以及性能分析工具等,为用户提供了全面的程序开发支持。在程序运行时,为了有效管理GPU上并发的大量线程,CUDA设计了合理的线程层次结构。线程是CUDA程序最基本的执行单元,而32个线程组成线程束(warp)。线程块(Block)由若干个线程束组成,若干个同维度、同大小的线程块组成了线程网格(Grid)。程序员需要设置线程块大小(block size)以明确程序kernel部分的线程数量。不同的线程块大小对应不同的线程放置方案,也会带来不同的线程的并发度。只有通过合理设置线程块大小才能使程序运行的性能达到最好,因此线程块大小是影响程序性能的关键因素。合理设置线程块大小并不简单,单一的评价标准或相对简单的策略只对部分程序适用。大部分情况下,设置更大的线程块可以提高GPU利用率,程序并发性也会越好,但过大的线程块也可能会导致GPU的资源分配冲突而使程序性能降低,因此只以GPU利用率为性能评估标准是不全面的。此外,部分程序对线程块大小变化较敏感,小范围的变化都会使程序性能波动很大,这说明影响程序性能的因素是多方面交织的,也使得设置线程块大小的策略更为复杂。如果不采用自动搜索最优配置的方法而使用手工寻找最佳配置,则需要编程人员具备一定经验并要根据硬件环境因地制宜,通过不断修改线程块大小、反复运行程序来收集性能信息,过程耗时较大,并且经验主义地设置往往无法达到最优。
发明内容
本发明要解决的技术问题是:本发明的目的是提供一种CUDA线程放置优化方法,以实现降低编程人员工作难度以及减少训练数据的获取时间的目的。
本发明解决上述技术问题采用的技术方案为:
一种CUDA线程放置优化方法,所述方法的实现过程为:
程序信息采集:包括两个部分:
第一部分使用CUDA的性能分析工具nvprof获得程序运行时信息、程序执行时间信息集(核函数运行时间);
第二部分,首先使用LLVM内的工具clang把CUDA源程序转换成中间表示形式,再使用分析pass采集CUDA程序核函数的静态信息;
程序信息处理:对静态信息和程序运行时信息进行信息汇总、数值化处理、归一化处理得到训练集程序特征,并利用程序执行时间信息集设置标签从而完成标签数据的生成;
机器学习模型训练:将训练集程序特征和标签数据作为输入,利用支持向量机算法进行性能建模,得到程序性能预测模型;
在线程优化放置应用时,首先需调用程序信息采集模块,采集待优化程序的程序信息,然后输入已训练好的程序性能预测模型,即可获得合适的线程块设置方案。
进一步地,程序运行时信息采集的内容为:通过阅读nvprof官方文档,总结出nvprof收集的metric信息分为指令操作信息、存储操作信息、线程信息三类。
进一步地,所述CUDA程序核函数的静态信息包括指令信息和存储空间信息。
进一步地,所述指令信息的采集过程为:
在进入IR的Module后,分析pass会遍历Module内的全部函数,在pass中会使用函数llvm::isKernelFunction()对函数类型进行判断筛选以只分析CUDA程序中的kernel函数;
基于kernel函数会调用非kernel函数作为子函数,pass递归进入kernel函数的各个子函数,以完成子函数相应的指令信息统计;
进入kernel函数内部后,pass会遍历函数的全部基本块与指令,依据与CUDA程序性能指标关联度,pass完成对int型数据操作指令、float型数据操作指令、存储交互操作指令、程序分支操作指令、线程同步指令、函数内循环次数的统计,其详细过程如下:是否统计某指令由该指令的操作类型或操作对象类型决定,在分析pass中,获取操作类型使用的函数包括LLVM::Instruction的getOpcodeName()、getOpcode(),判断操作对象类型使用函数checkOperandTypeIsScalarFloat、checkOperandTypeIsScalarInt();
对于分支指令的判断,使用LLVM的模板函数isa<>,直接判断指令是否属于LLVM::BranchInst类;
对于线程同步和子函数调用指令,pass都要先将该指令转为CallInst类,通过getCalledFunction()获取该指令的调用函数,再通过getName()获取调用函数名,判断函数名是否为“llvm.nvvm.barrier0”即可判断是否为线程同步指令;
对调用函数使用isDeclaration()即可判断是否为子函数。
进一步地,所述存储空间信息的采集过程为:
在进入Module后,pass需遍历程序的全部全局变量,对这些全局变量调用函数getType()->getAddressSpace()获取存储类别判断是否为NVPTX后端规定的共享内存对应的数值,即可筛选出共享内存;
继续对筛选出的全局变量调用函数hasInitializer()判断变量是数组或者变量,调用getNumElement()获取的数组元素数量,即可获取申请空间的大小;
通过getName()获取共享内存的名字,然后与全部kernel函数名字比对,由于这些名字信息均为携带debug信息的,因此选择匹配长度最长的即可判断出当前的共享内存属于哪个kernel函数。
进一步地,设置标签的过程为:针对每个CUDA程序,按照执行时间排序,取执行时间较短的前20%设置标签为1,剩余的信息设置标签为0。
本发明具有以下有益技术效果:本发明是一种耗时低、优化效果好的基于机器学习的线程放置方法。具体表现如下:
第一,降低编程人员工作难度。CUDA程序kernel部分的线程块大小由编程人员手工设置。虽然编程人员可以多次运行程序择优选择线程块大小,但这个过程耗时并且精度一般。如果通过运行一定量的CUDA测试程序积累充足的线程块大小、程序性能相关的信息,利用这些信息作为训练数据,通过机器学习获得优化CUDA线程块大小的模型,当需要设置新程序的线程块时,可以少量运行新程序即可获得线程块大小的优化建议,将大大减少编程人员的工作量,精度上也具有保证。
第二,减少训练数据的获取时间。使用运行时信息可以获得较精准的训练数据,但采集运行时信息时,系统默认需要多次重复运行程序,使得获取训练数据的时间大幅增加。在保证算法效果的情况下,如何缩短训练数据获取时间,也是本课题的一个研究内容。本使用LLVM设计pass采集程序静态信息,用部分静态信息建立与运行时信息的等价关系,可以缩短整体训练数据获取时间,并保证了原有的训练效果。
经验证,相较于手工设置CUDA线程放置,通过本方法可较轻松地使CUDA程序运行达到自身运行最快的前20%,并且模型建立时间较快。
附图说明
图1为本发明的整体架构流程图,图2为分析pass的指令信息统计的方法流程框图,图3为pass获取kernel函数共享内存信息方法流程框图;图4是K折交叉验证过程(K=10)示意图,图5为本模型中支持向量机算法训练效果趋势曲线图。
图2和图3中的英文是程序中的语言,其含义均是公知的。
具体实施方式
结合附图对本发明所述的一种CUDA线程放置优化方法的实现进行如下阐述:
1、构建CUDA程序线程放置优化模型与应用的整体过程如图1所示。线程优化放置模型的实现主要分为三阶段。第一阶段是原始数据的获取,该阶段进一步分为两个部分。第一部分使用CUDA的性能分析工具nvprof获得程序运行时信息、核函数运行时间等;第二部分,首先使用LLVM内的工具clang把CUDA源程序转换成中间表示形式,再使用分析pass采集CUDA程序核函数的部分静态信息。第二阶段完成数据的处理,包括信息汇总、数值化处理、归一化处理以及标签数据的生成等。第三阶段是机器学习模型的训练,利用支持向量机算法进行性能建模,得到性能预测模型。在线程优化放置应用时,首先需参考模型实现的第一阶段,采集待优化程序的程序信息,然后输入已训练好的模型,即可获得合适的线程块设置方案。
2、线程放置优化模型或方法
2.1Benchmark
为了保证训练数据数量,本模型选用三个程序集Rodinia、Parboil、SLAMBench作为Benchmark。该三个程序集是测试分析CUDA程序的重要Benchmark,均包含了多个科学研究领域经典算法的CUDA程序,并且较广泛地覆盖了并行程序的特性,进而也包含了CUDA程序的多方面特性。例如,Rodinia中的srad程序偏向于计算密集型,而bfs、streamcluster两个程序的程序性能受GPU存储大小影响更多一些。
在调整Benchmark程序线程块大小的范围上,选择最佳范围的标准是既要保证训练数据的数量,也要使训练数据可以充分反映程序性能与线程块大小间的变化关联。CUDA线程块大小对程序性能影响的复杂性对设置程序线程块大小的方案提供了思路。该思路是应该在核函数运行资源允许范围内,尽可能收集每个合法线程块大小下的程序信息,这样在遇到性能随线程放置变化而波动较大的程序时,才能避免遗失程序性能最佳时的信息。例如,如果某核函数支持线程块大小范围为32~1024,那么应该依次收集程序在线程块大小32,64,...,1024下的信息,合计32个。
2.2运行时信息采集
nvprof是NVIDIA官方提供的另一款CUDA程序的性能分析工具,不同之处在于它采用了命令行形式。nvprof同样可以通过收集GPU的硬件计数器信息生成程序的运行时信息,包括kernel函数执行、内存传输、CUDA API调用以及事件、metric信息等。由于采用的是命令行的形式,使得nvprof在批处理等场景独具优势。本模型主要通过nvprof收集kernel函数的metric信息作为训练数据。
通过阅读nvprof官方文档,可以总结出nvprof收集的metric信息分为指令操作信息、存储操作信息、线程信息三类。受硬件条件限制,GPU计数器在kernel函数运行时每次可以收集到的信息量有限,因此nvprof会自动多次执行kernel函数以完成信息收集,值得注意的是,这种反复执行函数的行为也是用nvprof收集运行时信息时耗时很长的原因,进而会导致训练数据的获取时间过长。
本发明重点提取metric信息中的指令数量信息、存储吞吐量信息、线程分支效率等信息。本发明获取的metric信息见表1。
表1通过nvprof获得的CUDA函数运行时信息
2.3静态信息采集
通过LLVM采集的CUDA程序静态信息,见表2。
表2通过LLVM获得的CUDA程序静态信息
(1)浮点计算单元利用率
可以用静态信息Ninstrfloat计算得到浮点计算单元利用率,对应nvprof工具获取的信息flop_dp_efficiency、flop_sp_efficiency。设核函数的执行时间为Tkernel,GPU浮点计算理论峰值为Pmax,则GPU浮点计算单元利用率Ufloatstatic可以表示为:
(2)存储器吞吐量统计
我们用指令数量替代存储器吞吐量统计信息:instrstore替代gst_throughput,Ninstrload替代gld_throughput,Ssharedmem替代shared_load_throughput、shared_store_throughput。
(3)线程分歧率
在CUDA程序的指令集中,影响线程分歧率的指令包括分支指令、同步指令,因此我们用Nbranch、Nsync、Nisntr、Nloop等替代nvprof工具的信息branch_,计算公式为:
与原计划提取的运行时信息相比,经过替换后,由原来的提取15条变为8条。
接下来介绍使用LLVM分析pass实现CUDA程序静态信息采集的具体实现过程。分析pass的实现过程分两部分,第一部分是程序指令信息、循环信息的收集统计,第二部分是程序存储空间信息的统计。首先介绍指令信息、循环信息统计的实现过程。
(1)指令信息、循环信息统计的实现
在进入IR的Module后,分析pass会遍历Module内的全部函数,我们为了只分析CUDA程序中的kernel函数,在pass中会使用函数llvm::isKernelFunction()对函数类型进行判断筛选。此外,由于kernel函数会调用非kernel函数作为子函数,为了保证kernel函数信息统计的完整准确,pass仍需递归进入kernel函数的各个子函数,完成子函数相应的指令信息统计。
进入kernel函数内部后,pass会遍历函数的全部基本块与指令,依据与CUDA程序性能指标关联度,pass主要完成对int型数据操作指令、float型数据操作指令、存储交互操作指令、程序分支操作指令、线程同步指令、函数内循环次数的统计。详细过程如下:
是否统计某指令由该指令的操作类型或操作对象类型决定。在分析pass中,获取操作类型使用的函数包括LLVM::Instruction的getOpcodeName()、getOpcode(),判断操作对象类型使用函数checkOperandTypeIsScalarFloat、checkOperandTypeIsScalarInt()等。
对于分支指令的判断,使用LLVM的模板函数isa<>,直接判断指令是否属于LLVM::BranchInst类。
对于线程同步和子函数调用指令,pass都要先将该指令转为CallInst类,通过getCalledFunction()获取该指令的调用函数,再通过getName()获取调用函数名,判断函数名是否为“llvm.nvvm.barrier0”即可判断是否为线程同步指令。
对调用函数使用isDeclaration()即可判断是否为子函数。
图2给出分析pass的指令信息统计的方法。
(2)存储空间信息的统计的实现
在进入Module后,pass需遍历程序的全部全局变量,对这些全局变量调用函数getType()->getAddressSpace()获取存储类别判断是否为NVPTX后端规定的共享内存对应的数值,即可筛选出共享内存。继续对筛选出的全局变量调用函数hasInitializer()判断变量是数组或者变量,调用getNumElement()获取的数组元素数量,即可获取申请空间的大小。此外,还需明确共享内存申请于哪个kernel函数,这就通过getName()获取共享内存的名字,然后与全部kernel函数名字比对,由于这些名字信息均为携带debug信息的,因此选择匹配长度最长的即可判断出当前的共享内存属于哪个kernel函数。整体的方法参照图3。
2.4数据处理
经过对程序的运行时信息、执行时间以及静态信息的采集,模型获得了原始的训练数据,下一步,需要对原始数据做处理,主要包括信息的汇总、冗余信息剔除、特征缩放、生成标签数据。
(1)预处理
预处理环节完成全部信息的集中和数值化。程序运行时信息、执行时间由nvprof的--logfile选项保存为TXT,静态信息在程序设定上也保存为TXT,在这个环节会将上述信息全部信息汇总到各自的csv文件。另外,还需要对运行时信息做数值化处理,例如,提取到的运行时吞吐率信息的计量单位并不统一,包括G/s、M/s,需要统一按M/s处理,并只保留数值形式;cf_fu_utilization信息为文本形式,需要转换为数字。
(2)归一化处理
本模型使用线性函数归一化(Min-Max scaling)让所有训练数据特征具有相同的度量。线性函数归一化通过对数据减去最小值,再除以最大值与最小值差值实现归一化,公式如下:
其中为Dnormal归一化后的数据,D为原始数据,Dmax、Dmax分别为原始数据集的最大值和最小值。
(3)添加标签
在监督学习中,为了训练机器学习模型,我们必须向它提供带标签的训练数据。本发明中,在获得原始的训练数据后,我们根据每条信息中的核函数运行时间设置标签。
本模型的添加标签算法是针对每个核函数,按照执行时间排序,取执行时间较短的前20%设置标签为1,剩余的信息设置标签为0。算法1描述了添加标签算法的过程:
2.5模型训练
通过scikit-learn工具完成模型训练的具体过程为:
(1)支持向量机算法
使用支持向量机(SVM)作为性能建模的机器学习方法,主要是因为支持向量机可以较准确地处理特征空间较复杂、非线性可分的训练数据,并且支持向量机在合理的超参数条件下,不易受噪音数据影响或者出现过拟合。
在应用支持向量机时,为了获得非线性可分离决策边界,本模型使用kerneltrick方法将特征空间映射到更高维空间。在支持向量机的几个核函数中,通过调控高斯核中参数σ,可以使高斯核具有很高的灵活性,因此这里我们采用高斯核。
scikit-learn中SVM的算法库都包裹在sklearn.svm模块之中,划分为两类,一类是针对分类的算法库,包含有SVC、NuSVC和LinearSVC,另一类是针对回归的算法库,包含有SVR、NuSVR和LinearSVR。本模型使用的是SVC类。
(2)设置参数组合
网格搜索法采用遍历搜索的方式,根据设置,遍历运行全部可能的超参数组合,对所有的预测结果进行评分,其中得分最高的参数组合就是通过网格搜索得到的最优的参数。
支持向量机算法中参数组合包括惩罚系数和核函数参数两个参数。惩罚系数表示了模型对误差的宽容度,该值越高,对误差容忍度越低。核函数参数是高斯核 的参数σ,决定了数据映射到新的特征空间后的分布。
参数组合惩罚系数和核函数参数分别对应scikit-learn中的C、gamma。表3是本模型SVC算法遍历的参数。
表3 SVC网格搜索法参数
(3)交叉验证
通常测试样本是从样本真实分布中独立同分布采样获取的。常用的方法有留出法、自助法和交叉验证法。本模型采用交叉验证法评估模型。
交叉验证(Cross Validation)也称作循环估计,指的是对原始数据分组,取大部分样本做训练集,留取剩余少部分数据做验证集用来评价训练出的模型效果,一直进行上述过程,直到全部数据都做过验证集。最后,取这些验证评价的平均值作为最终的评价。K折(K-fold)交叉验证表示的是划分数据集的份数及循环次数为K次。图4展示了K折交叉验证的过程。
scikit-learn工具的model_selection模块提供了简单便捷的网格搜索函数GridSearchCV。通过该函数将待搜索参数输入,GridSearchCV可以遍历这些参数的组合,经过交叉验证确定最佳效果参数。GridSearchCV尤其适合本模型的小量数据集的情形。GridSearchCV的参数cv是交叉验证参数,该参数指定了fold数量,本模型设置为10。接着可以通过调用scikit-learn的fit函数利用建立好的网格搜索对象训练数据,得到最优的参数组合。
(4)训练效果度量
前述内容给出了参数调优的方法,接下来需要解决如何评价不同参数下算法训练效果优劣的问题。具体流程为:遍历测试集中全部程序信息组合,将其输入待评估模型,模型输出该程序信息对应的计算标签值,将该值与程序信息组合对应的真实标签值比较,统计全部比较结果后计算模型训练的准确率。
因此,准确率的计算公式可以表达为
式中N——测试集数量;
Ipredict——机器学习算法的预测结果;
I——测试集的标签值。
在发明效果一章中,模型训练准确率都通过上式计算得出。
对本发明的技术效果进行如下验证:
通过效果评估实验验证了模型的效果,实验数据均使用上一节Benchmark中获得的训练数据。
模型的训练、运行环境如表4所示:
表4模型原始数据的运行环境
模型训练环境使用的是python编写的scikit-learn工具,全部代码运行在python3.6.5环境。
认为一个机器学习算法具有良好的趋势表现,则应该能够在一定训练数据量范围内,随着训练数据增长,训练准确率有较为稳定的变好趋势,并基本不会出现训练效果变坏的波动。因此,算法表现更好的含义既包括在具备全体数据集时表现最佳,也包括有良好的趋势表现。为了验证支持向量机的训练效果趋势,设计实验方法如下:
第一轮实验中,我们随机选取20%的全体训练数据对上述三个算法开展训练,记录该轮实验中每个算法的训练准确率。以后每轮实验,再增加随机选取的10%训练数据加入训练。最后一轮时,全部训练数据参与训练。
可以看到,在该实验的最后一轮,我们将会测试三个算法在完整(最大量)训练数据下的训练效果。实验效果如图5所示。
通过图5获得了模型在完全训练数据下,测试得到训练准确率为91.2%。此外,还统计了各环节模型的建立时间,包括运行时信息采集时间、静态信息采集时间、模型训练时间等,合计为71.4分,见表5。
表5模型各阶段耗时
综合看,相较于手工设置CUDA线程放置,通过本方法,可以较轻松地使CUDA程序运行达到自身运行最快的前20%,并且模型建立时间较快。
Claims (6)
1.一种CUDA线程放置优化方法,其特征在于,所述方法的实现过程为:
程序信息采集:包括两个部分:
第一部分使用CUDA的性能分析工具nvprof获得程序运行时信息、程序执行时间信息集;
第二部分,首先使用LLVM内的工具clang把CUDA源程序转换成中间表示形式,再使用分析pass采集CUDA程序核函数的静态信息;
程序信息处理:对静态信息和程序运行时信息进行信息汇总、数值化处理、归一化处理得到训练集程序特征,并利用程序执行时间信息集设置标签从而完成标签数据的生成;
机器学习模型训练:将训练集程序特征和标签数据作为输入,利用支持向量机算法进行性能建模,得到程序性能预测模型;
在线程优化放置应用时,首先需调用程序信息采集模块,采集待优化程序的程序信息,然后输入已训练好的程序性能预测模型,即可获得合适的线程块设置方案。
2.根据权利要求1所述的一种CUDA线程放置优化方法,其特征在于,程序运行时信息采集的内容为:
通过阅读nvprof官方文档,总结出nvprof收集的metric信息分为指令操作信息、存储操作信息、线程信息三类。
3.根据权利要求1所述的一种CUDA线程放置优化方法,其特征在于,所述CUDA程序核函数的静态信息包括指令信息和存储空间信息。
4.根据权利要求3所述的一种CUDA线程放置优化方法,其特征在于,所述指令信息的采集过程为:
在进入IR的Module后,分析pass会遍历Module内的全部函数,在pass中会使用函数llvm::isKernelFunction()对函数类型进行判断筛选以只分析CUDA程序中的kernel函数;
基于kernel函数会调用非kernel函数作为子函数,pass递归进入kernel函数的各个子函数,以完成子函数相应的指令信息统计;
进入kernel函数内部后,pass会遍历函数的全部基本块与指令,依据与CUDA程序性能指标关联度,pass完成对int型数据操作指令、float型数据操作指令、存储交互操作指令、程序分支操作指令、线程同步指令、函数内循环次数的统计,其详细过程如下:是否统计某指令由该指令的操作类型或操作对象类型决定,在分析pass中,获取操作类型使用的函数包括LLVM::Instruction的getOpcodeName()、getOpcode(),判断操作对象类型使用函数checkOperandTypeIsScalarFloat、checkOperandTypeIsScalarInt();
对于分支指令的判断,使用LLVM的模板函数isa<>,直接判断指令是否属于LLVM::BranchInst类;
对于线程同步和子函数调用指令,pass都要先将该指令转为CallInst类,通过getCalledFunction()获取该指令的调用函数,再通过getName()获取调用函数名,判断函数名是否为“llvm.nvvm.barrier0”即可判断是否为线程同步指令;
对调用函数使用isDeclaration()即可判断是否为子函数。
5.根据权利要求4所述的一种CUDA线程放置优化方法,其特征在于,所述存储空间信息的采集过程为:
在进入Module后,pass需遍历程序的全部全局变量,对这些全局变量调用函数getType()->getAddressSpace()获取存储类别判断是否为NVPTX后端规定的共享内存对应的数值,即可筛选出共享内存;
继续对筛选出的全局变量调用函数hasInitializer()判断变量是数组或者变量,调用getNumElement()获取的数组元素数量,即可获取申请空间的大小;
通过getName()获取共享内存的名字,然后与全部kernel函数名字比对,由于这些名字信息均为携带debug信息的,因此选择匹配长度最长的即可判断出当前的共享内存属于哪个kernel函数。
6.根据权利要求5所述的一种CUDA线程放置优化方法,其特征在于,设置标签的过程为:针对每个CUDA程序,按照执行时间排序,取执行时间较短的前20%设置标签为1,剩余的信息设置标签为0。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910680644.2A CN110399182B (zh) | 2019-07-25 | 2019-07-25 | 一种cuda线程放置优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910680644.2A CN110399182B (zh) | 2019-07-25 | 2019-07-25 | 一种cuda线程放置优化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110399182A true CN110399182A (zh) | 2019-11-01 |
CN110399182B CN110399182B (zh) | 2023-05-12 |
Family
ID=68325059
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910680644.2A Active CN110399182B (zh) | 2019-07-25 | 2019-07-25 | 一种cuda线程放置优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110399182B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111930484A (zh) * | 2020-07-24 | 2020-11-13 | 国家电网有限公司 | 一种电网信息通信服务器线程池性能优化方法与系统 |
CN112104446A (zh) * | 2020-09-03 | 2020-12-18 | 哈尔滨工业大学 | 一种基于同态加密的多方联合机器学习方法和系统 |
CN113553057A (zh) * | 2021-07-22 | 2021-10-26 | 中国电子科技集团公司第十五研究所 | 一种针对不同架构的gpu进行并行计算的优化系统 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20120124591A1 (en) * | 2010-11-17 | 2012-05-17 | Nec Laboratories America, Inc. | scheduler and resource manager for coprocessor-based heterogeneous clusters |
CN102999756A (zh) * | 2012-11-09 | 2013-03-27 | 重庆邮电大学 | 基于gpu实现pso-svm对道路标志的识别方法 |
US20180136912A1 (en) * | 2016-11-17 | 2018-05-17 | The Mathworks, Inc. | Systems and methods for automatically generating code for deep learning systems |
CN108197656A (zh) * | 2018-01-04 | 2018-06-22 | 西南交通大学 | 一种基于cuda的属性约简方法 |
CN108563119A (zh) * | 2018-03-26 | 2018-09-21 | 哈尔滨工程大学 | 一种基于模糊支持向量机算法的无人艇运动控制方法 |
CN108805794A (zh) * | 2017-04-28 | 2018-11-13 | 英特尔公司 | 对自主机器处的机器学习进行存储管理 |
CN108801241A (zh) * | 2017-04-07 | 2018-11-13 | 辉达公司 | 使用深度神经网络执行自主路径导航 |
CN109542731A (zh) * | 2018-11-28 | 2019-03-29 | 北京物资学院 | 一种面向gpu的层次递进下钻的性能监测方法 |
-
2019
- 2019-07-25 CN CN201910680644.2A patent/CN110399182B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20120124591A1 (en) * | 2010-11-17 | 2012-05-17 | Nec Laboratories America, Inc. | scheduler and resource manager for coprocessor-based heterogeneous clusters |
CN102999756A (zh) * | 2012-11-09 | 2013-03-27 | 重庆邮电大学 | 基于gpu实现pso-svm对道路标志的识别方法 |
US20180136912A1 (en) * | 2016-11-17 | 2018-05-17 | The Mathworks, Inc. | Systems and methods for automatically generating code for deep learning systems |
CN108801241A (zh) * | 2017-04-07 | 2018-11-13 | 辉达公司 | 使用深度神经网络执行自主路径导航 |
CN108805794A (zh) * | 2017-04-28 | 2018-11-13 | 英特尔公司 | 对自主机器处的机器学习进行存储管理 |
CN108197656A (zh) * | 2018-01-04 | 2018-06-22 | 西南交通大学 | 一种基于cuda的属性约简方法 |
CN108563119A (zh) * | 2018-03-26 | 2018-09-21 | 哈尔滨工程大学 | 一种基于模糊支持向量机算法的无人艇运动控制方法 |
CN109542731A (zh) * | 2018-11-28 | 2019-03-29 | 北京物资学院 | 一种面向gpu的层次递进下钻的性能监测方法 |
Non-Patent Citations (4)
Title |
---|
GUPTA R: "Statuner: Efficient tuning of cuda kernels parameters", 《SC15.SUPERCOMPUTING.ORG》 * |
孙明昊: "基于GPU集群的能效优化调度算法", 《中国优秀硕士学位论文全文数据库信息科技辑》 * |
李涛等: "基于混合编程模型的支持向量机训练并行化", 《计算机研究与发展》 * |
马冬冬等: "基于GPU的LLVM程序分析信息并行提取", 《计算机工程》 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111930484A (zh) * | 2020-07-24 | 2020-11-13 | 国家电网有限公司 | 一种电网信息通信服务器线程池性能优化方法与系统 |
CN111930484B (zh) * | 2020-07-24 | 2023-06-30 | 国家电网有限公司 | 一种电网信息通信服务器线程池性能优化方法与系统 |
CN112104446A (zh) * | 2020-09-03 | 2020-12-18 | 哈尔滨工业大学 | 一种基于同态加密的多方联合机器学习方法和系统 |
CN113553057A (zh) * | 2021-07-22 | 2021-10-26 | 中国电子科技集团公司第十五研究所 | 一种针对不同架构的gpu进行并行计算的优化系统 |
CN113553057B (zh) * | 2021-07-22 | 2022-09-09 | 中国电子科技集团公司第十五研究所 | 一种针对不同架构的gpu进行并行计算的优化系统 |
Also Published As
Publication number | Publication date |
---|---|
CN110399182B (zh) | 2023-05-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Rama-Maneiro et al. | Deep learning for predictive business process monitoring: Review and benchmark | |
Yan et al. | Performance modeling and scalability optimization of distributed deep learning systems | |
CN110399182A (zh) | 一种cuda线程放置优化方法 | |
JP5648584B2 (ja) | ソフトウェアアプリケーションのプロファイリング方法及び装置 | |
CN104331498B (zh) | 一种对互联网用户访问的网页内容自动分类的方法 | |
CN101799748B (zh) | 一种确定数据样本类别的方法及其系统 | |
CN108334954A (zh) | 逻辑回归模型的构建方法、装置、存储介质及终端 | |
CN108051660A (zh) | 一种变压器故障组合诊断模型建立方法及诊断方法 | |
Wong et al. | Extraction of parallel application signatures for performance prediction | |
WO2023207613A1 (zh) | 基于 fcnn 与 pso 相结合的事故序列筛选方法 | |
CN109242445A (zh) | 对数据产品全生命周期进行开发管理的系统、方法及装置 | |
CN102722610A (zh) | 一种由流程图自动产生覆盖率代码的方法及装置 | |
CN111563045A (zh) | 基于Adaboost模型的并发程序数据竞争语句级检测方法 | |
CN110287114B (zh) | 一种数据库脚本性能测试的方法及装置 | |
CN112287656A (zh) | 文本比对方法、装置、设备和存储介质 | |
Gao et al. | Research on software multiple fault localization method based on machine learning | |
CN114385465A (zh) | 一种故障预测方法、设备及存储介质 | |
CN111666748B (zh) | 一种自动化分类器的构造方法以及识别决策的方法 | |
CN117235582A (zh) | 基于电子病历的多粒度信息处理方法及装置 | |
CN110377525B (zh) | 一种基于运行时特征和机器学习的并行程序性能预测系统 | |
CN111444106B (zh) | 一种对软件可测试需求的分析方法及系统 | |
TW201218008A (en) | Intelligent architecture creator | |
CN114139802B (zh) | 一种基于流域水情变化趋势分析模型的实时优化调度方法 | |
CN109558735A (zh) | 一种基于机器学习的恶意程序样本聚类方法及相关装置 | |
CN112732549B (zh) | 基于聚类分析的测试程序分类方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |