用于转换多线程程序代码的设备和方法

文档序号:6545518阅读:149来源:国知局
用于转换多线程程序代码的设备和方法
【专利摘要】提供了一种用于转换多线程程序代码的设备和方法。所述方法包括:根据同步点将多线程程序代码划分为多个语句;通过基于在所述多个语句中包括的指令的数量合并一个或更多个相邻语句来产生至少一个循环组;扩展或重命名所述多个语句中的每个语句中的变量,使得在所述至少一个循环组中包括的每个语句针对不同工作组的工作项被执行;用工作项合并循环分别封闭产生的所述至少一个循环组中的每一个循环组。
【专利说明】用于转换多线程程序代码的设备和方法
[0001]本申请要求于2013年5月3日提交到韩国知识产权局的第10-2013-0050251号韩国专利申请的优先权,该申请整个公开通过引用全部合并于此。

【技术领域】
[0002]与示例性实施例一致的设备和方法涉及对程序进行编译,更具体地,涉及转换多线程程度代码。

【背景技术】
[0003]多核或众核技术已有了显著的发展。另外,在高性能计算领域中,用于执行数据并行程序的异构系统现在正引起注意。在这种情况下,开放计算语言(OpenCL)被提议以满足要求。OpenCL是用于在诸如中央处理单元(CPU)、图形处理单元(GPU)、数字信号处理器(DSP)和其它处理器的异构处理平台上进行并行编程的标准。OpenCL允许在各种平台上使用同一程序源码,以便给予软件开发者可移植性,并且使他们能够容易地使用平台的处理能力。


【发明内容】

[0004]一个或更多个示例性实施例的各方面提供了一种用于转换多线程程序代码的设备和方法。
[0005]根据示例性实施例的一方面,提供了一种用于转换多线程程序代码的方法,所述方法包括:根据同步点将多线程程序代码划分为多个语句;通过基于在所述多个语句中包括的指令的数量合并一个或更多个相邻语句来产生至少一个循环组;扩展或重命名所述多个语句中的每个语句中的变量,使得在产生的所述至少一个循环组中包括的每个语句针对不同工作组的工作项被执行;用工作项合并(coalesce)循环分别封闭产生的所述至少一个循环组中的每一个循环组。
[0006]多线程程序代码可以是OpenCL内核代码或统一计算装置架构(CUDA)内核代码。
[0007]同步点可包括:多线程程序代码的入口点、屏障函数和控制结构的入口点中的至少一个。
[0008]所述方法还可包括:基于由多线程程序代码所使用的存储器的容量来计算在单个循环组内可交替执行的工作组的数量,其中,产生所述至少一个循环组的步骤可包括:通过合并所述一个或更多个相邻语句来产生所述至少一个循环组,使得产生的所述至少一个循环组中的每一个循环组中的指令的数量接近或等于另一个循环组,且使得产生的所述至少一个循环组中的每一个循环组的语句的数量不超过计算出的工作组的数量。
[0009]所述方法还可包括:以预定方案对转换后的代码进行优化。
[0010]所述方法还可包括:添加在每个语句中设置变量以指示存储了将要执行的工作组的存储器偏移量的变量轮换代码。
[0011]所述方法还可包括:转换语句的代码,使得所述语句仅仅针对有效的工作组被执行。
[0012]转换语句的代码的步骤可包括:使用条件语句或论断(predicat1n)来转换语句的代码。
[0013]所述方法还可包括:用工作组交错循环来封闭工作项合并循环和变量轮换代码,使得每个语句针对所有工作组被执行。
[0014]根据另一示例性实施例的一方面,提供了一种用于转换多线程程序代码的设备,所述设备包括:代码划分器,被配置为根据同步点将多线程程序代码划分为多个语句;循环组产生器,被配置为通过基于在所述多个语句中包括的指令的数量合并一个或更多个相邻语句来产生至少一个循环组;变量扩展器(expander) /重命名器,被配置为扩展或重命名所述多个语句中的每个语句中的变量,使得同一循环组中的语句针对不同的工作组的工作项被序列地执行;工作项合并循环添加器,被配置为用工作项合并循环分别封闭产生的所述至少一个循环组中的每一个循环组。
[0015]多线程程序代码可以是OpenCL内核代码或CUDA内核代码。
[0016]同步点可包括:多线程程序代码的入口点、屏障函数和控制结构的入口点中的至少一个。
[0017]所述设备还可包括:工作组数量计算器,被配置为基于由多线程程序代码所使用的存储器的容量来计算循环组中的可执行的工作组的数量,其中,循环组产生器还被配置为:通过合并所述一个或更多个相邻语句来产生所述至少一个循环组,使得产生的所述至少一个循环组中的每一个循环组中的指令的数量接近或等于另一个循环组,且使得产生的所述至少一个循环组中的每一个循环组的语句的数量不超过计算出的工作组的数量。
[0018]所述设备还可包括:代码优化器,被配置为以预定方案对转换后的代码进行优化。
[0019]所述设备还可包括:变量轮换代码添加器,被配置为添加在每个语句中设置变量以指示存储了将要执行的工作组的存储器偏移量的变量轮换代码。
[0020]所述设备还可包括:代码转换器,被配置为转换语句的代码,使得语句仅仅针对有效的工作组被执行。
[0021]代码转换器还可被配置为:使用条件语句或论断来转换语句的代码。
[0022]所述设备还可包括:工作组交错循环添加器,被配置为用工作组交错循环来封闭工作项合并循环和变量轮换代码,使得每个语句针对所有工作组被执行。
[0023]根据另一示例性实施例的一方面,提供了一种用于转换多线程程序代码的方法,所述方法包括:通过基于在从多线程程序代码划分的多个语句中包括的指令的数量合并所述多个语句之中的一个或更多个相邻语句来产生至少一个循环组;修改所述多个语句,使得在产生的所述至少一个循环组中包括的每个语句针对不同工作组的工作项被执行;用工作项合并循环分别封闭产生的所述至少一个循环组中的每一个循环组。
[0024]其它特征和方面可从下面的详细描述、附图和权利要求变得清楚。

