一种GPU微指令探测方法与流程

文档序号:18409183发布日期:2019-08-10 00:47阅读:283来源:国知局
一种GPU微指令探测方法与流程

本发明涉及计算机编程领域,具体涉及一种gpu微指令探测方法。



背景技术:

随着gpu的高速发展以及cuda编程模型的日趋成熟,gpu这种通用众核处理器已经成为计算物理,天气预测,人工智能等高密度计算科学的首选协处理器芯片。然而,由于桌面以及服务器级gpu生产厂商nvidia的封闭性,只为gpu编程人员提供比较上层的cudac以及中间层的cudaptx编程模型,对于底层的指令集只做了极少量的介绍,与此同时,nvidia也没有公开其内部的汇编器。因此第三方开发人员仅仅通过nvcc编译出来的cuda程序很难充分利用gpu的各种计算与存储资源,实际获得的性能距离gpu的理论峰值会有比较大的差距。虽然文献对gpu的某些微架构的特性进行了一定的测试,但是基于cudac的测量依然不够准确且没有深入到指令级。



技术实现要素:

针对现有技术的不足,本发明的目的在于提供一种gpu微指令探测方法,用于解决现有技术中存在的基于cudac的测量依然不够准确且没有深入到指令级的问题。

为实现上述目的,本发明采用的技术方案为:

一种gpu微指令探测方法,所述方法包括如下步骤:

探测指令的编码规则;

探测寄存器bank冲突,获取无bank冲突的寄存器;

测量指令延迟,获取指令的延迟周期数。

进一步的,所述指令包括源寄存器数量为2的运算指令和三元运算指令。

进一步的,所述编码规则包括:当前指令语义的编码和操作数编码。

进一步的,所述当前指令语义的编码的探测方法包括:

对获得的编码按位逐一进行异或操作,并将结果重新插入cubin文件;

利用cuobjdump工具对新生成的cubin进行反汇编;

判断当前异或操作的位是否属于指令编码。

进一步的,所述操作数编码探测方法包括:

固定指令编码;

对非指令编码的位进行逐次异或操作,并将结果重新插入cubin文件;

利用cuobjdump工具对新生成的cubin进行反汇编比对;

判断当前异或操作的位是否属于操作数编码。

进一步的,寄存器bank冲突的探测方法包括:

固定目标寄存器的编号,遍历剩余所有寄存器的组合作为源寄存器组,关闭寄存器重用机制,通过所述编码规则运行对应的指令,获取所述指令的实际性能,由实际性能与理论性能之差判断当前的源寄存器组是否存在bank冲突,获取无bank冲突的寄存器。

进一步的,所述bank冲突的判断方法包括:如果所述指令的实际性能远小于gpu的理论值,则认为当前的源寄存器组存在bank冲突,否则不存在bank冲突。

进一步的,所述源寄存器组包括二元组合和三元组合。

进一步的,测量指令延迟的步骤包括:挑选处于同一bank的不同寄存器,任意选取一个寄存器作为目标寄存器,通过所述指令对目标寄存器写入一个值,然后在下一条指令对目标寄存器进行读取,从1开始通过遍历控制码中的延迟字段,对下一条指令读取的数值进行检验,如果读取结果错误则相应地对延迟字段加1,否则当前的延迟字段即为所述指令的延迟周期数。

与现有技术相比,本发明具有如下的有益效果:该方案可以探测出pascal架构gpu的指令编码规则以及相应的延迟,bank冲突等底层的特性,通过合理的寄存器选择以及指令排序,为汇编级优化gpu算法,逼近gpu的理论峰值极限提供依据。

附图说明

图1为本发明微指令探测方法的流程图。

具体实施方式

下面对本发明作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。

如图1所示,一种gpu微指令探测方法,所述方法包括如下步骤:

探测指令的编码规则,由于nvidia并未开放gpu汇编指令集与机器码的编码对应规则,因此需要探测该规则用来正确生成cubin文件供cudadriverapi加载。例如一条单精度浮点乘加指令结构如下:

