一种面向多核处理器的程序划分方法及装置的制造方法_2

文档序号:9810248阅读:来源:国知局
< N,K为整数,
[0080] 所述分配单元,还用于若第一线程中的第一子节点的生命周期为0,且所述第一子 节点的下依赖节点数量为1,则将所述第一子节点的存储地址分配给第二子节点,所述第二 子节点为所述第一线程中的所述第一子节点的下依赖节点,所述第一线程为所述K个线程 中的一个。
[0081] 本发明提供一种面向多核处理器的程序划分方法及装置,通过从源程序的数据结 构中的入口节点开始,依次标记源程序的数据结构中的N个节点的层级,当该N个节点中层 级为Μ的第一节点的计算量小于预设的第一计算量阈值时,根据第一节点的下依赖节点数 量,从第一节点的依赖节点中确定备选节点集,该备选节点集中的每个备选节点的计算量 与第一节点的计算量之和均小于等于第二计算量阈值,再根据预设规则,从该备选节点集 中确定一个备选节点作为第一节点的目标节点,以及将第一节点和第一节点的目标节点合 并为第二节点,第二节点的层级与第一节点的目标节点的层级相同,将Μ加1后,重复执行 上述节点的合并过程,直至该源程序的数据结构中的所有节点合并结束。由于源程序的数 据结构中的Ν个节点表示源程序的Ν个语句,因此本发明通过采用上述方法将源程序的数 据结构中的Ν个节点合并为多个第二节点,可以将源程序划分为多个程序模块,其中,一个 第二节点表示一个程序模块,一个程序模块包括至少一个语句,从而能够将整个程序划分 为多个程序模块。且由于本发明的面向多核处理器的程序划分方法可以应用于多种操作系 统,并不限于主从线程模式的操作系统,因此本发明在对程序进行划分时无需依赖于操作 系统。进而当划分后的多个程序模块映射到CMP执行时,可以更好地发挥CMP的并行处理 性能。
【附图说明】
[0082] 图1为本发明实施例提供的一种面向多核处理器的程序划分方法的流程图一;
[0083] 图2为本发明实施例提供的源程序的数据结构的示意图一;
[0084] 图3为本发明实施例提供的源程序的数据结构的示意图二;
[0085] 图4为本发明实施例提供的一种面向多核处理器的程序划分方法的流程图二;
[0086] 图5为本发明实施例提供的一种面向多核处理器的程序划分方法的流程图三;
[0087] 图6为本发明实施例提供的满足仿射访问条件的循环的数据结构的示意图;
[0088] 图7为本发明实施例提供的程序划分装置的结构示意图一;
[0089] 图8为本发明实施例提供的程序划分装置的结构示意图二;
[0090] 图9为本发明实施例提供的程序划分装置的结构示意图三;
[0091] 图10为本发明实施例提供的程序划分装置的结构示意图四。
【具体实施方式】
[0092] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完 整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。
[0093] 本发明实施例提供的一种面向多核处理器的程序划分方法,可以通过能够实现本 发明实施例对程序进行划分的独立的软件模块实现,也可以将能够实现本发明实施例对程 序进行划分的软件模块集成在编译器中,通过编译器实现。即本发明实施例提供的面向多 核处理器的程序划分方法的执行主体可以为上述的编译器,也可以为上述的独立的软件模 块。下面实施例以编译器为例,对本发明实施例提供的面向多核处理器的程序划分方法进 行示例性的说明。
[0094] 实施例一
[0095] 本发明实施例提供一种面向多核处理器的程序划分方法,如图1所示,该方法可 以包括:
[0096] S101、编译器从源程序的数据结构中的入口节点开始,依次标记该源程序的数据 结构中的N个节点的层级,该入口节点的层级为1,该入口节点为上依赖节点数量为0的节 点,N彡1,N为整数。
[0097] 其中,源程序的数据结构中的入口节点可以有一个,也可以有多个,即层级为1的 节点可以有一个,也可以有多个。
[0098] 其中,编译器可以通过对该源程序采用静态单赋值(英文:Static Single Assignment缩写:SSA)技术,将该源程序中的所有语句,转换成N个节点,并生成该N个节 点的数据结构,其中,该N个节点的数据结构构成该源程序的数据结构。
[0099] 示例性的,例如,源程序为:
[0100] lsum = 0 ;
[0101] 2i = 1 ;
[0102] 3b = i*i ;
[0103] 4sum+ = b ;
[0104] 5i+ = 1 ;
[0105] 6b = i*i ;
[0106] 7sum+ = b ;
[0107] 8i = i-2 ;
[0108] 该编译器通过SSA技术,将该源程序中的8个语句转换为8个节点,分别为:语句 "sum = 0 ; "转换为节点sum〈0> ;语句"i = 1 ; "转换为节点i〈0> ;语句"b = "转换 为节点b〈0> ;语句"sum+ = b ; "转换为节点sum〈l> ;语句"i+ = 1 ; "转换为节点i〈l> ; 语句"b = i*i ; "转换为节点b〈l> ;语句"sum+ = b ; "转换为节点sum〈2> ;语句"i = i_2 ; "转换为节点i〈2>。编译器可根据源程序中各个语句的变量之间的关系,生成每个节 点的数据结构,并由该8个节点的数据结构构成该源程序的数据结构,其中,该源程序的数 据结构的示意图如图2(a)所示。
[0109] 进一步地,该N个节点中每个节点的数据结构至少包括该节点的下依赖节点、该 节点的下依赖节点数量、该节点的上依赖节点、该节点的上依赖节点数量、以及该节点的计 昇里。
[0110] 为了更好的说明节点的上依赖节点和节点的下依赖节点的含义,下面以该源程序 的数据结构中的节点i〈〇>和节点b〈0>为例,对节点的上依赖节点和节点的下依赖节点进 行示例性的说明。
[0111] 如该源程序所示,由语句"b = i*i ; "可知,变量b的赋值是通过变量i乘以i所 得的,即可以理解为变量b的赋值依赖于变量i的赋值。例如,当i = 1时,b = 1*1 = 1 ; 当i = 2时,b = 2*2 = 4。将语句"b = i*i ; "转换成节点b〈0>,将语句"i = 1 ; "转换 成节点i〈〇>后,由于变量b的赋值依赖于变量i的赋值,因此节点b〈0>与节点i〈0>之间 存在依赖关系,即节点b〈0>是节点i〈0>的下依赖节点,节点i〈0>是节点b〈0>的上依赖节 点。
[0112] 为了准确地表示每个节点在源程序中的属性,每个节点的数据结构还可以包括除 上述描述的属性之外的其他属性。具体的,N个节点中的每个节点的数据结构可以表示为 如下的代码:
[0113] Typedef struct node {//node 为每个节点
[0114] int name ;//node对应变量的变量名
[0115] int name_index ;//node对应变量名在所处函数变量名中的标号
[0116] int num ;//node在对应变量中所有node中的标号
[0117] int value ;//node 的值
[0118] int nodetype ;//node 的类型,如果为 const identifier,则值为 0 ;如果为 const 产生的IF node,则值为1 ;如果为输入变量,则值为2 ;如果为输入变量派生的变量,则值 为3 ;如果为函数node,则值为4 ;如果为输入变量产生的IF node,则值为5 ;如果为输出变 量,则值为6 ;
[0119] char readtext [200] ;//node 的可读代码;
[0120] char exetext [200] ;//node 的可执行代码;
[0121] int cal ;//node 的计算量;
[0122] int line ;//node对应语句在输入程序中的行号
[0123] struct node*up_depend[20] ;//node 的上依赖 node
[0124] struct node*down_depend[20] ;//node 的下依赖 node
[0125] int up_num ;//node 上依赖 node 的数量
[0126] int down_num ;//node 下依赖 node 的数量
[0127] int level ;//node的等级层次,表征其执行顺序
[0128] int thread ;//node 所在 thread 标号
[0129] int count ;//node变量名的生命周期
[0130] int rename ;//node 的重命名
[0131] }node ;
[0132] 本发明实施例中,若该节点的上依赖节点数量为0,则该节点为该源程序的数据结 构中的入口节点,该编译器从该入口节点开始,依次标记该N个节点的层级,其中,该入口 节点的层级为1。
[0133] 本发明实施例中,由于需从层级为1的节点开始依次找到可以与上一层级的节点 合并的节点,因此,入口节点的层级可以标记为1,且该入口节点可认为是开始合并的节点。 当然,本发明实施例可以不限制节点的层级的具体标记数值,即本发明实施例也可以将入 口节点的层级标记为其他数值,相应的,从入口节点开始依次找可以与上一层级的节点合 并的节点时,也需相应的根据标记的节点的层级进行适应性的调整。
[0134] 示例性的,上述源程序的数据结构中包括8个节点的数据结构,其中,节点sum〈0> 和节点i〈〇>没有上依赖节点,因此节点sum〈0>和节点i〈0>为源程序的数据结构的两个 入口节点。该编译器从该两个入口节点开始,依次标记该8个节点的层级,分别为将节点 sum〈0>的层级和节点i〈0>的层级标记为1,将节点b〈0>的层级和节点i〈l>的层级标记为 2,将节点sum〈l>的层级,节点b〈l>的层级和节点i〈2>的层级标记为3,将节点sum〈2>的 层级标记为4。
[0135] S102、由M= 1开始循环执行S103-S106,直至循环结束,Μ彡N,M为整数。
[0136] S103、若该N个节点中层级为Μ的第一节点的计算量小于预设的第一计算量阈值, 则该编译器根据该第一节点的下依赖节点数量,从该第一节点的依赖节点中确定备选节点 集,该备选节点集中的每个备选节点的计算量与该第一节点的计算量之和均小于等于预设 的第二计算量阈值。
[0137] 具体的,根据第一节点的下依赖节点数量,从该第一节点的依赖节点中确定备选 节点集的方法可以包括:
[0138] (1)若该第一节点的下依赖节点数量大于等于1,则该编译器可从该第一节点的 下依赖节点中确定备选节点集。
[0139] (2)若该第一节点的下依赖节点数量等于0,则该编译器可从该第一节点的上依 赖节点中确定备选节点集。
[0140] S104、该编译器根据预设规则,从该备选节点集中确定一个备选节点作为该第一 节点的目标节点。
[0141] 其中,第一节点的目标节点可以理解为能够与第一节点合并为一个节点的节点。
[0142] 具体的,该编译器根据预设规则,从备选节点集中确定一个备选节点作为该第一 节点的目标节点的具体实现方式,可以为下述的一种:
[0143] (1)当该第一节点的下依赖节点数量为1时,备选节点集中包括一个备选节点(第 一节点的下依赖节点),则该编译器可将该一个备选节点为该第一节点的目标节点。
[0144] (2)当该第一节点的下依赖节点数量大于1时,备选节点集中包括多个备选节点 (第一节点的下依赖节点),预设规则可以为该备选节点集中的备选节点的层级和备选节 点的上依赖节点数量。具体的,该编译器可根据备选节点的层级,首先从该备选节点集中确 定层级最小的至少一个备选节点,再根据备选节点的上依赖节点数量,从层级最小的至少 一个备选节点中确定上依赖节点数量最大的一个备选节点作为该第一节点的目标节点。
[0145] (3)当该第一节点的下依赖节点数量为0时,备选节点集中包括多个备选节点(第 一节点的上依赖节点),预设规则可以为该备选节点集中的备选节点的上依赖节点数量。具 体的,该编译器可根据备选节点的上依赖节点数量,从该备选节点集中确定上依赖节点数 量最大的一个备选节点作为该第一节点的目标节点。
[0146] (4)当该第一节点的下依赖节点数量为0时,备选节点集中包括多个备选节点(第 一节点的上依赖节点),预设规则可以为该备选节点集中的备选节点的计算量和备选节点 的上依赖节点数量。具体的,该编译器可根据备选节点的计算量,从该备选节点集中确定计 算量最小的至少一个备选节点,再根据备选节点的上依赖节点数量,从计算量最小的至少 一个备选节点中确定上依赖节点数量最大的一个备选节点作为该第一节点的目标节点。
[0147] S105、该编译器将该第一节点和该第一节点的目标节点合并为第二节点,该第二 节点的层级与该第一节点的目标节点的层级相同。
[0148] 具体的,上述该编译器将第一节点和该第一节点的目标节点合并为第二节点的方 法可以为:该编译器根据该第一节点的数据结构和该第一节点的目标节点的数据结构,确 定该第二节点的数据结构。例如,在该第二节点的数据结构中,该第二节点的下依赖节点数 量为该第一节点的下依赖节点中除该第一节点的目标节点之外的下依赖节点数量,和该第 一节点的目标节点的下依赖节点数量之和,该第二节点的上依赖节点数量为该第一节点的 上依赖节点数量,和该第一节点的目标节点的上依赖节点中除该第一节点之外的上依赖节 点数量之和,该第二节点的下依赖节点为该第一节点的目标节点的下依赖节点,和该第一 节点的下依赖节点中除该第一节点的目标节点之外的下依赖节点,该第二节点的层级与该 第一节点的目标节点的层级相同。
[0149] 示例性的,如图3(a)所示,假设第一节点为节点{3, 4, 5},第一节点{3, 4, 5}有2 个上依赖节点,分别为节点1和节点2,第一节点{3, 4, 5}的目标节点为节点8,目标节点8 有2个上依赖节点,分别为第一节点{3, 4, 5}和节点6。当该编译器将第一节点{3, 4, 5}和 目标节点8合并成第二节点{3, 4, 5, 8}后,如图3(b)所示,第二节点{3, 4, 5, 8}的上依赖 节点数量为第一节点{3, 4, 5}的上依赖节点数量,和目标节点8上依赖节点中除第一节点 {3, 4, 5}之外的上依赖节点数量之和,即第二节点{3, 4, 5, 8}有3个上依赖节点,分别为节 点1,节点2,以及节点6。
[0150] 同理,如图3(c)所示,第一节点{3, 4, 5}有2个下依赖节点,分别为节点7和目标 节点8,目标节点8具有1个下依赖节点9,当该编译器将第一节点{3, 4, 5}和目标节点8合 并形成第二节点{3, 4, 5, 8}后,如图3(d)所示,第二节点{3, 4, 5, 8}的下依赖节点数量为 第一节点{3, 4, 5}的下依赖节点中除目标节点8之外的下依赖节点数量,和目标节点8的 下依赖节点数量之和,即第二节点{3, 4, 5, 8}有2个下依赖节点,分别节点7和节点9。
[0151] S106、该编译器将Μ加1。
[0152] 具体的,该编译器由层级为1的第一节点开始进行合并,当该编译器合并到层级 为Μ的第一节点时,若层级为Μ的第一节点的计算量大于等于上述的第一计算量阈值,且该 第一节点的下依赖
当前第2页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1