【专利附图】

【附图说明】
[0025]通过以下结合附图的对示例性实施例的描述,以上和/或其它方面将变得清楚且更容易理解,其中:
[0026]图1是示出多线程程序执行模型的示图;
[0027]图2A是示出包括屏障函数的内核代码的示例的示图;
[0028]图2B是示出通过基于工作组要素使工作项序列化从图2A中的内核代码进行转换而产生的代码的示例的示图;
[0029]图2C是示出图2B中的产生的代码的针对工作项的执行顺序的示图;
[0030]图3是示出根据示例性实施例的用于转换代码的设备的框图;
[0031]图4A是示出根据示例性实施例的从图2A中的内核代码进行转换而产生的代码的示图;
[0032]图4B是示出图4A中的产生的代码的针对工作项的执行顺序的示图;
[0033]图4C是示出表示图4A中的产生的代码的助记码的示图;
[0034]图5是示出根据示例性实施例的表示当待处理的工作组被动态分配时的转换结果的助记码的示图;
[0035]图6是示出根据示例性实施例的存储空间的布局的示例的示图;
[0036]图7是示出根据示例性实施例的用于转换内核代码的方法的流程图。

【具体实施方式】
[0037]提供下面的描述来帮助读者获得对描述于此的方法、设备和/或系统的全面理解。因此,本领域普通技术人员将会理解描述于此的方法、设备和/或系统的各种改变、修改和等同物。另外,为了更加清楚和简明,可省略对公知的功能和构造的描述。
[0038]贯穿附图和详细描述,除非另有描述,否则相同的附图标号将被理解为表示相同的元件、特征和结构。为了清楚、示意和方便,可夸大这些元件的相对大小和描绘。在下文中,当诸如“中的至少一个”的表达位于一列元素之后时,所述表达修饰整列元素而不修饰所述列中的单个元素。
[0039]图1是示出多线程程序执行模型的示图。
[0040]多线程程序是以共享程序代码的细粒度(fine-grained)多线程编程语言(诸如OpenCL和CUDA)编写的程序。例如,多线程程序可包括细粒度单程序多数据线程程序。多线程程序代码包括以OpenCL或CUDA编写的内核代码,参照内核代码来提供以下描述。
[0041]内核代码可包括一个或更多个语句。语句是构成程序的单个指令或有意义的表达,并可包括指令序列。
[0042]在多线程程序执行模型中,执行域被划分为多个工作项(例如,工作项111、工作项112和工作项113),使得内核代码可针对每个工作项(例如,工作项111、工作项112和工作项113)被执行。这里,可在独立的线程中交替执行每个工作项(例如,工作项111、工作项112和工作项113)。
[0043]当工作项将要被同步以共享数据时,待同步的工作项(例如,工作项111和工作项112)可被分类在一个工作组110中。也就是说,工作组是待同步的工作项的组,并可包括一个或更多个工作项。能够在属于同一工作组的工作项(例如,工作项111和工作项112)之间进行同步,而无法在属于不同的工作组的工作项(例如,工作项112和工作项113)之间进行同步。图1展示执行域被划分为15X15个工作项或5X5个工作组的情况。
[0044]同时,内核代码可包括屏障函数(B卩,屏障指令)。屏障函数用于使同一工作组中的工作项进行同步。屏障函数可被称为同步屏障函数、同步函数或屏障。如果内核代码包括屏障函数,则每个工作组中的所有工作项将会被同步,并且无法进行至在屏障函数之外的语句,直到工作组中的所有工作项到达屏障函数。
[0045]在下文中,将在待处理的多个工作项在单个处理元件中进行操作的假设下,详细描述转换用于并行处理的内核代码的方法。
[0046]图2A是示出包括屏障函数的内核代码的示例的示图,图2B是示出通过基于工作组单元使工作项序列化从图2A中的内核代码进行转换而产生的代码的示例的示图,图2C是示出图2B中的产生的代码的针对工作项的执行顺序的示图。
[0047]在多线程程序执行模型的执行域被划分为N个工作组且每个工作组包括M个工作项的假设下,工作项可由T(i,j)表示,其中,i表示指示相应的工作组的在OS i <N的范围内的数值,j表示指示相应的工作项的在范围O < j < M内的数值。
[0048]为了在低级并行处理器(或者具有少量处理元件的处理器)中执行所有NXM个工作项,在单个处理元件中处理各个工作项。为此,工作项将在被称为工作项序列化、结构化微线程或者工作项合并的处理中被序列化。
[0049]工作项序列化是通过用迭代语句封闭内核代码来转换内核代码,使得内核代码可被执行与待序列化的工作项的数量相等的次数的处理。此时,迭代语句可被称为工作项合并循环(WCL)或线程循环。
[0050]如图2A中所示,如果内核代码参照屏障函数230被划分为语句S1220和语句S2240,则工作项序列化可基于工作组单元被执行,使得参照屏障函数230被分隔的语句S1220和语句S2240分别被转换为语句SI’ 261和语句S2’ 271,其中,语句SI’ 261和语句S2’ 271产生与语句S1220和语句S2240相同的结果。可选地,产生两个工作项合并循环260和270来分别封闭语句SI’ 261和语句S2’ 271,其中,工作项合并循环260和270中的每个迭代地执行语句SI’ 261和语句S2’ 270。
[0051]已经通过基于工作组单元执行工作项序列化而被转换的代码250执行每个工作组的工作项。因此,针对如图2C中所示的序列中的每个工作项执行图2B中的语句S1’261和语句S2’ 271。也就是说,针对属于工作组i的所有工作项(从T(i,O)到T (i,M-1))执行语句SI’ 261,并随后针对属于工作组i的所有工作项(从T(i,0)到T(i,M-l))执行语句S2’ 271。另外,对属于工作组i+Ι的所有工作项(从T(i+1,0)到T(i+1,M-1))依次执行语句SI,261和语句S2’ 271。这样,提供基于上述序列中的工作组单元执行了工作项序列化的转换后的代码。
[0052]也就是说,如果通过基于工作组单元执行工作项序列化来转换内核代码,则具有屏障函数的内核代码被转换为各种小尺寸的迭代语句(也就是说,每个都具有较少的指令的多个迭代语句)。迭代语句中的指令数量的减少导致不太可能找到使得编译器的指令调度器或者中央处理单元(CPU)的无序调度器同时进行执行的指令,但是还增加用于具有语义(例如,指令变量的比较、指令变量的增加和分支)的指令的迭代的开销,使得指令级并行性(ILP)会降低。
[0053]图3是示出根据示例性实施例的用于转换代码的设备300的框图。
[0054]参照图3,用于转换代码的设备300包括代码划分器310、循环组产生器320、变量扩展器/重命名器330和工作项合并循环添加器340。
[0055]代码划分器310可根据同步点将输入的内核代码划分为一个或更多个语句。这里,同步点可包括内核代码的入口点、屏障函数和控制结构的入口点。
[0056]例如,如果内核代码不包括屏障函数,则可将内核代码本身确定为单个语句。在这种情况下,内核代码成为单个语句。
[0057]在另一示例中,如果内核代码包括屏障函数,则可参照屏障函数将内核代码划分为两个语句(即,屏障函数之前的一个语句和屏障函数之后的另一语句)。
[0058]可选地,在另一示例中,如果屏障函数被包括在条件语句中,则可将条件语句的外部划分为条件语句之前的语句和条件语句之后的语句。另外,可参照屏障函数将条件语句的内部划分为屏障函数之前的语句和屏障函数之后的语句。
[0059]另外,在另一示例中,如果屏障函数被包括在循环语句中,则循环语句外部的代码针对每个工作项被执行一次,而循环语句内部的代码针对每个工作项被执行与循环语句的迭代数量相等的次数。因此,循环语句外部的代码和循环语句内部的代码可被分离。换言之,针对循环语句的外部,可将内核代码划分为循环语句之前的语句和循环语句之后的语句。另外,针对循环语句的内部,可将内核代码划分为指定循环条件的语句、屏障函数之前的语句和屏障函数之后的语句。
[0060]循环组产生器320可基于由代码划分器310划分的语句中的指令的数量来产生包括将由工作项合并循环封闭的一个或更多个语句的循环组。
[0061]在示例性实施例中,循环组产生器320可通过基于每个单独的语句中的指令的数量合并相邻语句来产生循环组,使得每个循环组中的指令的数量可变得彼此接近或相等。
[0062]例如,假设将内核代码划分为五个语句且可在一个循环内交替执行三个工作组,其中,所述五个语句包括具有100个指令的语句S1、具有20个指令的语句S2、具有30个指令的语句S3、具有30个指令的语句S4和具有110个指令的语句S5。在这种情况下,为了使每个循环组中的指令的数量彼此接近或相等,循环组产生器320可产生包括语句SI的第一循环组(指令的数量=100)、包括语句S2、S3和S4的第二循环组(指令的数量=20+30+30=80)以及包括语句S5的第三循环组(指令的数量=110)。
[0063]针对由循环组产生器320产生的循环组中的每一个,变量扩展器/重命名器330可扩展或重命名每个语句中的变量,使得同一循环组中的语句针对不同工作组的工作项被序列地执行。
[0064]在示例性实施例中,变量扩展器/重命名器330可对每个语句中的变量执行标量扩展或者重命名所述变量,使得同一循环组中的每个语句针对不同工作组的工作项被序列地执行。在这种情况下,执行了标量扩展的变量可以是由每个工作项专有地使用的私有变量,并且将要被重命名的变量可以是在每个工作组内共享的局部变量。
[0065]由于标量扩展,属于每个工作组的工作项可在不同的位置具有变量。另外,通过重命名变量,可针对每个语句为将要执行的工作组设置不同的数据位置。
[0066]同时,为了保持内核代码的语义完整,当在单个循环组内执行多个语句时,可以以针对所有工作组执行所有语句的方式或者针对不同的工作组执行每个语句的方式执行转换后的代码。因此,将针对同一工作组执行属于转换后的代码的不同循环组的相邻语句。另夕卜,将针对不同工作组执行属于转换后的代码的同一循环组的相邻语句,使得语句越快出现在内核代码中,给予针对其执行所述语句的工作组的数量就越多。例如,假设语句Si属于第一循环组,语句S2、语句S3和语句S4属于第二循环组,语句S5属于第三循环组,且针对工作组i执行语句S2。在这种情况下,在第二循环组的语句S2、语句S3和语句S4之中,语句S2最早出现在内核代码中,使得针对工作组1-Ι和工作组i_2分别执行语句S3和S4。另外,语句SI和语句S2是属于不同循环组的相邻语句,因此针对同一工作组i执行语句SI和语句S2,类似地,针对同一工作组1-2执行语句S4和语句S5。
[0067]在示例性实施例中,当扩展或重命名每个语句中的变量时,变量扩展器/重命名器330可考虑每个语句的工作组。
[0068]工作项合并循环添加器340可产生并添加封闭在循环组产生器320中产生的每个循环组的工作项合并循环。
[0069]另外,设备300还可包括工作组数量计算器315,工作组数量计算器315被配置为计算在同一工作项合并循环内可交替执行的工作组的数量。
[0070]在示例性实施例中,通过考虑由代码划分器310分隔的语句的数量和用于每个工作组的存储器空间,工作组数量计算器315可计算可同时交替执行的工作组的数量。例如,如果可自由使用的存储器大小足够大,则工作组数量计算器315可确定可交替执行的工作组的数量接近或等于单独的语句的数量。可选地,如果可自由使用的存储器大小不足够大,则工作组数量计算器315可相应地减少可交替执行的工作组的数量,并通过考虑可自由使用的存储器大小来合理地计算可交替执行的工作组的数量。
[0071]在这种情况下,为了防止在单个循环组中包括的语句的数量超出由工作组数量计算器315计算出的可同时交替执行的工作组的数量,循环组产生器320在产生循环组时可考虑计算出的工作组的数量。
[0072]另外,设备300还可包括代码转换器350,代码转换器350被配置为添加或转换代码,使得每个语句仅针对有效的工作组被执行。例如,假设语句SI针对工作组i被执行,语句S2针对工作组1-Ι被执行,且工作组在O < i < N的范围内。在这种情况下,在i = O的条件下,语句S2将针对工作组-1被执行,但是工作组-1不存在。另外,在条件i = N下,语句SI将针对工作组N被执行,但是工作组N不存在。因此,在i = O的条件下,语句S2无法被执行,且在i = N的条件下,语句SI无法被执行。因此,代码转换器350可添加条件语句以使每个语句仅针对有效的工作组被执行,或者可转换相应的语句的代码以使用论断。
[0073]另外,设备300还可包括代码优化器360,代码优化器360被配置为对转换后的代码进行优化。
[0074]在示例性实施例中,代码优化器360可使用各种预设的循环优化方案或标量优化方案对代码进行优化。例如,如果代码已经被转换为使得每个语句仅针对有效的工作组被执行,则代码优化器360可通过循环外提(unswitching)对转换后的代码进行优化,或者可通过标量替换将私有变量从阵列变为普通变量。
[0075]另外,设备300还可包括变量轮换(rotat1n)代码添加器370,变量轮换代码添加器370被配置为添加使得每个语句中的变量指示存储了将要执行的工作组的存储器偏移量的变量轮换代码。也就是说,变量轮换代码是用于每个语句中设置变量来指示存储了将要执行的工作组的存储器偏移量的代码。
[0076]另外,设备300还可包括工作组交错循环添加器380,工作组交错循环添加器380被配置为产生并添加工作组交错循环,以封闭所有工作项合并循环和变量轮换代码,使得语句可针对所有工作组被执行。
[0077]图4A是示出从图2A中的内核代码进行转换而产生的代码的示图,图4B是所述产生的代码的针对工作项的执行顺序的示图,图4C是示出表示图4A中的产生的代码的助记码的示图。
[0078]参照图4A至图4C,示出根据示例性实施例进行转换而产生的代码410。
[0079]换言之,在图4A中的产生的代码410中,交替执行两个工作组。也就是说,按照针对工作组i_l的工作项(T(1-1,0))执行语句S2’’ 443并随后针对工作组i的工作项0(T(i,0))执行语句SI’’ 441的顺序,而不是按照针对工作组i的工作项0(T(i,0))执行语句SI’ ’ 441并随后针对工作组i的工作项I (T(1-1,O))执行语句SI’ ’ 441的顺序来执行产生的代码。换言之,后面的语句执行具有与前面的语句所执行的工作项的数值相比减小了 I的数值的工作项。这样的执行顺序可被表示为单个迭代语句(也就是说,工作项合并循环),并因此可在序列化处理期间产生较少的迭代语句。
[0080]同时,语句SI’’ 441和语句S2’’ 443可被依次安排在代码中,但是使用独立的数据,使得数据级并行性(DLP)可被达到。
[0081]变量轮换代码430是在每个语句中设置变量以指示存储了将要执行的工作组的存储器偏移量的代码,并且变量轮换代码430由变量轮换代码添加器370来添加。
[0082]在示例性实施例中,在所有工作组除了存储器偏移量以外具有相同的变量布局的情况下,变量轮换代码430可被配置为调整变量的引用/指针的偏移量。例如,在代码包括两个变量X和I的情况下,可通过声明与具有X和I的字段的结构类似的具有χΙΡ I,的字段的结构来执行重命名,并随后分别将X’和y’的字段中的变量输入到X和y的字段。在这种情况下,变量轮换代码可以是将特定偏移地址输入到在保持变量的过程中使用的结构的引用/指针的代码。
[0083]同时,工作组交错循环420是被插入以针对所有工作组执行所有语句441和语句443的循环。在某些情况下,在构成工作组交错循环420的迭代语句的开头和结尾处,语句SI’’ 441或语句S2’’ 443将不被执行。例如,如果工作组在O < i < N的范围内,如果工作组i是0,工作组I不存在,则语句S2’’ 443无法被执行。另外,如果工作组i是N且工作组N不存在,则语句SI’’ 441无法被执行。因此,为了使语句SI’’ 441或语句S2’’ 443满足各自的执行条件,代码转换器450对语句Sl’’441或语句S2’’443的每个代码进行转换。在这种情况下,就像如图4C中所示的代码那样,可利用条件语句或论断。
[0084]也就是说,当使用条件语句时,代码优化器360可通过循环外提对转换后的代码进行优化,当使用论断时,代码优化器360可通过论断分析对转换后的代码进行优化。
[0085]图5是示出根据示例性实施例的表示当待处理的工作组被动态分配时的转换后的代码的助记码的示图。图4C示出待处理的工作组被赋予从O到N-1的数值的示例,且相同的处理方法可适用于待处理的工作组被动态地赋予的情况。在图5中,假设工作组(WG)(在第三行)响应于空队列被设为无效,且如果工作组(WG)被设为无效,则一组变量(Vl)(在第五行)被设为无效。
[0086]图6是示出根据示例性实施例的存储器空间的布局的示图。
[0087]为了实现多线程程序,可将系统存储器地址空间划分为全局存储器、局部存储器和私有存储器。全局存储器是在整个域的所有工作组/工作项之间共享的用于存储数据的存储器,局部存储器是在同一工作组的工作项之间共享的用于存储数据的存储器,私有存储器是由单个工作组专有地使用的用于存储数据的存储器。
[0088]不同组的局部存储器和私有存储器被分配到每个工作组,并在相应的工作组的生命期内使用。因此,如果局部存储器和私有存储器在相应的工作组的生命期过去之后被重新分配到不同的工作组,则各个工作组可使用局部存储器和私有存储器。因此,如图6的示例中所示,可执行所有工作组,使得三组局部存储器LMl和私有存储器PMl、局部存储器LM2和私有存储器PM2以及局部存储器LM3和私有存储器PM3被保护并依次分配到相应的工作组。
[0089]例如,可这样执行工作组:工作组O被分配有局部存储器LMl和私有存储器PM1,工作组I被分配有局部存储器LM2和私有存储器PM2,工作组2被分配有局部存储器LM3和私有存储器PM3。在这种情况下,当工作组O被完成时,局部存储器LMl和私有存储器PMl被重新分配到下一个工作组(例如,工作组3)。
[0090]图7是示出根据示例性实施例的用于转换内核代码的方法的流程图。
[0091]参照图7,用于转换内核代码的方法包括在操作710根据同步点将内核代码划分为一个或更多个语句。同步点可包括内核代码的入口点、屏障函数和控制结构的入口点。
[0092]例如,如果内核代码不包括屏障函数,则参照内核代码的入口点,整个内核代码被视为单个语句。
[0093]在另一示例中,如果内核代码包括屏障函数,则可参照屏障函数将内核代码划分为屏障函数之前的语句和屏障函数之后的语句。
[0094]另外,在另一示例中,如果屏障函数被包括在条件语句中,则可将条件语句的外部划分为条件语句之前的语句和条件语句之后的语句。另外,可参照屏障函数将条件语句的内部划分为屏障函数之前的语句和屏障函数之后的语句。
[0095]另外,在另一示例中,如果屏障函数被包括在循环语句中,则循环语句外部的代码针对每个工作项被执行一次,而循环语句内部的代码针对每个工作组被执行与循环语句的迭代数量相等的次数。因此,可将循环语句的外部划分为循环语句之前的语句和循环语句之后的语句。另外,可将循环语句的内部划分为指定循环条件的语句、屏障函数之前的语句和屏障函数之后的语句。
[0096]在操作720,基于在每个单独的语句中包括的指令的数量来产生包括一个或更多个语句且将由工作项合并循环封闭的循环组。
[0097]在示例性实施例中,通过基于每个单独的语句中的指令的数量合并相邻语句来产生循环组,使得在每个循环组中包括的指令的数量可变得彼此接近或相等。
[0098]例如,假设将内核代码划分为五个语句且可在一个循环内交替执行三个工作组,其中,所述五个语句包括具有100个指令的S1、具有20个指令的语句S2、具有30个指令的语句S3、具有30个指令的语句S4和具有110个指令的语句S5。在这种情况下,为了使在每个循环组中的指令的数量彼此接近或相等,可产生包括语句SI的第一循环组(指令的数量=100)、包括语句S2、S3和S4的第二循环组(指令的数量=20+30+30 = 80)以及包括语句S5的第三循环组(指令的数量=110)。
[0099]在操作730,可使用标量扩展来扩展每个语句中的变量,或者重命名所述变量。
[0100]在示例性实施例中,可使用标量扩展来扩展循环组中的每个语句中的变量,或者可重命名所述变量,使得循环组的每个语句针对不同工作组的工作项被序列地执行。在这种情况下,将要被扩展的变量可以是由每个工作项专有地使用的私有变量,将要被重命名的变量可以是仅仅在同一工作组内共享的局部变量。
[0101]由于标量扩展,同一工作组的每个工作项可在不同位置具有变量。可选地,由于重命名变量,每个语句可指定将要执行的工作组的不同的数据位置。
[0102]同时,为了保持内核代码的语义完整,当在单个循环组内执行多个语句时,将以针对所有工作组执行所有语句的方式或者针对不同的工作组执行每个语句的方式执行转换后的代码。因此,将针对同一工作组执行属于转换后的代码的不同循环组的相邻语句。另夕卜,将针对不同工作组执行属于转换后的代码的同一循环组的相邻语句,使得语句越快出现在内核代码中,给予针对其执行所述语句的工作组的数量就越多。例如,假设语句Si属于第一循环组,语句S2、语句S3和语句S4属于第二循环组,语句S5属于第三循环组,且针对工作组i执行语句S2。在这种情况下,在第二循环组的语句S2、语句S3和语句S4之中,语句S2最早出现在内核代码中,使得针对工作组1-Ι和工作组i_2分别执行语句S3和S4。另外,语句SI和语句S2是属于不同循环组的相邻语句,因此针对同一工作组i执行语句SI和语句S2,类似地,针对同一工作组1-2执行语句S4和语句S5。
[0103]在示例性实施例中,当使用标量扩展来扩展每个语句中的变量或者重命名所述变量时,可考虑上述的每个语句的工作组。
[0104]在操作740,由工作项合并循环来封闭每个产生的循环组。
[0105]另外,用于转换代码的方法还可包括在操作715计算在单个工作项合并循环内可交替执行的工作组的数量。在示例性实施例中,通过考虑在操作710中分隔的语句的数量和用于每个工作组的存储器大小,可计算交替执行的工作组的数量。例如,如果可自由使用的存储器大小足够大,则可确定可交替执行的工作组的数量等于单独的语句的数量。可选地,如果可自由使用的存储器大小不足够大,则可根据可自由使用的存储器大小合理地减少交替执行的工作组的数量。
[0106]在这种情况下,在产生循环组的操作720期间,考虑在操作715计算出的工作组的数量,使得属于单个循环组的语句的数量不会超出计算出的工作组的数量。
[0107]另外,用于转换代码的方法还可包括添加或转换代码以使得每个语句可针对有效的工作组被执行的操作750。例如,假设语句SI和语句S2分别针对工作组i和工作组i_l被执行,且每个工作组在O < i < N的范围内。此时,如果给定i = O的条件,则语句S2将针对工作组-1被执行,但是工作组-1无效。因此,在i = 0的条件下,语句S2无法被执行,类似地,在i = N的条件下(工作组N无效),语句SI无法被执行。在这种情况下,可使用条件语句或使用论断仅针对有效的工作组执行每个语句。
[0108]另外,用于转换代码的方法还可包括以预定的方案对代码进行优化的操作760。在示例性实施例中,可采用循环优化和标量优化中的至少一种。例如,如果代码已经被转换为使得每个语句仅针对有效的工作组被执行,则可通过循环外提对转换后的代码进行优化,或者可通过标量替换将一些私有变量从阵列变为普通变量。
[0109]用于转换代码的方法还可包括添加变量轮换代码的操作770,其中,变量轮换代码在每个语句中设置变量,以指示存储了将要执行的工作组的存储偏移量。
[0110]另外,用于转换代码的方法还可包括:操作780,用工作组交错循环来封闭所有工作项合并循环,使得语句能够针对所有工作组被执行。此时,如果变量轮换代码被添加,则工作组交错循环可将变量轮换代码和工作项合并循环封闭在一起。
[0111]通过根据一个或更多个示例性实施例使OpenCL或CUDA程序代码序列化,可能在具有数量相对少的处理元件的装置中依次执行多个工作组。
[0112]另外,由于根据一个或更多个示例性实施例,在序列化期间产生较低数量的迭代语句,因此可减少由迭代语句导致的开销。
[0113]另外,由于根据一个或更多个示例性实施例,在迭代语句中包括的指令的数量增力口,且内核代码中的每个部分使用不同的数据执行计算,因此有更大的可能性找到可同时执行的指令,引起处理性能改进。
[0114]可在一个或更多个计算机可读存储介质中记录、存储或固定上述方法和/操作,其中,计算机可读存储介质包括将由计算机实现以促使处理器运行或执行程序指令的程序指令。所述介质还可单独地或与程序指令结合地包括数据文件、数据结构等。
[0115]计算机可读存储介质的示例包括:磁介质(诸如硬盘、软盘和磁带)、磁光介质(诸如光磁盘)、专门被配置为存储并执行程序指令的硬件装置(诸如只读存储器(ROM)、随机存取存储器(RAM)、闪存等)。程序指令的示例包括诸如由编辑器生成的机器代码和包含可由计算机使用解释器执行的更高级代码的文件。描述的硬件装置可被配置为用作一个或更多个软件模块,以便执行上述操作和方法,反之亦然。另外,计算机可读存储介质可被分布在通过网络连接的计算机系统之中,且计算机可读代码或程序指令可以以分散的方式存储和执行。另外,本领域的程序员可容易地推断出用于实现这些示例性实施例的功能程序、代码或代码段。
[0116]本领域的技术人员可理解:在不修改本发明构思的技术思想或实质特性的情况下,可作出各种特定修改。因此,以上公开的示例性实施例将被视为说明性的。本发明的范围在权利要求及其等同物中限定。
【权利要求】
1.一种用于转换多线程程序代码的方法,所述方法包括: 根据同步点将多线程程序代码划分为多个语句; 通过基于在所述多个语句中包括的指令的数量合并一个或更多个相邻语句来产生至少一个循环组; 扩展或重命名所述多个语句中的变量,使得在产生的所述至少一个循环组中包括的每个语句针对不同工作组的工作项被执行; 用工作项合并循环分别封闭产生的所述至少一个循环组中的每一个循环组。
2.如权利要求1所述的方法,其中,多线程程序代码是开放计算语言(OpenCL)内核代码或统一计算装置架构(CUDA)内核代码。
3.如权利要求1所述的方法,其中,同步点包括:多线程程序代码的入口点、屏障函数和控制结构的入口点中的至少一个。
4.如权利要求1所述的方法,还包括: 基于由多线程程序代码所使用的存储器的容量来计算产生的所述至少一个循环组的可执行的工作组的数量, 其中,产生所述至少一个循环组的步骤包括:通过根据计算出的可执行的工作组的数量合并所述一个或更多个相邻语句来产生所述至少一个循环组,使得产生的所述至少一个循环组中的每一个循环组中的指令的数量接近或等于另一个循环组,且使得产生的所述至少一个循环组中的每一个循环组的语句的数量不超过计算出的工作组的数量。
5.如权利要求1所述的方法,还包括: 以预定方案对转换后的代码进行优化。
6.如权利要求5所述的方法,其中,优化的步骤包括:通过采用循环优化和标量优化中的至少一种对转换后的代码进行优化。
7.如权利要求1所述的方法,还包括: 添加用于在所述多个语句中设置变量以指示存储了将要执行的工作组的存储器偏移量的变量轮换代码。
8.如权利要求1所述的方法,还包括: 转换所述多个语句之中的语句的代码,使得所述语句仅仅针对有效的工作组被执行。
9.如权利要求8所述的方法,其中,转换语句的代码的步骤包括:使用条件语句或论断来转换语句的代码。
10.如权利要求7所述的方法,还包括: 用工作组交错循环来封闭工作项合并循环和变量轮换代码,使得所述多个语句中的每个语句针对所有工作组被执行。
11.如权利要求1所述的方法,其中,划分的步骤包括:当多线程程序代码包括屏障函数时,将多线程程序代码划分为屏障函数之前的语句和屏障函数之后的语句。
12.如权利要求1所述的方法,其中,划分的步骤包括:当多线程程序代码包括在条件语句中包含的屏障函数时,将多线程程序代码划分为条件语句之前的语句和条件语句之后的语句,并将条件语句的内部划分为屏障函数之前的语句和屏障函数之后的语句。
13.一种用于转换多线程程序代码的设备,所述设备包括: 代码划分器,被配置为根据同步点将多线程程序代码划分为多个语句; 循环组产生器,被配置为通过基于在所述多个语句中包括的指令的数量合并一个或更多个相邻语句来产生至少一个循环组; 变量扩展器/重命名器,被配置为扩展或重命名所述多个语句中的变量,使得同一循环组中的每个语句针对不同工作组的工作项被序列地执行; 工作项合并循环添加器,被配置为用工作项合并循环分别封闭产生的所述至少一个循环组中的每一个循环组。
14.如权利要求13所述的设备,其中,多线程程序代码是开放计算语言(OpenCL)内核代码或统一计算装置架构(CUDA)内核代码。
15.如权利要求13所述的设备,其中,同步点包括:多线程程序代码的入口点、屏障函数和控制结构的入口点中的至少一个。
16.如权利要求13所述的设备,还包括: 工作组数量计算器,被配置为基于由多线程程序代码所使用的存储器的容量来计算产生的所述至少一个循环组的可执行的工作组的数量, 其中,循环组产生器还被配置为:通过根据计算出的可执行的工作组的数量合并所述一个或更多个相邻语句来产生所述至少一个循环组,使得产生的所述至少一个循环组中的每一个循环组中的指令的数量接近或等于另一个循环组,且使得产生的所述至少一个循环组中的每一个循环组的语句的数量不超过计算出的工作组的数量。
17.如权利要求13所述的设备,还包括: 代码优化器,被配置为以预定方案对转换后的代码进行优化。
18.如权利要求13所述的设备,还包括: 变量轮换代码添加器,被配置为添加用于在所述多个语句中设置变量以指示存储了将要执行的工作组的存储器偏移量的变量轮换代码。
19.如权利要求13所述的设备,还包括: 代码转换器,被配置为转换所述多个语句之中的语句的代码,使得所述语句仅仅针对有效的工作组被执行。
20.如权利要求19所述的设备,其中,代码转换器还被配置为:使用条件语句或论断来转换语句的代码。
21.如权利要求18所述的设备,还包括: 工作组交错循环添加器,被配置为用工作组交错循环来封闭工作项合并循环和变量轮换代码,使得所述多个语句中的每个语句针对所有工作组被执行。
22.一种用于转换多线程程序代码的方法,所述方法包括: 通过基于在从多线程程序代码划分的多个语句中包括的指令的数量合并所述多个语句之中的一个或更多个相邻语句来产生至少一个循环组; 修改所述多个语句,使得在产生的所述至少一个循环组中包括的每个语句针对不同工作组的工作项被执行; 用工作项合并循环分别封闭产生的所述至少一个循环组中的每个循环组。
23.如权利要求22所述的方法,还包括: 基于由多线程程序代码所使用的存储器的容量来计算产生的所述至少一个循环组的可执行的工作组的数量, 其中,产生所述至少一个循环组的步骤包括:通过根据计算出的可执行的工作组的数量合并所述一个或更多个相邻语句来产生所述至少一个循环组,使得产生的所述至少一个循环组中的每一个循环组中的指令的数量接近或等于另一个循环组,且使得产生的所述至少一个循环组中的每一个循环组的语句的数量不超过计算出的工作组的数量。
24.如权利要求22所述的方法,还包括: 添加用于在所述多个语句中设置变量以指示存储了将要执行的工作组的存储器偏移量的变量轮换代码。
【文档编号】G06F9/44GK104133668SQ201410184147
【公开日】2014年11月5日 申请日期:2014年5月4日 优先权日:2013年5月3日
【发明者】金圣建, 刘东勋, 李振锡, 黄锡重 申请人:三星电子株式会社
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1