CN1918546A - 程序转换装置及程序转换方法 - Google Patents
程序转换装置及程序转换方法 Download PDFInfo
- Publication number
- CN1918546A CN1918546A CNA2005800046856A CN200580004685A CN1918546A CN 1918546 A CN1918546 A CN 1918546A CN A2005800046856 A CNA2005800046856 A CN A2005800046856A CN 200580004685 A CN200580004685 A CN 200580004685A CN 1918546 A CN1918546 A CN 1918546A
- Authority
- CN
- China
- Prior art keywords
- mentioned
- circulation
- instruction
- occurrence
- program
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
一种不再无端发出有可能引起互锁的指令,可以提高程序运行时的处理速度的编译器,其面向处理器并具备运行时有可能引起互锁的指令,其特征在于,赋予计算机功能,具备:循环结构转换部(186),对输入程序进行双重循环转换,把循环次数是x次的循环分割为循环次数是y次的循环,把上述循环次数是y次的循环作为内循环,把循环次数是x/y次的循环作为外循环;指令最佳配置部(187),对上述双重循环转换之后的程序进行有可能引起互锁的指令的配置。
Description
技术领域
本发明涉及程序转换装置,尤其是涉及具备指令***(instruction set)的面向处理器的程序转换装置,其中该指令***包含在运行时等待来自外部的指定应答的指令。
背景技术
近几年来,处理器的处理速度急剧提高,然而与其相比,主存储器的存取速度的提高幅度很小,两者的速度差逐年增大。为此,在信息处理装置的高速处理中,存储器存取成为瓶颈的问题早已被指出。
为了解决这个问题,根据存储分层的考虑方法,使用了高速缓存机构。在高速缓存机构中,把处理器中必须的数据从主存储器事先传输(预取)到高速的高速缓存中。由此,可以高速应对来自处理器的存储器存取。
然而,处理器存取高速缓存上并不存在的数据时,就会产生高速缓存失误。由此,产生了从主存储器向高速缓存传输数据耗费时间的问题。
用户意识不到高速缓存进行编程,如果运行这个程序,可以设想到会频繁产生这种高速缓存失误。结果,高速缓存失误引起的损失很大程度地恶化了处理器的性能。为此,编译器有必要进行考虑了高速缓存的最佳化。
作为高速缓存最佳化技术之一,可以例举预取指令的***被提出来。预取指令指的是,在参照某存储器地址之前,把这个地址的数据,提前从主存储器传输到高速缓存上。在预取指令的***的最佳化中,在开始参照该存储器地址的稍微提前一点的周期里,***预取指令。
例如,对于如图1(a)所示的循环处理,如图1(b)所示,考虑数据被参照之前的等待(latency)时间,把预取指令(dpref())***循环内,以便预取在多个迭代前被参照的数据。另外,在这里设int型的数组a的要素是4字节,高速缓存的行大小(line size)为128字节。
但是,图1(b)所示的代码中,对于1个迭代分别进行了数组a的参照和预取,参照只能以每4字节进行,与此相对,预取则以1行(128字节)单位进行。
因此,1次的预取可以对应32次的参照,剩余31次成了进行无用的预取的状态。也就是说,连续发出了相同行的预取指令。
而且,通过处理器,在dpref指令的数据传输中,如果要运行下一个dpref指令,尽管按照前面的dpref指令的主存储器向高速缓存的数据传输没有结束,也会发出下一个dpref指令,尽管本来是为了消除互锁***了dpref指令,还是会引起互锁。
因此,如上所述,如果循环的1个迭代短,2个dpref指令的间隔短,则按照dpref指令的主存储器到高速缓存的数据传输所消耗的时间(等待时间)变得显著,反而恶化了性能。
而且,即使是在dpref指令的运行状态以外,如存储器存取指令等,即使是指令发出后发生任何的应答等待的指令的情况,也可能引起互锁。
发明内容
本发明,正是为了解决上述课题而做出的,其目的在于,提供一种不再无用地发出有可能引起互锁的指令,可以提高程序运行时处理速度的程序转换装置及程序转换方法。
而且,本发明的目的在于,提供一种程序转换装置及程序转换方法,,不再无用得发出在指令发出后发生某种应答等待的指令,可以提高程序运行时处理速度。
而且,本发明的目的是提供一种程序运行时不会引起互锁的程序转换装置及程序转换方法。
为了达到上述目的,本发明涉及的程序转换装置,是一种面向处理器的程序转换装置,该处理器具备包含运行时等待来自外部的指定应答的指令的指令***,其特征在于,具备:
进行双重循环的循环结构转换装置,其中双重循环转换是把包含于输入程序中的反复次数是x次的循环转换为:反复次数是y次的循环作为内循环,反复次数是x/y次的循环作为外循环的嵌套结构;
指令配置装置,在上述内循环的外部位置配置上述指令,由此转换为包含该指令的输出程序。
由此,例如如图2所示,把图1(a)所示的循环处理双重循环化,并且可以在最内循环的外侧***预取指令。由此,消除了没用的预取运行。由此提高了处理速度。而且,从一个dpref指令运行后到下一个dpref指令运行之前的期间,可以隐蔽从主存储器到高速缓存传输数据耗费的等待时间,难以发生互锁。
也就是说,依据本发明,由于循环的双重化,如果在内循环的外侧运行有可能引起互锁的指令,可以不用多余发出相应指令就可以提高程序运行时的处理速度。
而且,由于循环的双重化,可以保证发出有可能引起互锁的指令之后到下一个有可能引起互锁的指令为止的期间的周期数。为此,程序运行时很难引起互锁。
另外,程序转换装置,可以作为编译器、OS(Operating System)或者CPU等的集成电路来实现。
应答等待指令包括:如上述的dpref指令那样可能引起互锁的指令和指令运行时等待来自外部的指定应答的指令,另外还有等待应答的情况和不等待应答情况的指令。
而且,本发明,不仅能作为具备这种特征装置的程序转换装置来实现,还可以由把程序转换装置所具备的特征装置作为步骤的程序转换方法来实现,作为程序转换装置也可以由赋予计算机功能的程序来实现。而且,这种程序,可以通过CD-ROM(Compact Disc-Read OnlyMemory:光盘只读存储器)等记录媒介和因特网等传输媒介流通是不言而喻的。
发明效果
依据本发明,可以提高程序运行时的处理速度。
而且,程序运行时不易引起互锁问题。
附图说明
图1是说明过去最佳化技术的问题点的图;
图2是说明依据本发明的循环处理的结构转换的图;
图3是表示有关本实施例的编译器***组成的图;
图4是表示编译器组成的图;
图5是编译器所运行的处理的流程图;
图6是说明循环结构转换处理的具体内容的图;
图7是表示复制型内循环分割处理的具体内容的流程图;
图8是表示条件型内循环分割处理的具体内容的流程图;
图9是表示预取指令配置处理的具体内容的流程图;
图10是表示预取指令***处理的具体内容的流程图;
图11是说明不需要剥离时的单循环分割处理的图;
图12是表示不需要剥离时的源程序的一个例图;
图13是表示对应图12所示的源程序的中间语言程序的图;
图14表示的是把图13所示的中间语言的程序结构转换为双重循环之后的中间语言程序的图;
图15表示的是对图14所示的中间语言程序***预取指令之后的中间语言程序的图;
图16是用来说明需要剥离时的单循环分割处理的图;
图17是用来说明循环内存在多个数组存取时的循环分割处理的图;
图18是用来说明循环内存在多个数组存取时的循环分割处理的图;
图19是用来说明循环内存在多个数组存取,且数组要素的大小全部不同时的循环分割处理的图;
图20是用来说明循环内存在多个数组存取,且数组要素的大小全部不同时的循环分割处理的图;
图21是说明循环内存在跨距不同的多个数组存取时的循环分割处理的图;
图22是说明循环次数不确定的循环处理的循环分割处理的图;
图23是说明循环次数不确定的循环处理的循环分割处理的图;
图24是说明不需要循环分割的最佳化处理的图;
图25是说明在循环内存取的要素在主存储器上没有适当排序(align)时的循环分割处理的图;
图26是说明在循环内存取的要素在主存储器上没有适当排序时的循环分割处理的图;
图27是说明动态确定没有排序的数组要素,且对循环处理进行最佳化处理的图;
图28是说明没有排序的数组要素的图;
图29是说明使用剖面信息确定没有排序的数组要素,且对循环处理进行最佳化处理的图;
图30是说明对最内循环以外的循环进行结构转换的图;
图31是说明由编译指示(pragma)【#pragma_loop_tiling_dpref变量名[,变量名]】确定变量情况下的最佳化处理的图;
图32是说明***PreTouch指令时不需要剥离情况下的单循环分割处理的图;
图33是说明***PreTouch指令时需要剥离情况下的单循环分割处理的图;
图34是说明动态确定没有排序的数组要素,且对循环处理进行最佳化处理的图。
标号说明
141:源程序
142:高速缓存参数
143:汇编文件
144:目标文件
145:运行程序
146:运行登录数据
147:剖面(profile)数据
148:编译***
149:编译器
150:汇编程序
151:连接程序
152:模拟器
153:剖析工具
181:最佳化辅助信息
182:语法解析部
183:最佳化信息解析部
184:普通最佳化部
185:指令编排部
186:循环结构转换部
187:指令最佳配置部
188:代码输出部
实施发明的最佳实施例
***组成
图3是表示有关本实施例的编译***组成的图。编译***148是把以C语言等高级语言记述的源程序141转换为机器语言的运行程序145的软件***,包括编译器149、汇编程序150和连接程序151。
编译器149,把具备高速缓存的计算机的CPU(CentralProcessing Unit)作为目标处理器,是把源程序141转换为以汇编语言记述的汇编程序143的程序。编译器149,在把源程序141转换为汇编程序文件143之际,根据与高速缓存的行大小和等待周期等信息有关的高速缓存参数142和下述的剖面数据147,进行最佳化处理,并输出汇编程序文件143。
汇编程序150是把以汇编语言记述的汇编程序文件143转换为以机器语言记述的目标文件144的程序。连接程序151是结合多个目标文件144,并生成运行程序145的程序。
作为运行程序145的开发工具,准备了模拟器152及剖析工具153。模拟器152是模拟运行程序145,输出运行时的各种运行登录数据146的程序。剖析工具153,是解析运行登录数据146,输出解析了程序的运行顺序等的剖面数据147的程序。
编译器组成
图4是表示编译器组成的图。编译器149包括:语法解析部182、最佳化信息解析部183、普通最佳化部184、指令编排部185、循环结构转换部186、指令最佳配置部187、代码输出部188。各组成处理部作为程序来实现。
语法解析部182是把源程序141作为输入接收,并在进行语法解析处理之后输出中间语言程序的处理部。
最佳化信息解析部183是读入高速缓存参数142、剖面数据147、编译程序选项及编译指示(pragma)等中间语言的最佳化处理必须的信息,并进行解析的处理部。普通最佳化部184,是对中间代码实施普通的最佳化处理的处理部。指令编排部185是使指令排列最佳化、进行指令编排的处理部。编译程序选项及编译指示(pragma)都是针对编译器的指示。
循环结构转换部186,是把单层循环转换为双重循环的处理部。指令最佳配置部187,是在转换的双重循环内配置预取指令的处理部。代码输出部188,是把最佳化后的中间语言规格的程序转换为以汇编语言记述的程序并输出汇编程序文件143的处理部。
处理流程
下面,说明编译器149所运行的处理的流程。图5是编译器149所运行的处理的流程图。
语法解析部182,进行源程序141的语法解析,生成中间代码(S1)。最佳化信息解析部183,解析高速缓存参数142、剖面数据147、编译程序选项及编译指示等(S2)。普通最佳化部184,根据最佳化解析部183中的解析结果,进行普通的中间代码的最佳化(S3)。指令编排部185,进行指令的编排(S4)。循环结构转换部186,着眼于包含在中间代码的循环结构,如果需要就把单层循环转换为双重循环结构(S5)。指令最佳配置部187,把预取循环结构内被参照的数据的指令***中间代码(S6)。代码输出部188,把中间代码转换为汇编代码,作为汇编程序文件143进行输出(S7)。
语法解析处理(S1)、最佳化信息解析处理(S2)、普通的最佳化处理(S3)、指令编排处理(S4)及汇编代码输出处理(S7)和普通的处理一样,因此其详细说明在这里不再重复。
下面,对循环结构转换处理(S5)及预取指令配置处理(S6)进行详细说明。
图6是用来说明循环结构转换处理(图5的S6)的具体内容的图。循环结构转换部186,判断循环次数是被立即给予而可以算出,或者是以其它变量给予且不能算出(S11)。也就是说判断循环次数是固定的还是不确定的。
如果是循环次数不确定的情况(在S11中是NO),依据编译指示或者编译程序选项判断有无最低循环次数的指定,或者程序运行时动态判定循环次数,来判断有无分割循环的指定(S12)。
如果有任何一种指定(S12中是YES),或者循环次数是固定值的情况(S11中是YES),调查循环内所参照的数组的下标是否可以解析(S13)。也就是说,如果循环计数是具有某种规律而在变化的情况,就判断为可以解析。例如,如果循环计数的值在迭代内可以置换,则判断为不可以解析。
下标如果是可以解析的情况(S13中是YES),对在循环处理内被参照的各数组求出在1个迭代中参照的要素字节数,导出其中最小的值LB(S14)。
然后,判断高速缓存的行大小CS除以值LB的值是否大于1(S15)。如果CS/LB的值比1大时(S15中是YES),调查循环处理的数组是否被排序(align)(S16)。数组是否被排序的判断,根据是否有依据编译指示或编译程序选项等被排序这样的指示来进行判断。
数组没有被排序时(S17中是NO),进行【LB*LC/IC】是否比CS大的判断(S16)。这里,LC表示等待时间的周期数,IC表示每1个迭代的周期数。【LC/IC】,表示循环分割为多个最内循环情况下的各循环的循环次数,【LB*LC/IC】表示各循环中的存取容量。
如果【LB*LC/IC】大于行大小CS时(S16中是YES),在分割后的各循环处理中参照1个行大小以上的要素。为此,以分割因子为周期,根据式(1)导出把各循环处理进行双重循环时的最内循环的循环次数DT(S18)。
DT=(LC-1)/IC+1…(1)
如果【LB*LC/IC】是行大小CS之下的情况(S16中是NO)或者数组被排序的情况(S17中是YES),以分割因子为大小,根据式(2)导出把各循环处理进行双重循环时的最内循环的循环次数DT(S19)。
DT=(CS-1)/LB+1…(2)
在导出最内循环的循环次数DT的处理之后(S18或者S19),判断最内循环的循环次数DT是否比1大(S20)。DT如果是1(S20中是NO)的情况,由于最内循环的循环次数DT是1次,因此没有必要把循环转换为双重循环。为此,结束循环结构转换处理(S5)。
如果最内循环的循环次数DT是2以上的情况(S20中是YES),就做成循环结构转换为双重循环时的外循环结构(S21)。生成外循环结构时,判断是否需要剥离处理(S22)。下面叙述剥离处理及是否需要剥离处理的判断方法。
如果是需要剥离处理的情况(S22中是NO),就进行剥离处理,生成剥离代码(S24)。之后,调查是否有依据编译程序选项【-O】或者【-Os】的指定(S25)。这里,编译程序选项【-O】,是为把程序大小及运行处理速度同平均的汇编代码输出给编译器的指示。编译程序选项【-Os】,是为把重视抑制程序大小的汇编代码输出给编译器的指示。
不需要剥离处理(S22中是YES)或者没有编译程序选项【-O】或者【-Os】的指定的情况(S25中是NO),生成内循环(最内循环)的循环次数的条件式(S23)。
有编译程序选项【-O】或者【-Os】的指定的情况(S25中是YES),把剥离的循环处理叠入双重循环,生成最内循环的循环次数的条件式(S26)。
在最内循环的循环次数条件生成处理(S23、S26)之后,调查最内循环中所参照的对象数组是否是1个(S27)。如果最内循环中所参照的对象数组是1个的情况(S27中是YES),结束循环结构转换处理(S5)。
如果最内循环中所参照的对象数组具有2个以上时(S27是NO),导出最内循环的分割个数,决定分割后的各最内循环的循环次数的比率(S28)。之后,判断分割后的最内循环次数DT除以分割个数的值是否比1大(S29)。也就是说,该值在1以下时(S29中是NO),由于分割后的各循环次数是1次以下,因此没有分割的意义。为此,结束循环结构转换处理(S5)。
如果该值比1大(S29中是YES),分割后的各循环次数是2次以上。这种情况下,调查是否有依据编译程序选项【-O】或者【-Ot】的指定(S30)。编译程序选项【-Ot】是把重视提高运行处理速度的汇编代码输出给编译器的指示。
如果有依据编译程序选项【-O】或者【-Os】的指定(S30中是YES),运行下述的重视运行处理速度的复制型内循环分割处理(S31),结束循环结构转换处理(S5)。
如果没有依据编译程序选项【-O】或者【-Os】的指定(S30中是NO),运行下述的重视抑制程序大小的条件型内循环分割处理(S32),结束循环结构转换处理(S5)。
图7是表示复制型内循环分割处理(图6的S31)的具体内容的流程图。
把最内循环的循环次数DT除以分割个数的值作为细化分割后的内循环次数(S41)。然后,只复制分割个数份的内循环,并生成内循环(S42)。之后,把细化分割后的各内循环次数修正为细化分割后的内循环次数(S43)。而且,把DT除以分割个数的剩余加在细化分割后的开头循环的循环次数上(S44),结束复制型内循环分割处理。
图8是表示条件型内循环分割处理(图6的S32)的具体内容的流程图。
把最内循环的循环次数DT除以分割个数的值设为细化分割后的内循环次数(S51)。然后,生成内循环次数条件的切换switch表(S52)。也就是说,生成用C语言表述的switch语句,以便依次交替内循环次数。另外,也可以是if语句。
表生成之后,把细化分割后的各内循环次数条件修正为细化分割后的内循环次数(S53)。之后,把DT除以分割个数的剩余加在细化分割后的开头循环的次数条件上(S54),结束条件型内循环分割处理。
图9是表示预取指令配置处理(图5的S6)的具体内容的流程图。
预取指令配置处理中,对于所有的循环反复以下处理(循环A)。首先,调查所关注的循环是否是指令***对象的循环(S61)。有关是否是指令***对象的循环的信息,根据循环结构转换部186的解析结果取得。
如果是指令***对象的循环(S61中是YES),对这个循环调查是否进行了条件型循环分割(S62)。如果进行了条件型循环分割,解析各条件语句中的指令***位置(S63),***预取指令(S64)。如果对指令***对象的循环没有进行条件型循环分割(S62中是NO),对这个循环调查是否进行了复制型循环分割(S65)。如果进行了复制型循环分割(S65中是YES),解析这个循环的前一个指令***位置(S66)。之后,***预取指令(S67)。如果是被剥离的循环的情况(S68中是YES),解析指令***位置以便在该循环前面***指令(S69),在这个位置***预取指令(S70)。
图10是表示预取指令***处理(图9的S64、S67及S70)的具体内容的流程图。
指令***处理中,直到***指令、***位置、***地址等组成的信息清单全为空为止反复以下处理(循环B)。
判断要***预取指令的数组要素是否排序完毕(S72)。如果没有排序(S72中是NO),调查是根据周期因子分割的循环还是根据大小因子分割的循环(S73)。
如果排序完毕(S72中是YES)或者是以周期因子分割的循环(S73中是YES),对1行前的数据***预取指令(S74)。没有排序,且是以大小因子分割的循环(S73中是NO),对2行前的数据***预取指令(S75)。最后,从信息清单删除解析完毕的信息(S76)。
编译程序选项
编译***148中,作为针对编译器的编译程序选项,准备了选项【-fno-loop-tiling-dpref】。如果指定了这个选项,和编译指示的指定无关,不进行针对循环的结构转换。如果没有指定本选项,结构转换的实施遵从有无编译指示的指定。
编译指示指定
本指定针对随后的循环。
由编译指示【#pragma_loop_tiling_dpref变量名[,变量名]】指定了变量时,仅着眼于编译指示指定的变量进行循环分割。指定的变量可以是数组也可以是指针。
由编译指示【#pragma_loop_tiling_dpref_all】指定了循环时,着眼于循环内参照的所有数组进行结构转换。
下面,说明几个具体曲面中的循环分割处理。另外,在后面的处理中,为了简化说明,进行依据C语言的程序记述,但实际上依据中间语言进行最佳化处理。
单循环分割
图11是用于说明不需要剥离情况下的单循环分割处理的图。
考虑输入了如图11(a)所示的源程序282的情况。这个源程序282中,依次参照数组A的要素,加在变量sum上。这里,数组A的各要素大小设为4字节,高速缓存的1个行大小设为128字节(在以后的说明中,高速缓存的行大小也设为128字节)。也就是说,高速缓存的1行上存储32个数组A的要素。又,包含于源程序282的循环的迭代次数128次,是32的整数倍。由此,源程序282,如图11(b)的程序284所示,可以结构转换为双重循环。也就是说,在最内循环中,进行32次的反复处理,在其外的循环中,进行反复4次最内循环的循环处理。在最内循环处理中,参照高速缓存1行的数据。之后,如图11(c)的程序286所示,在运行最内循环之前,***预取指令(dpref(&A[i+32])。通过***预取指令,运行最内循环时,形成了该循环中所参照的数组A的要素搭乘高速缓存的状态。
图12~图15,是说明有关不需要剥离的单循环分割处理中的中间语言推移的图。
图12,和图11(a)一样,是表示不需要剥离时的一个源程序的例图。图13是对应图12所示的源程序240的中间语言的程序。【BGNBBLK】和【ENDBBLK】之间的指令列对应1个基本程序段,始于【BGNBBLK】B1的基本程序段表示for循环之前的处理,始于【BGNBBLK】B2的基本程序段表示for循环,始于【BGNBBLK】B3的基本程序段表示for循环后的处理。
图14表示的是把图13所示的中间语言的程序结构转换为双重循环之后的中间语言的程序。始于【BGNBBLK】B2的基本程序段对应最内循环,始于【BGNBBLK】B4及【BGNBBLK】B5的循环对应外循环。
图15表示的是对图14所示的中间语言程序***预取指令之后的中间语言的程序。程序270中,在始于【BGNBBLK】B4的基本程序段的内部重新***了预取指令(dpref)。
图16是用来说明需要剥离时的单循环分割处理的图。
考虑输入了图16(a)所示的源程序292的情况。在这个源程序292中,依次参照数组A的要素,加在变量sum上。这里,数组A的各要素大小设为4字节。也就是说,高速缓存的1行上存储了32个数组A的要素。而且,包含于源程序292的循环迭代次数设为140次。也就是说,是除以1行存储的数组A的要素数32时所得到的余数。
这种情况下,如图16(b)所示的程序294,剥离140除以32的余数的循环次数,其它部分和图11(b)一样结构转换为双重循环结构。之后,进行为了把被剥离的部分包含于双重循环结构的剥离叠入处理,可以得到图16(c)所示的程序296。也就是说,通常状态下,在最内循环进行32次的反复处理,最后运行最内循环时,进行残余的12(=140-128)次反复处理。之后,如图16(d)的程序298所示,在运行最内循环之前,***预取指令(dpref(&A[i+32]))。
存在多个数组存取的情况(不需要剥离)
图17是用于说明循环内存在多个数组存取的情况下的循环分割处理的图。
考虑输入了如图17(a)所示的源程序301的情况。这个源程序301中,依次参照数组A及数组B的要素,相应要素之间的乘积加在变量sum上。这里,数组A及数组B的各要素分别设为4字节。也就是说,高速缓存的1行上存储32个数组A的要素。或者,存储32个数组B的要素。也就是说,1行所存储的要素数,在数组A和数组B是一样的。而且,源程序301所包含的循环的迭代次数128次是32的整数倍。由此,源程序301,如图17(b)的程序302所示,不需要剥离就可以结构转换为双重循环。
存在多个数组存取情况下的双重循环结构有两种,一种是称作复制型的提高运行处理速度的最佳化结构,另一种是称作条件型的减小程序大小的最佳化结构。
首先,说明复制型的最佳化结构。用数组A和数组B之间的要素大小比分割程序302中包含的最内循环的循环次数。这里,数组A和数组B要素的大小相同。因此,如图17(c)所示的程序303,把最内循环分为2等分,分割为2个循环次数是16次的最内循环。其次,如图17(d)的程序304所示,在各最内循环的前面***预取指令。在开头的最内循环前面,***预取指令(dpref(&A[i+32]))用来预取1行的数组A的要素,在第2个最内循环的前面,***预取指令(dpref(&B[i+32]))用来预取1行的数组B的要素。
这样,在预取指令之间***循环处理,由此对不同数组的预取指令不会连续,可以隐蔽运行预取指令引起的等待时间。由此,可以提高运行处理速度。
下面,说明条件型的最佳化结构。条件型的情况也与复制型的情况一样,以数组A和数组B之间的要素大小比来分割最内循环的循环次数。只是,不是如程序303那样排列2个最内循环,而是如图17(e)所示的程序305,最内循环的个数是1个,把这个循环次数作为条件分支。也就是说,以变量K=1的情况和K=0的情况改变最内循环的循环次数N。只是,这个例子中,和变量K的值无关,最内循环的次数是16次。然后,如图17(f)所示的程序306,***条件分支式及预取指令以便在K=1的情况下预取1行的数组A的要素,K=0的情况下则预取1行的数组B的要素。另外,这里由于最佳化,循环次数N立即置换为16。
这样,最内循环的个数为1个,由条件分支式改变最内循环的循环次数及预取指令,由此可以减小最终生成的机器语言指令的程序大小。只是,由于有条件分支处理,和复制型比起来处理速度多少会迟缓一些。
存在多个数组存取的情况(需要剥离)
图18是用于说明循环内存在多个数组存取的情况下的循环分割处理的图。
考虑输入了图18(a)所示的源程序311的情况。这个源程序311中,依次参照数组A及数组B,相应要素之间的乘积加在变量sum上。这里,设数组A及数组B的各要素分别为4字节。也就是说,高速缓存的1行上存储32个数组A的要素。或者存储32个数组B的要素。也就是说,1行所存储的要素数,在数组A和数组B是一样的。而且,设源程序311中包含的循环的迭代次数是140次。
因此,把源程序311结构转换为双重循环时,和图16(b)所示的程序294一样,生成图18(b)所示的剥离处理了的程序312。
进行复制型的最佳化时,以数组A和数组B之间的要素大小比分割最内循环。这样,生成图18(c)所示的程序313。然后,如图18(d)的程序314所示,在开头的最内循环前面,***预取指令(dpref(&A[i+32]))用来预取1行的数组A的要素,在第2个最内循环的前面,***预取指令(dpref(&B[i+32]))用来预取1行的数组B的要素。另外,在剥离处理了的最终循环前面不***预取指令。这是因为,由于运行其前面的双重循环处理中的预取指令,所希望的数据被高速缓存预取。
在进行条件型的最佳化时,对程序312进行剥离叠入处理,得到图18(e)所示的程序315。剥离叠入处理和参照图16进行说明的一样。然后,以数组A和数组B之间的要素大小比分割最内循环的循环次数,制作图18(f)所示的程序316以便可以条件分支该循环次数。在程序316中,交替变更变量K的值,改变循环计数N的值以便对应变量K的值。然后如图18(g)的程序317所示,随着K值的变化,在条件分支式中***预取指令以便交互预取每1行的数组A及数组B的要素。
这样,即使是需要剥离的情况,在复制型的情况,把剥离部分设为区分于双重循环的循环,条件型的情况,由条件分支式改变剥离情况下的循环计数次数,由此即使在循环内有多个数组存取,且需要剥离的情况,也可以进行考虑了预取引起的等待时间的最佳化。
存在大小不同的多个数组存取的情况(不需要剥离)
图19是说明当循环内存在多个数组存取且数组要素大小完全不同情况下的循环分割处理的图。
考虑输入图19(a)所示的源程序321的情况。这里,设数组A的要素是4字节,数组B的要素是2字节。也就是说,高速缓存的1行上存储了32个数组A的要素,存储了64个数组B的要素。
这种情况下,关注要素大小小的数组B,进行对应数组B的要素的循环结构转换。也就是说,如图19(b)的程序322所示,把最内循环的循环次数设为1行收纳的数组B的要素数64,结构转换为双重循环。在最内循环中,对于数组B消耗了1行的要素,对于数组A消耗了2行的要素。由此,为了运行最内循环处理就需要3行的数据。
为此,进行复制型的最佳化之际,如图19(c)的程序323所示,把最内循环分割为3个,如图19(d)的程序324所示,在各最内循环前面***预取指令。这里,在第1个最内循环前面,***预取2行前的数组A的要素的预取指令(dpref(&A[i+64])),在第2个最内循环前面***预取3行前的数组A的要素的预取指令(dpref(&A[i+96])),在第3个最内循环的前面***预取1行前的数组B的要素的预取指令(dpref(&B[i+64]))。而且,3个最内循环的循环次数按照处理顺序分别设为22、21及21。这是因为,最外循环的条件分支判断在运行第3个最内循环后进行,所以由减少第3个最内循环的循环次数,来提高整体的处理速度。
而且,进行条件型的最佳化时,如图19(e)的程序325所示,1次最内循环处理中,在0到2之间的范围内更新变量K的值,根据依据变量K值的条件分支处理,把最内循环的循环次数N设为22、21及21中的任一值。之后,运行循环次数N的最内循环。然后,如图19(f)的程序326所示,进行最佳化,当变量K的值是0时运行预取指令(dpref(&A[i+64])),当变量K的值是1时运行预取指令(dpref(&A[i+96])),当变量K的值是2时运行预取指令(dpref(&B[i+64]))的。
存在大小不同的多个数组存取的情况(需要剥离)
图20是说明当循环内存在多个数组存取且数组要素大小完全不同的情况下的循环分割处理的图。
如图20(a)所示的源程序331,和图19(a)所示的源程序321相比仅仅是循环次数不同。因此,和源程序321一样,数组A的要素是4字节,数组B的要素是2字节。如图20(b)所示,把源程序321的循环结构转换为双重循环,对循环次数140除以数组B的1行的要素数64的剩余进行剥离处理,就可以得到程序322。进行复制型的最佳化处理时,如参照图19(c)及图19(d)所说明的那样,把双重循环的最内循环分割为3个,并***预取指令,由此得到图20(c)所示的程序333。进行条件型的最佳化处理时,如参照图19(e)及图19(f)所说明的那样,由条件分支式控制循环次数及预取指令,最终得到如图20(e)所示的程序335。
存在跨距不同的多个数组存取的情况
图21是说明循环内存在跨距不同的多个数组存取的情况下的循环分割处理的图。
跨距指的是循环处理中的数组要素的增量值(存取幅度)。考虑输入了图21(a)所示的源程序341的情况。这里,设数组A的要素及数组B的要素都是4字节。在源程序341中,循环的每次迭代中,数组A的要素增加1个,而数组B的要素增加2个。也就是说,数组B的存取幅度是数组A的存取幅度的2倍。如果着眼于最小存取幅度的数组A,1行收纳32个数组A的要素。由此,如果向最内循环的循环次数设为32次的双重循环进行结构转换,就可以得到图21(b)所示的程序342。在最内循环中,数组A消耗1行的要素,数组B就消耗2行程度的要素。由此,为了运行最内循环处理,就需要合计3行的数据。
因此,进行复制型的最佳化时,如图21(c)的程序343所示,把最内循环分割为3个,如图21(d)的程序344所示,在各最内循环前面***预取指令。这里,在第1个最内循环前面,***预取1行前的数组A的要素的预取指令(dpref(&A[i+32])),在第2个最内循环前面***预取2行前的数组B的要素的预取指令(dpref(&B[i*2+64])),在第3个最内循环的前面***预取3行前的数组B的要素的预取指令(dpref(&B[i*2+96]))。
又,进行条件型的最佳化时,如图21(e)的程序345所示,1次的最内循环处理中,在0到2之间的范围内更新变量K的值,根据依据变量K值的条件分支处理,把最内循环的循环次数N设为11、11及10中的任一值。之后,运行循环次数N的最内循环。然后,如图21(f)的程序346所示,进行最佳化,当变量K的值是0时运行预取指令(dpref(&A[i+32])),当变量K的值是1时运行预取指令(dpref(&B[i*2+64])),当变量K的值是2时运行预取指令(dpref(&B[i*2+96]))。
循环次数不定的情况
图22是说明循环次数不定的循环处理的循环分割处理的图。
考虑输入了图22(a)所示的源程序351的情况。包含于源程序351的循环次数,由变量Val确定,编译时不确定。但是,进行最低128次反复处理通过编译指示指定【#pragma_min_iteration=128】来保证。这里,设数组A为4字节。也就是说,高速缓存的1行上存储32个数组A的要素。
根据编译指示指定,把循环分割为开始的128次的循环处理和其后的由变量Val确定的循环次数的循环处理,和单循环的情况一样把他们分别进行双重循环化,就可以得到图22(b)所示的程序352。
进行复制型的最佳化处理时,在程序352的最内循环的前面***预取指令(dpref(&A[i+32]))用来预取1行前的数组A的要素,由此得到图22(c)所示的程序353。
进行条件型的最佳化处理时,对后半部分的循环处理叠入剥离,最外循环次数达到128次之前,最内循环的次数设为32次,其后***最内循环的次数设定为(Val-128)次的分支指令。这样,可以得到图22(d)所示的程序354。
最后,在运行最内循环之前,***预取指令(dpref(&A[i+32])),由此得到图22(e)所示的程序355。
图23是说明循环次数不定的循环处理的循环分割处理的图。
考虑输入了图23(a)所示的源程序361的情况。包含于源程序361的循环次数由变量N确定,在编译时不定。而且,源程序361和源程序351不同,没有表示最低循环次数的编译指示指定。
对循环次数小的循环处理进行循环的结构转换,即使进行了最佳化也难以显现最佳化的效果。由此,这种情况下,为了提高最佳化的效果,如果循环次数大于某临界值运行被最佳化了的循环处理,其它的情况运行通常的循环处理。例如,某临界值设定为1024的情况,如图23(b)的程序362所示,循环次数N如果超过了1024时,对开始的1024次的循环处理运行双重循环,对于剩余次数的循环处理进行剥离了的循环处理。又,循环次数N在1024以下时,不运行双重循环,运行被剥离的循环处理。之后,在双重循环的最内循环前面***预取指令(dpref(&A[i+32])),由此生成如图23(c)所示的最佳化的程序363。
不需要循环分割的情况
图24是说明不需要循环分割情况下的最佳化处理的图。如果输入了图24(a)所示的源程序371时,在循环中完全用完1行的数据(A[i]~A[i+31])。这种情况下,没有必要进行双重循环化。为此,如图24(b)所示的程序372,在循环的开头***预取指令(dpref(&A[i+32]))用来预取循环内使用的数据的1行前的数据,由此进行最佳化。
而且,循环内的处理周期数比预取指令中需要的处理周期数还要大时,没有必要对循环进行双重化,即使在循环的开头***预取指令也可以隐蔽预取指令的等待时间。
循环内存取的要素不排序的情况
图25及图26是说明循环内存取的要素在主存储器上没有适当排序情况下的循环分割处理的图。到此为止的说明中,都是在假设循环内存取的要素在主存储器上适当排序的情况下进行的。排序的情况事先被编译指示和编译程序选项的指定所明确时,进行如上述例子中说明的最佳化。
但是,一般的编译器,这些要素是否排序在运行之前是不明确的。为此,编译器要以循环内存取要素在主存储器上没有适当排序为前提进行最佳化。
也就是说,出现了图25(a)所示的源程序381时,如果设数组A的要素大小为4字节,则和参照图11进行说明的单循环分割一样,进行最佳化。只是,由于以要素没有排序为前提,所以***最内循环前面的预取指令(dpref(&A[i+64]))预取指定2行前的数组A的要素。而且,在循环处理之前,为了确保在循环内存取的数组要素A[0]~A[63],预取指令(dpref(&A[0])及dpref(&A[32]))被***到预取的等待时间可以十分隐蔽的位置,生成图25(b)所示的程序382。
而且,出现图26(a)所示的源程序391时,和图16一样,叠入循环被剥离处理的部分之后,***预取2行前的数组A的要素的预取指令(dpref(&A[i+64]))。而且,和程序382一样***预取指令(dpref(&A[0])及dpref(&A[32])),生成如图26(b)所示的最佳化程序392。
***动态排序解析代码的结构转换分割
图27是说明动态确定没有排序的数组要素,进行循环处理的最佳化的图。考虑输入了图27(a)所示的源程序401的情况。这里设数组A的要素为4字节。
数组A的开头地址(要素A[0]的地址)指定的比特表示高速缓存的行,存在于这个比特内的比特,表示行开头开始的偏移量。因此,由进行称作【A&Mask】比特之间的逻辑运算,可以取出行开头开始的偏移量。这里,屏蔽值Mask是事先给定的值。从数组A的开头地址取出的偏移值向右只移位事先给定的补正值Cor,由此可以知道数组A的开头要素A[0]位于1行内从头开始的第几个。因此,根据式(3),可以求出行上没有排序的要素数n。
n=32-(A&Mask)>>Cor…(3)
也就是说,如图28所示,预取高速缓存431时,可以区分没有排序的数组A的要素(A[0]~A[n-1])和排序的数组A的要素。
因此,如图27(b)的程序402所示,根据式(3)求出没有排序的数组A的要素数n。然后,根据要素数n,进行与没有排序的数组A的要素(A[0]~A[n-1])有关的循环处理。之后,对于排序的数组A的要素(A[n]以后的要素),和图11所示的单循环分割情况同样进行双重循环化。
之后,对于正在剥离的循环405,如果进行叠入处理,就可以生成图27(c)所示的程序403。又,如图27(d)所示,***预取指令(dpref(&A[i+32])),由此可以得到最佳化的程序404。
使用剖面信息的结构转换分割
图29是关于使用剖面信息确定没有排序的数组要素,而后进行循环处理的最佳化的处理进行说明的图。对于没有排序的数组要素数,不是如图27那样从计算中求得,而是从剖面信息中求出。根据取得的没有排序的数组要素数N,进行如图27所示的同样的处理,把图29(a)所示的源程序411转换为图29(b)所示的程序412。之后,叠入剥离的循环部分,得到图29(c)所示的程序413。最后,***图29(d)所示的预取指令,由此得到最佳化的程序414。
对最内循环以外的循环的结构转换
图30是说明对最内循环以外的循环结构转换的图。
考虑给予了图30(a)所示的源程序421的情况。源程序421中进行双重循环处理,设最内循环处理424中所参照的数组A的要素为1字节。由于最内循环处理424的循环次数是4次,因此在最内循环处理424中数组A的要素被参照了4字节。所以,由于最内循环处理424中参照的要素字节数小,因此这种情况下,把最内循环处理424作为1个整体考虑,最外循环如图30(b)所示的程序422那样,结构转换为双重循环。之后,运行第2个循环处理之前,***预取高速缓存的1行份的数组A的要素的指令(dpref(&A[j+128])),得到图30(c)所示的最佳化程序423。
依据编译指示【#pragma_loop_tiling_dpref变量名[,变量名]】的变量指定
图31是说明由编译指示【#pragma_loop_tiling_dpref变量名[,变量名]】指定了变量情况下的最佳化处理的图。如图31(a)所示,编译指示的指定【#pragma_loop_tiling_dpref b】包含于源程序中时,只是着眼于循环内的数组b进行结构转换,忽略数组a。因此,运行图31(b)所示的双重循环化,只***预取数组b的指令。
如上说明,依据本实施例的编译***,双重化循环处理,并在最内循环的外侧运行预取指令。由此,可以防止发出无用的预取指令,并且可以提高程序运行时的处理速度。而且,由于双重化循环处理,可以保证从运行预取指令之后到运行下一个预取指令之前的周期数。由此,可以隐蔽等待时间,防止互锁。
以上,对有关本发明实施例的编译***,基于实施例进行了说明,但本发明不限于这个实施例。
例如,由指令最佳配置部187配置的指令,不限于预取指令,也可以是以下指令:通常的存储器存取指令、启动外部处理并等待其处理结果的指令等等待应答指令、运行的结果有可能引起互锁的指令、运行后在可以参照指定的资源之前需要多个周期的指令等。应答等待指令,除了经常等待应答的指令外,还包含具有等待应答情况和不等待应答情况的指令。
另外,也可以是把不具备高速缓存的计算机的CPU作为目标处理器,隐蔽各种处理的等待时间,输出防止互锁的代码的编译***。
还有,可以在逐条解释由CPU运行的机器语言指令串的同时,实现作为运行本实施例中说明的循环结构转换等处理的OS(OperatingSystem)。
又,如以下所示的PreTouch指令,对于没有可能引起互锁的指令,本发明也可以适用。PreTouch指令指的是,进行在高速缓存上只事先保证用来存储自变量指定的变量的区域的处理的指令。以下,对进行循环的结构转换、***PreTouch指令的处理进行说明。
单循环分割
图32是,在***PreTouch指令时,对象区域与高速缓存大小排序,对不需要剥离的情况下的单循环分割处理进行说明的图。
考虑输入了图32(a)所示的源程序502的情况。在这个源程序502中,定义了把循环次数i和变量val之间的运算结果(乘积结果)依次代入到数组A的要素的处理。这里,设数组A的各要素大小为4字节,设高速缓存的1行大小是128字节(在以后的说明中,高速缓存的行大小也设为128字节)。也就是说,高速缓存的1行上存储32个数组A的要素。又,包含于源程序502的循环迭代次数128次是32的整数倍。
为此,源程序502,如图32(b)的程序504所示,可以结构转换为双重循环。也就是说,在最内循环中进行32次反复处理,在其外的循环中,进行反复4次最内循环的循环处理。在最内循环处理中,高速缓存的1行的数据被代入数组A。之后,如图32(c)的程序506所示,在运行最内循环之前,***高速缓存区域保证指令(PreTouch(&A[i]))。由于***PreTouch指令,在运行最内循环时,在高速缓存区域中保证了该循环中定义的数组A的要素。由此,不会引起来自主存储器的不需要的数据传输,可以减轻总线占有率。
图33是说明***PreTouch指令时的不需要剥离情况下的单循环分割处理的图。
考虑输入了图33(a)所示的源程序512的情况。在这个源程序512中,定义了把循环次数i和变量val之间的运算结果(乘积结果)依次代入数组A的要素的处理。这里,设数组A的各要素大小为4字节,且排序于高速缓存大小。也就是说,高速缓存的1行上存储32个数组A的要素。又,设包含于源程序512的循环迭代次数是140次。也就是说是,除以1行上所存储的数组A的要素数32时剩余的数。
这种情况下,如图33(b)所示的程序514,剥离140除以32时的剩余数的循环次数,其外部分和图32b同样,结构转换为双重循环。之后,进行为了把剥离的部分包含于双重循环结构中的剥离叠入处理,得到如图33(c)所示的程序516。也就是说,通常状态下,在最内循环进行32次的反复处理,在最后运行最内循环时,进行剩余的12(=140-128)次的反复处理。之后,如图33(d)的程序518所示,在运行最内循环之前,***高速缓存保证指令(PreTouch(&A[i]))。只是,区域保证处理,以1行单位进行。由此,在运行可以保证目标对象A以外的区域的最后的最内循环时,使其不发出PreTouch指令,使其不保证目标对象A以外的区域。
***动态排序解析代码的结构转换分割
图34是说明动态确定没有排序的数组要素,进行循环处理的最佳化处理的图。考虑输入了图34(a)所示的源程序522的情况。这里,设数组A的要素为4字节。
数组A的开头地址(要素A[0])指定的比特表示高速缓存的行,存在于这个比特内的比特,表示行开头开始的偏移量。因此,通过进行称为【A&Mask】的比特之间的逻辑演算,可以取出从行开头开始的偏移量。这里,屏蔽值Mask是事先给定的值。这里,设[Mask=0x7F]。把从循环初次存取的数组A的要素地址中取出的偏移值,从屏蔽值Mask中减掉,仅向右挪动事先给定的补正值Cor,由此可以知道数组A的要素A[X]位于1行从头开始的第几个。因此,根据式(4),可以求出在行上没有排序的要素数PRLG。
PRLG=(Mask-(&A[X])&Mask)>>Cor…(4)
而且,根据式(5)可以求出在循环最后参照的数组A的要素(A[Y-1])的下一个要素A[Y])位于1行内从开头开始的第几个,由此,可以求出没有完全满足1行的要素数EPLG。
EPLG=(&A[Y])&Mask)>>Cor …(5)
而且,可以根据式(6)求出进行没有剩余的1行的处理的循环次数KRNL。
KNRL=(Y-X)-(PRLG+EPLG) …(6)
也就是说,如图34(b)的程序524所示,当高速缓存的区域分配有数组A时,也就区分了没有排序的数组A的要素(A[X])~A[X+PRLG-1])、排序且是1行的倍数大小的数组A的要素(A[X+PRLG]~A[X+PRLG+KRNL-1])、排序但不满足1行大小的数组A的要素(A[X+PRLG+KRNL]~A[X+PRLG+KRNL+ERLG-1])。
因此,如图34(b)的程序524所示,进行依据式(4)求出没有排序的数组A的要素数PRLG的处理等。然后,根据要素数PRLG,对没有排序的数组A的要素(A[X])~A[X+PRLG-1])进行循环处理。之后,对排序的数组A的要素(A[X+PRLG]~A[X+PRLG+KRNL-1]的要素),与图32b所示的单循环分割情况同样,进行双重循环化。而且,如果EPLG>0,由于需要剥离处理,因此与图33b所示的需要剥离时的情况一样,进行剥离处理。
之后,对剥离的循环,如果进行叠入处理,就生成了图34(c)所示的程序526。而且,如图34(d)所示,***高速缓存区域保证指令(PreTouch(&A[i])),由此,可以得到程序528。
只是,***区域保证指令,仅仅针对排序的区域且使用高速缓存的整个1行的最内循环。
产业上利用的可能性
本发明适用于控制发出有可能引起互锁的指令的编译器、OS、处理器中运行的处理等。
Claims (25)
1.一种面向处理器的程序转换装置,该处理器具备包含运行时等待来自外部的指定应答的指令的指令***,其特征在于,具备:
进行双重循环转换的循环结构转换装置,其中双重循环转换是把包含于输入程序中的反复次数是x次的循环转换为:将反复次数是y次的循环作为内循环且将反复次数是x/y次的循环作为外循环的嵌套结构;
指令配置装置,在上述内循环的外部位置配置上述指令,由此转换为包含该指令的输出程序。
2.根据权利要求1所述的程序转换装置,其特征在于,上述循环结构转换装置具备:
检测包含于上述输入程序中的循环的循环检测部;
检测上述循环的反复次数的反复次数检测部;
检测应答等待周期数的应答等待周期数检测部,其中应答等待周期数是等待上述指令运行时的上述指定的应答的周期数;
检测上述循环的1次反复处理所需要的1个序列周期数的1序列周期数检测部;
把上述循环分割为反复次数是“上述应答等待周期数/上述1序列周期数”次的循环的循环分割部;
进行双重循环转换的双重循环转换部,该双重循环转换是将反复次数是“上述应答等待周期数/上述1序列周期数”次的循环作为内循环且将反复次数是(上述循环反复次数/上述内循环的反复次数)次的循环作为外循环的嵌套结构的转换。
3.根据权利要求1所述的程序转换装置,其特征在于,还具备接收与最佳化有关的最佳化指示信息的最佳化指定信息接收装置。
4.根据权利要求3所述的程序转换装置,其特征在于,
上述最佳化指定信息接收装置接收包含于上述输入程序的循环的最低反复次数,
上述循环结构转换装置,当循环的运行次数不定时,根据上述最低反复次数,由上述循环取出上述最低反复次数的反复处理,对取出的循环的反复处理进行双重循环转换。
5.根据权利要求1所述的程序转换装置,其特征在于,
上述指令是有可能发生互锁的指令。
6.根据权利要求5所述的程序转换装置,其特征在于,
上述有可能发生互锁的指令是从主存储器向高速缓存预取数据的指令。
7.根据权利要求6所述的程序转换装置,其特征在于,
还具备进行指令编排的编排装置,
上述循环结构转换装置根据上述编排装置得到的结果,把上述反复次数是x次的循环分割为反复次数是y次的循环,使得该运行的周期数是运行上述预取所需要的周期数,并进行将反复次数是y次的循环作为内循环且将反复次数是x/y次的循环作为外循环的嵌套结构的转换即双重循环转换。
8.根据权利要求1所述的程序转换装置,其特征在于,
上述指令是在运行后到指定资源成为可以参照的状态为止需要多个周期的指令。
9.根据权利要求8所述的程序转换装置,其特征在于,
上述需要多个的指令,是访问主存储器或者高速缓存的指令。
10.根据权利要求1所述的程序转换装置,其特征在于,
上述循环结构转换装置把上述反复次数是x次的循环分割为反复次数是y次的循环,使得该循环中所参照的数组的地址仅运行高速缓存的行大小前进量,并进行将反复次数是y次的循环作为内循环,将反复次数是x/y次的循环作为外循环的双重循环转换。
11.根据权利要求10所述的程序转换装置,其特征在于,
上述循环结构转换装置进行比例分配转换,即当上述数组存在多个时,对进行了双重循环转换的上述反复次数是y次的循环,根据上述数组数进一步进行比例分配。
12.根据权利要求11所述的程序转换装置,其特征在于,
上述比例分配转换,对于多个上述数组,当这些数组要素的大小不同时,对应上述大小的比,比例分配上述反复次数是y次的循环。
13.根据权利要求11所述的程序转换装置,其特征在于,
上述比例分配转换,对于多个上述数组,当循环的反复处理进行1次所前进的地址跨距不同时,对应上述跨距的比,比例分配上述反复次数是y次的循环。
14.根据权利要求11所述的程序转换装置,其特征在于,
上述比例分配转换,进行比例分配转换,以便在转换内循环之际,生成对应分配的各循环的条件语句,使分配的各循环在同一个内循环中运行。
15.根据权利要求10所述的程序转换装置,其特征在于,
上述循环结构转换装置,在把上述反复次数是x次的循环分割为上述反复次数是y次的循环时,如果运算x/y时的余数z不是0,就对z次的反复处理进行剥离处理,并进行双重循环转换。
16.根据权利要求15所述的程序转换装置,其特征在于,
上述循环结构转换装置,如果上述余数z不是0,生成判断内循环的循环次数是y次还是z次的判断条件语句,并进行双重循环转换。
17.根据权利要求10所述的程序转换装置,其特征在于,
上述循环结构转换装置,当循环的运行次数不定时,运行时判断上述循环的运行次数,根据判断结果进行动态改变反复次数的双重循环转换,。
18.根据权利要求10所述的程序转换装置,其特征在于,
还具备接收数组排序为高速缓存的行大小的信息的接收装置,
上述指令配置装置,对上述反复次数是x次的循环配置预取指令,预取该循环中x次的反复处理所参照的数据的前一个高速缓存的行上所存储的数据。
19.根据权利要求10所述的程序转换装置,其特征在于,
上述最佳化指定信息接收装置,接收数组从高速缓存的行的哪个相对位置开始存取的信息,
上述循环结构转换装置,根据该信息进行上述的双重循环转换。
20.根据权利要求10所述的程序转换装置,其特征在于,
上述指令配置装置,当上述数组没有按高速缓存的行大小排序时,对上述反复次数是x次的循环配置预取指令,预取该循环中的x次的反复处理所参照的数据的二个前的高速缓存的行上所存储的数据。
21.根据权利要求10所述的程序转换装置,其特征在于,
上述循环结构转换装置,当上述数组没有排序为高速缓存的行大小时,判断数组从高速缓存的行的哪个相对位置开始存取,并根据判别结果进行双重循环结构转换。
22.根据权利要求10所述的程序转换装置,其特征在于,
还具备接收有关关注的数组的信息的接收装置,
上述循环结构转换装置,只对该数组进行关注,进行双重循环转换。
23.根据权利要求1所述的程序转换装置,其特征在于,
上述循环结构转换装置,把最内循环作为1个块,对外循环进一步进行双重循环转换。
24.一种面向处理器的程序转换方法,该处理器具备包含运行时等待来自外部的指定应答的指令的指令***,其特征在于,具备:
进行双重循环转换的步骤,把包含于输入程序中的反复次数是x次的循环转换为:将反复次数是y次的循环作为内循环且将反复次数是x/y次的循环作为外循环的嵌套结构;
在上述内循环的外部位置配置上述指令,并转换为包含该指令的输出程序的步骤。
25.一种面向处理器的程序转换方法的程序,该处理器具备包含运行时等待来自外部的指定应答的指令的指令***,其特征在于,使计算机运行如下步骤:
进行双重循环转换的步骤,把包含于输入程序中的反复次数是x次的循环转换为:反复次数是y次的循环作为内循环,反复次数是x/y次的循环作为外循环的嵌套结构;
在上述内循环的外部位置配置上述指令,并转换为包含该指令的输出程序的步骤。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2004035430 | 2004-02-12 | ||
JP035430/2004 | 2004-02-12 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1918546A true CN1918546A (zh) | 2007-02-21 |
CN100409187C CN100409187C (zh) | 2008-08-06 |
Family
ID=34857682
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2005800046856A Expired - Fee Related CN100409187C (zh) | 2004-02-12 | 2005-02-04 | 程序转换装置及程序转换方法 |
Country Status (4)
Country | Link |
---|---|
US (1) | US20060248520A1 (zh) |
JP (1) | JPWO2005078579A1 (zh) |
CN (1) | CN100409187C (zh) |
WO (1) | WO2005078579A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109086049A (zh) * | 2018-07-25 | 2018-12-25 | 北京金和网络股份有限公司 | 遍历用户在线状态数据的方法 |
Families Citing this family (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7774764B2 (en) * | 2005-12-21 | 2010-08-10 | Intel Corporation | Method and system for efficient range and stride checking |
US8443351B2 (en) * | 2006-02-23 | 2013-05-14 | Microsoft Corporation | Parallel loops in a workflow |
US7797692B1 (en) * | 2006-05-12 | 2010-09-14 | Google Inc. | Estimating a dominant resource used by a computer program |
JP5076616B2 (ja) * | 2007-04-24 | 2012-11-21 | 富士通株式会社 | プロセッサ及びプリフェッチ制御方法 |
JP5428476B2 (ja) * | 2009-04-02 | 2014-02-26 | 富士通株式会社 | プリフェッチ生成プログラムおよびコンパイラ装置 |
JP5148674B2 (ja) * | 2010-09-27 | 2013-02-20 | 株式会社東芝 | プログラム並列化装置およびプログラム |
US9250879B2 (en) * | 2012-07-02 | 2016-02-02 | International Business Machines Corporation | Strength reduction compiler optimizations |
JP5808495B2 (ja) * | 2012-08-22 | 2015-11-10 | 三菱電機株式会社 | キャッシュメモリコントローラ及びキャッシュメモリコントロール方法 |
US9760356B2 (en) * | 2014-09-23 | 2017-09-12 | Intel Corporation | Loop nest parallelization without loop linearization |
US9489181B2 (en) * | 2014-10-09 | 2016-11-08 | National Instruments Corporation | Correlation analysis of program structures |
US9772824B2 (en) * | 2015-03-25 | 2017-09-26 | International Business Machines Corporation | Program structure-based blocking |
JP6665720B2 (ja) * | 2016-07-14 | 2020-03-13 | 富士通株式会社 | 情報処理装置、コンパイルプログラム、コンパイル方法、およびキャッシュ制御方法 |
US11614941B2 (en) * | 2018-03-30 | 2023-03-28 | Qualcomm Incorporated | System and method for decoupling operations to accelerate processing of loop structures |
US11614889B2 (en) * | 2018-11-29 | 2023-03-28 | Advanced Micro Devices, Inc. | Aggregating commands in a stream based on cache line addresses |
WO2020172788A1 (en) * | 2019-02-26 | 2020-09-03 | Intel Corporation | Workload oriented constant propagation for compiler |
JP2022107377A (ja) * | 2021-01-08 | 2022-07-21 | 富士通株式会社 | 情報処理装置、コンパイル方法、及びコンパイルプログラム |
Family Cites Families (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0594470A (ja) * | 1991-09-30 | 1993-04-16 | Nec Corp | ベクトル化方式 |
JP2677482B2 (ja) * | 1992-03-18 | 1997-11-17 | 富士通株式会社 | 計算機言語処理方法 |
JPH07306790A (ja) * | 1994-05-16 | 1995-11-21 | Hitachi Ltd | ループ最適化方式 |
US5704053A (en) * | 1995-05-18 | 1997-12-30 | Hewlett-Packard Company | Efficient explicit data prefetching analysis and code generation in a low-level optimizer for inserting prefetch instructions into loops of applications |
JP3218932B2 (ja) * | 1995-07-06 | 2001-10-15 | 株式会社日立製作所 | データプリフェッチコード生成方法 |
US5805863A (en) * | 1995-12-27 | 1998-09-08 | Intel Corporation | Memory pattern analysis tool for use in optimizing computer program code |
US5854934A (en) * | 1996-08-23 | 1998-12-29 | Hewlett-Packard Company | Optimizing compiler having data cache prefetch spreading |
TW343318B (en) * | 1996-09-23 | 1998-10-21 | Advanced Risc Mach Ltd | Register addressing in a data processing apparatus |
US5819074A (en) * | 1996-12-05 | 1998-10-06 | Hewlett-Packard Co. | Method of eliminating unnecessary code generation in a circuit compiler |
JPH10283192A (ja) * | 1997-04-09 | 1998-10-23 | Hitachi Ltd | プリフェッチコード生成方式 |
JP3546341B2 (ja) * | 1997-04-17 | 2004-07-28 | 株式会社日立製作所 | 多重ループ向けデータプリフェッチ方法およびプログラム生成方法 |
US6038398A (en) * | 1997-05-29 | 2000-03-14 | Hewlett-Packard Co. | Method and apparatus for improving performance of a program using a loop interchange, loop distribution, loop interchange sequence |
US6059841A (en) * | 1997-06-19 | 2000-05-09 | Hewlett Packard Company | Updating data dependencies for loop strip mining |
US6070011A (en) * | 1997-10-21 | 2000-05-30 | Hewlett-Packard Co. | Compiler for performing a loop fusion, dependent upon loop peeling and/or loop reversal |
JPH11134199A (ja) * | 1997-10-30 | 1999-05-21 | Hitachi Ltd | プリフェッチコード生成方式 |
JPH11259437A (ja) * | 1998-03-12 | 1999-09-24 | Hitachi Ltd | 不要バリア命令の削減方式 |
JP3551353B2 (ja) * | 1998-10-02 | 2004-08-04 | 株式会社日立製作所 | データ再配置方法 |
JP2000207224A (ja) * | 1999-01-14 | 2000-07-28 | Hitachi Ltd | ソフトウェアプリフェッチ方法 |
JP2001290657A (ja) * | 2000-04-07 | 2001-10-19 | Hitachi Ltd | ソフトウェアプリフェッチ方法 |
US7107583B2 (en) * | 2001-02-16 | 2006-09-12 | Hewlett-Packard Development Company, L.P. | Method and apparatus for reducing cache thrashing |
US7222337B2 (en) * | 2001-05-31 | 2007-05-22 | Sun Microsystems, Inc. | System and method for range check elimination via iteration splitting in a dynamic compiler |
JP3847672B2 (ja) * | 2002-07-03 | 2006-11-22 | 松下電器産業株式会社 | コンパイラ装置及びコンパイル方法 |
-
2005
- 2005-02-04 JP JP2005517928A patent/JPWO2005078579A1/ja active Pending
- 2005-02-04 CN CNB2005800046856A patent/CN100409187C/zh not_active Expired - Fee Related
- 2005-02-04 US US10/565,530 patent/US20060248520A1/en not_active Abandoned
- 2005-02-04 WO PCT/JP2005/001670 patent/WO2005078579A1/ja active Application Filing
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109086049A (zh) * | 2018-07-25 | 2018-12-25 | 北京金和网络股份有限公司 | 遍历用户在线状态数据的方法 |
CN109086049B (zh) * | 2018-07-25 | 2021-11-02 | 北京金和网络股份有限公司 | 遍历用户在线状态数据的方法 |
Also Published As
Publication number | Publication date |
---|---|
US20060248520A1 (en) | 2006-11-02 |
CN100409187C (zh) | 2008-08-06 |
WO2005078579A1 (ja) | 2005-08-25 |
JPWO2005078579A1 (ja) | 2007-10-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1918546A (zh) | 程序转换装置及程序转换方法 | |
CN1101019C (zh) | 数据序列产生方法及设备、转换方法及计算机 | |
CN1284095C (zh) | 多处理器***中的任务分配方法和多处理器*** | |
CN1264089C (zh) | 编译设备和编译方法 | |
CN100340975C (zh) | 计算机***、编译器装置以及编译方法 | |
CN1287257C (zh) | 用于算术表达式优化的方法和装置 | |
CN1253806C (zh) | 仲裁电路和数据处理*** | |
CN100339824C (zh) | 高效执行特长指令字的处理器和方法 | |
CN1302380C (zh) | 处理器和编译器 | |
CN1127016C (zh) | 计算机处理装置和方法 | |
CN1842767A (zh) | 用于多个异常处理模型的中间表示 | |
CN1174332C (zh) | 转换表达方式的方法和装置 | |
CN1783012A (zh) | 程序转换器件及方法、程序转换执行器件及转换执行方法 | |
CN1122216C (zh) | 优化器 | |
CN1908892A (zh) | 测试用例设计方法和*** | |
CN1758221A (zh) | 程序处理装置 | |
CN1664779A (zh) | 软件开发基础架构 | |
CN1795434A (zh) | 程序执行控制设备,程序执行控制方法,控制程序和记录介质 | |
CN1228558A (zh) | 程序变换方法和程序变换*** | |
CN1749955A (zh) | 控制处理器和协处理器间的数据传输的运算处理装置 | |
CN1097226C (zh) | 编译程序器 | |
CN1802632A (zh) | 用于在程序代码转换期间执行解释器优化的方法和装置 | |
CN1319210A (zh) | 可配置的硬件块的配置方法 | |
CN1684058A (zh) | 处理器 | |
CN1991837A (zh) | 结构化文档处理装置和方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20080806 Termination date: 20110204 |