ffmar9,r66,r3,r28/*0x59800c0001d74209*/

最右边的64-bit编码包含了当前指令ffma的语义信息以及寄存器编号的对应信息,因此,编码规则的探测由两部分组成:

探测当前指令语义的编码,对获得的编码按位逐一进行异或操作,并将结果重新插入cubin文件,然后利用nvidia提供的cuobjdump工具对新生成的cubin进行反汇编,如果正确生成了不同的指令同时与所有的操作寄存器相同,则认为当前异或操作的位属于指令编码;例如,上述的融积和指令的语义编码对应了最高位的12-bit,即0x5980000000000000。

探测操作数的编码,方法与当前指令语义的编码探测类似,但需要先固定指令,即对非指令编码的位进行逐次异或操作,并将结果重新插入cubin文件,再利用cuobjdump工具对新生成的cubin进行反汇编比对,例如,对于剩余的低52-bit的编码,从最低位开始逐位进行异或操作,对于最低的8-bit,后三个寄存器r66,r3和r28都不会发生变化但是第一个目标寄存器r9会不断发生变化,从r0变到r255,正好符合pascal架构的gpu每线程最多256个寄存器的限制。因此,可以知道最后8-bit位对应了第一个目标寄存器,编码数字的规则为寄存器编号的16进制表示。其余类似。

探测寄存器bank冲突,判断寄存器间是否存在bank冲突,获取无bank冲突的寄存器;

寄存器bank冲突探测步骤包括:与片上的sharedmemory类似,gpu的寄存器同样存在bank冲突,即对处于相同bank的不同寄存器,在读取的时候是串行读取。测试方案为:对于源寄存器数量为2的运算指令,固定目标寄存器的编号,遍历剩余所有寄存器的二元组合作为源寄存器组,并关闭寄存器重用机制,通过编码规则运行对应的指令,获取所述指令的实际性能,由实际性能与理论性能之差判断当前的源寄存器组是否存在bank冲突。如果测得的性能远小于gpu的理论值,则认为当前的二元组合存在bank冲突,否则不存在。同时,对参与测试的寄存器从0开始进行编号,处于相同bank的寄存器的编号相同,这样可以测得bank的数量。对于源寄存器和目标寄存器的组合,则跳过上述步骤,因为目标寄存器本身需要一定时间的延迟才能获得计算结果,不会与源寄存器的获取造成冲突。对于三元运算指令,例如ffma,可以通过上述的测试结果进行验证。

测量指令延迟,获取指令的延迟周期数;与cpu的工作方式不同,现代gpu将指令执行的逻辑下放到软件层面,通过控制编码(controlcode)为每3条指令提供调度信息。控制码中的最低位字段用来设置当前指令写后读(raw)的延迟周期数。测试该延迟周期的方案为:挑选处于同一bank的不同寄存器,任意选取一个无bank冲突的寄存器作为目标寄存器,使用待测试的指令对其写入一个值,同时保证在执行的时候不存在寄存器bank冲突,并在下一条指令立刻对进行读取,从1开始通过遍历控制码中的延迟字段对读取的数值进行检验。如果读取结果错误则相应地对延迟字段加1,否则当前的延迟字段即为该指令的延迟周期数。测试指令延迟对于汇编级优化算法具有重大的意义,即可以在前后两条相关指令之间放入若干无关指令来减少流水线的额外等待。测试的时候内核函数只需要设置1个线程块,该线程块包含1个warp即可,避免硬件调度多个warp带来的干扰。

指令双发:与早期kepler架构的gpu不同,pascal架构的gpu一个核上只有128个运算单元,而4组warp调度器每周期发射的线程数正好为128,恰好将128个运算单元全部占满,不存在闲置的运算单元,对于前后两条目标寄存器不相关的ffma指令无法形成dualissue。因此无需像参考文献那样考虑两条前后不相关的ffma双发,只需要尽可能的将计算指令与数据读取或存储指令安排在一起,同时将计算指令的延迟在控制码中设为0即可。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1