本發(fā)明涉及計(jì)算機(jī),具體地說(shuō)是基于gpgpu的指令流水線優(yōu)化及動(dòng)態(tài)規(guī)劃方法及系統(tǒng)。
背景技術(shù):
1、gpgpu(英文全稱為general-purpose?computing?on?graphics?processingunits,中文翻譯為通用計(jì)算圖形處理單元)是一種將圖形處理單元(gpu)的計(jì)算能力擴(kuò)展到通用計(jì)算任務(wù)的技術(shù)。通過(guò)這種技術(shù),gpu不僅僅用于圖形渲染,還能夠高效地執(zhí)行各種通用計(jì)算任務(wù),包括科學(xué)計(jì)算、數(shù)據(jù)分析、深度學(xué)習(xí)等。通常gpgpu通過(guò)五階段流水線實(shí)現(xiàn)指令的執(zhí)行,即取指,譯碼,發(fā)射,執(zhí)行與寫(xiě)回,流水線可以保證硬件指令以一種有序、高效的形式執(zhí)行。
2、五階段流水線在指令執(zhí)行階段容易出現(xiàn)問(wèn)題,當(dāng)gpgpu執(zhí)行整型處理指令時(shí),整型運(yùn)算大多只需要一周期即計(jì)算完成,因此不影響流水線的效率,但當(dāng)gpgpu執(zhí)行浮點(diǎn)型或特殊函數(shù)指令時(shí),往往需要若干個(gè)時(shí)鐘周期才能計(jì)算完成,此時(shí)流水線將處于停滯階段,阻塞下一指令的執(zhí)行,嚴(yán)重影響了流水線效率,降低了計(jì)算速度。
3、浮點(diǎn)或特殊函數(shù)等多周期指令使得指令流水線停滯、降低了流水線效率與計(jì)算性能,是需要解決的技術(shù)問(wèn)題。
技術(shù)實(shí)現(xiàn)思路
1、本發(fā)明的技術(shù)任務(wù)是針對(duì)以上不足,提供基于gpgpu的指令流水線優(yōu)化及動(dòng)態(tài)規(guī)劃方法及系統(tǒng),來(lái)解決浮點(diǎn)或特殊函數(shù)等多周期指令使得指令流水線停滯、降低了流水線效率與計(jì)算性能的技術(shù)問(wèn)題。
2、第一方面,本發(fā)明一種基于gpgpu的指令流水線優(yōu)化及動(dòng)態(tài)規(guī)劃方法,應(yīng)用于host和gpgpu之間,所述方法包括如下步驟:
3、通過(guò)host編譯操作指令,通過(guò)gpgpu內(nèi)線程束調(diào)度模塊對(duì)線程束進(jìn)行分配和配置后,進(jìn)入流水線執(zhí)行;
4、線程束進(jìn)入取指階段、譯碼階段和發(fā)射階段,在譯碼階段將取指階段獲取的操作指令進(jìn)行解碼、得到譯碼后指令,在發(fā)射階段,基于譯碼后指令中指定的操作數(shù)類型和操作數(shù)地址從gpgpu的存儲(chǔ)中獲取源操作數(shù);
5、基于流水線狀態(tài)信號(hào)以及譯碼后指令中指定的指令類型、對(duì)流水線進(jìn)行動(dòng)態(tài)規(guī)劃,將譯碼后指令和源操作數(shù)送入單周期執(zhí)行階段或多周期執(zhí)行階段,其中,單周期執(zhí)行階段進(jìn)行類型為整型運(yùn)算或分支運(yùn)算的單周期指令,運(yùn)算過(guò)程中、單周期執(zhí)行階段的流水線狀態(tài)信號(hào)標(biāo)識(shí)為忙信號(hào),運(yùn)算結(jié)束后、單周期執(zhí)行階段的流水線狀態(tài)信號(hào)標(biāo)識(shí)為空閑信號(hào);多周期執(zhí)行階段進(jìn)行類型為浮點(diǎn)型運(yùn)算或特殊函數(shù)運(yùn)算的多周期指令,運(yùn)算過(guò)程中,將操作指令劃分為n個(gè)運(yùn)算階段周期性執(zhí)行,對(duì)于每個(gè)運(yùn)算階段,運(yùn)算過(guò)程中、將當(dāng)前運(yùn)算階段的流水線狀態(tài)信號(hào)標(biāo)識(shí)為忙信號(hào),運(yùn)算結(jié)束后、當(dāng)前運(yùn)算階段的流水線狀態(tài)信號(hào)標(biāo)識(shí)為空閑信號(hào);
6、單周期執(zhí)行或多周期執(zhí)行結(jié)束后,進(jìn)入寫(xiě)回階段,基于譯碼后指令中指定的目標(biāo)類型和目標(biāo)地址、通過(guò)寫(xiě)回階段將運(yùn)算結(jié)果存儲(chǔ)至gpgpu指定的存儲(chǔ)中。
7、作為優(yōu)選,基于流水線狀態(tài)信號(hào)以及譯碼后指令中指定的指令類型、對(duì)流水線進(jìn)行動(dòng)態(tài)規(guī)劃,包括如下步驟:
8、如果當(dāng)前操作指令instr1的指令類型為單周期指令,將源操作數(shù)和譯碼后指令發(fā)送至單周期執(zhí)行階段,單周期執(zhí)行階段完成整型運(yùn)算或分支運(yùn)算后,將運(yùn)算結(jié)果輸出,以通過(guò)寫(xiě)回階段將運(yùn)算結(jié)構(gòu)寫(xiě)入gpgpu指定的存儲(chǔ);
9、如果當(dāng)前操作指令instr1的指令類型為多周期指令,將源操作和譯碼后指令發(fā)送至多周期執(zhí)行階段;
10、對(duì)于當(dāng)前操作指令instr1,多周期執(zhí)行階段根據(jù)源操作數(shù)和譯碼后操作指令完成第1運(yùn)算階段的運(yùn)算后,將第1運(yùn)算階段的流水線狀態(tài)信號(hào)標(biāo)識(shí)為空閑信號(hào),開(kāi)始執(zhí)行第2運(yùn)算階段的運(yùn)算;
11、對(duì)于下一條操作指令instr2,在譯碼階段將取指階段獲取的操作指令進(jìn)行解碼、得到譯碼后指令,進(jìn)入發(fā)射階段,基于譯碼后指令中指定的操作數(shù)類型和操作數(shù)地址從gpgpu的存儲(chǔ)中獲取源操作數(shù),并基于當(dāng)前流水線狀態(tài)信號(hào)以及譯碼后指令中指定的指令類型對(duì)流水線進(jìn)行動(dòng)態(tài)規(guī)劃,如果指令類型為單周期指令,將源操作數(shù)和譯碼后指令發(fā)送至單周期執(zhí)行階段,并且將單周期執(zhí)行階段的流水線狀態(tài)信號(hào)標(biāo)識(shí)為忙信號(hào),標(biāo)識(shí)上一條操作指令instr1尚未完成,如果指令類型為多周期指令,將將源操作數(shù)和譯碼后指令發(fā)送至多周期執(zhí)行階段,進(jìn)入第1運(yùn)算階段進(jìn)行運(yùn)算;
12、當(dāng)多周期執(zhí)行階段完成第n個(gè)運(yùn)算階段的運(yùn)算后,則返回instr1的完成信號(hào)并將運(yùn)算結(jié)果輸出,若下一條操作指令instr2為多周期指令,則繼續(xù)執(zhí)行instr1的第n-1運(yùn)算階段的運(yùn)算,若instr2為單周期指令,則返回instr2的完成信號(hào)。
13、基于instr1的完成信號(hào),取消單周期執(zhí)行階段流水線狀態(tài)信號(hào)的忙信號(hào),開(kāi)始執(zhí)行instr2的運(yùn)算。
14、作為優(yōu)選,gpgpu內(nèi)存儲(chǔ)包括全局內(nèi)存、恒參內(nèi)存、l2?cache以及配置于流多處理器sm內(nèi)的l1?cache、寄存器文件和共享內(nèi)存;
15、全局內(nèi)存用于存儲(chǔ)待處理的數(shù)據(jù)以及編譯后的操作指令;
16、gpgpu運(yùn)行過(guò)程中,恒參內(nèi)存用于存儲(chǔ)運(yùn)算過(guò)程中的恒定參量;
17、寄存器文件用于運(yùn)算過(guò)程中數(shù)據(jù)和中間計(jì)算結(jié)果的緩存;
18、共享內(nèi)存用于線程束間及線程間的數(shù)據(jù)交換;
19、l2?cache為高速緩存,用于通過(guò)合并訪存的方式對(duì)全局內(nèi)存中的數(shù)據(jù)進(jìn)行預(yù)??;
20、l1?cache用于從l2?cache中預(yù)取數(shù)據(jù)和操作指令。
21、作為優(yōu)選,取指階段從l1?cache中讀取操作指令;
22、發(fā)射階段,通過(guò)l1?cache緩存譯碼后指令,根據(jù)譯碼后指令中指定的操作數(shù)類型和操作數(shù)家地址從相應(yīng)類型存儲(chǔ)中讀取源操作數(shù),存儲(chǔ)包括共享內(nèi)存、寄存器文件和全局內(nèi)存;
23、寫(xiě)回階段,根據(jù)譯碼后指令中指定的目標(biāo)類型和目標(biāo)地址、將運(yùn)算結(jié)果寫(xiě)入相應(yīng)類型存儲(chǔ)中,存儲(chǔ)包括共享內(nèi)存、寄存器文件和全局內(nèi)存。
24、第二方面,本發(fā)明一種基于gpgpu的指令流水線優(yōu)化及動(dòng)態(tài)規(guī)劃系統(tǒng),其特征在于,用于通過(guò)如第一方面任一項(xiàng)所述的一種基于gpgpu的指令流水線優(yōu)化及動(dòng)態(tài)規(guī)劃對(duì)流水線進(jìn)行優(yōu)化及動(dòng)態(tài)規(guī)劃,所述系統(tǒng)包括host和gpgpu;
25、host用于編譯操作指令;
26、gpgpu內(nèi)配置有全局內(nèi)存、l2?cache、恒參內(nèi)存以及流多處理器sm,流多處理器sm中包括線程束調(diào)度模塊、流水線、寄存器文件、l1?cache以及共享內(nèi)存;
27、線程束調(diào)度模塊用于提供線程束的調(diào)度與維護(hù)服務(wù);
28、全局內(nèi)存、l2?cache、恒參內(nèi)存、寄存器文件、l1?cache以及共享內(nèi)存作為gpgpu的存儲(chǔ),全局內(nèi)存用于存儲(chǔ)待處理的數(shù)據(jù)以及編譯后的操作指令,
29、gpgpu運(yùn)行過(guò)程中、恒參內(nèi)存用于存儲(chǔ)運(yùn)算過(guò)程中的恒定參量,寄存器文件用于運(yùn)算過(guò)程中數(shù)據(jù)和中間計(jì)算結(jié)果的緩存,共享內(nèi)存用于線程束間及線程間的數(shù)據(jù)交換,l2cache為高速緩存,用于通過(guò)合并訪存的方式對(duì)全局內(nèi)存中的數(shù)據(jù)進(jìn)行預(yù)取,l1?cache用于從l2?cache中預(yù)取數(shù)據(jù)和操作指令;
30、流水線包括取指單元、譯碼單元、發(fā)射單元、流水線動(dòng)態(tài)規(guī)劃單元、單周期執(zhí)行單元、多周期執(zhí)行單元以及寫(xiě)回單元;
31、其中,所述取指單元用于執(zhí)行取指階段,在取指階段獲取操作指令;
32、所述譯碼單元用于執(zhí)行譯碼階段,在譯碼階段將操作指令進(jìn)行解碼、得到譯碼后指令;
33、所述發(fā)射單元用于執(zhí)行發(fā)射階段,在發(fā)射階段基于譯碼后指令中指定的操作數(shù)類型和操作數(shù)地址從gpgpu的存儲(chǔ)中獲取源操作數(shù),并將源操作數(shù)和譯碼后指令發(fā)送至流水線動(dòng)態(tài)規(guī)劃單元;
34、所述流水線動(dòng)態(tài)規(guī)劃單元用于基于流水線狀態(tài)信號(hào)以及譯碼后指令中指定的指令類型、對(duì)流水線進(jìn)行動(dòng)態(tài)規(guī)劃,將譯碼后指令和源操作數(shù)送入單周期執(zhí)行階段或多周期執(zhí)行階段;
35、所述單周期執(zhí)行單元用于進(jìn)行單周期執(zhí)行階段,通過(guò)單周期執(zhí)行階段進(jìn)行類型為整型運(yùn)算或分支運(yùn)算的單周期指令,運(yùn)算過(guò)程中、單周期執(zhí)行階段的流水線狀態(tài)信號(hào)標(biāo)識(shí)為忙信號(hào),運(yùn)算結(jié)束后、單周期執(zhí)行階段的流水線狀態(tài)信號(hào)標(biāo)識(shí)為空閑信號(hào);
36、所述多周期執(zhí)行單元用于進(jìn)行多周期執(zhí)行階段,多周期執(zhí)行階段進(jìn)行類型為浮點(diǎn)型運(yùn)算或特殊函數(shù)運(yùn)算的多周期指令,運(yùn)算過(guò)程中,將操作指令劃分為n個(gè)運(yùn)算階段周期性執(zhí)行,對(duì)于每個(gè)運(yùn)算階段,運(yùn)算過(guò)程中、將當(dāng)前運(yùn)算階段的流水線狀態(tài)信號(hào)標(biāo)識(shí)為忙信號(hào),運(yùn)算結(jié)束后、當(dāng)前運(yùn)算階段的流水線狀態(tài)信號(hào)標(biāo)識(shí)為空閑信號(hào);
37、寫(xiě)回單元用于執(zhí)行寫(xiě)回階段,在寫(xiě)回階段基于譯碼后指令中指定的目標(biāo)類型和目標(biāo)地址、將單周期執(zhí)行單元和多周期執(zhí)行單元輸出的運(yùn)算結(jié)果存儲(chǔ)至gpgpu指定的存儲(chǔ)中。
38、作為優(yōu)選,基于流水線狀態(tài)信號(hào)以及譯碼后指令中指定的指令類型、對(duì)流水線進(jìn)行動(dòng)態(tài)規(guī)劃時(shí),取指單元、譯碼單元、發(fā)射單元、流水線動(dòng)態(tài)規(guī)劃單元以及寫(xiě)回單元配合用于執(zhí)行如下操作:
39、如果當(dāng)前操作指令instr1的指令類型為單周期指令,發(fā)射單元將源操作數(shù)和譯碼后指令發(fā)送至單周期執(zhí)行單元進(jìn)入單周期執(zhí)行階段,單周期執(zhí)行階段完成整型運(yùn)算或分支運(yùn)算后,單周期執(zhí)行單元將運(yùn)算結(jié)果輸出,流水線動(dòng)態(tài)規(guī)劃單元從單周期執(zhí)行單元獲取運(yùn)算結(jié)果并發(fā)送至寫(xiě)回單元,以通過(guò)寫(xiě)回階段將運(yùn)算結(jié)構(gòu)寫(xiě)入gpgpu指定的存儲(chǔ);
40、如果當(dāng)前操作指令instr1的指令類型為多周期指令,發(fā)射單元將源操作和譯碼后指令發(fā)送至多周期執(zhí)行單元進(jìn)入多周期執(zhí)行階段;
41、對(duì)于當(dāng)前操作指令instr1,多周期執(zhí)行階段根據(jù)源操作數(shù)和譯碼后操作指令完成第1運(yùn)算階段的運(yùn)算后,將第1運(yùn)算階段的流水線狀態(tài)信號(hào)標(biāo)識(shí)為空閑信號(hào)并返回線程束調(diào)度模塊,開(kāi)始執(zhí)行第2運(yùn)算階段的運(yùn)算;
42、對(duì)于下一條操作指令instr2,在譯碼階段將取指階段獲取的操作指令進(jìn)行解碼、得到譯碼后指令,將譯碼后指令發(fā)送至發(fā)射單元以進(jìn)入發(fā)射階段,基于譯碼后指令中指定的操作數(shù)類型和操作數(shù)地址、發(fā)射單元從gpgpu的存儲(chǔ)中獲取源操作數(shù),并將源操作數(shù)和譯碼后指令發(fā)送至流水線動(dòng)態(tài)規(guī)劃單元,基于當(dāng)前流水線狀態(tài)信號(hào)以及譯碼后指令中指定的指令類型、流水線動(dòng)態(tài)規(guī)劃單元對(duì)流水線進(jìn)行動(dòng)態(tài)規(guī)劃,如果指令類型為單周期指令,將源操作數(shù)和譯碼后指令發(fā)送至單周期執(zhí)行單元以進(jìn)入單周期執(zhí)行階段,單周期執(zhí)行單元將單周期執(zhí)行階段的流水線狀態(tài)信號(hào)標(biāo)識(shí)為忙信號(hào)并返回流水線仲裁模塊,標(biāo)識(shí)上一條操作指令instr1尚未完成,如果指令類型為多周期指令,發(fā)射單元將將源操作數(shù)和譯碼后指令發(fā)送至多周期執(zhí)行單元以進(jìn)入多周期執(zhí)行階段,進(jìn)入第1運(yùn)算階段進(jìn)行運(yùn)算;
43、當(dāng)多周期執(zhí)行階段完成第n個(gè)運(yùn)算階段的運(yùn)算后,則多周期執(zhí)行單元向流水線仲裁模塊返回instr1的完成信號(hào)并將運(yùn)算結(jié)果輸出,若下一條操作指令instr2為多周期指令,則繼續(xù)執(zhí)行instr1的第n-1運(yùn)算階段的運(yùn)算,若instr2為單周期指令,則向流水線仲裁模塊返回instr2的完成信號(hào)。
44、基于instr1的完成信號(hào)、流水線仲裁模塊取消單周期執(zhí)行階段流水線狀態(tài)信號(hào)的忙信號(hào),開(kāi)始執(zhí)行instr2的運(yùn)算。
45、作為優(yōu)選,所述流水線動(dòng)態(tài)規(guī)劃單元包括流水線仲裁單元和輸出選擇單元;
46、所述流水線仲裁單元用于接收發(fā)射單元發(fā)送的源操作數(shù)和譯碼后指令,將譯碼后指令中指定的指令類型發(fā)送至輸出選擇單元,用于基于譯碼后指令中指定的指令類型判斷操作指令為單周期指令還是多周期指令,如果為單周期指令、且單周期執(zhí)行階段的流水線狀態(tài)信號(hào)為空閑信號(hào),用于將源操作數(shù)和譯碼后指令發(fā)送至單周期執(zhí)行單元以進(jìn)入單周期執(zhí)行階段,如果為多周期指令、且第1運(yùn)算階段的流水線狀態(tài)信號(hào)為空閑信號(hào),用于將將源操作數(shù)和譯碼后指令發(fā)送至多周期執(zhí)行單元以進(jìn)入多周期執(zhí)行階段;
47、所述輸出選擇單元用于基于指令類型從單周期執(zhí)行單元或多周期執(zhí)行單元中獲取運(yùn)算結(jié)果,并將運(yùn)算結(jié)果以及譯碼后指令發(fā)送至寫(xiě)回單元。
48、作為優(yōu)選,取指階段從l1?cache中讀取操作指令;
49、發(fā)射階段,通過(guò)l1?cache緩存譯碼后指令,根據(jù)譯碼后指令中指定的操作數(shù)類型和操作數(shù)家地址從相應(yīng)類型存儲(chǔ)中讀取源操作數(shù),存儲(chǔ)包括共享內(nèi)存、寄存器文件和全局內(nèi)存;
50、寫(xiě)回階段,根據(jù)譯碼后指令中指定的目標(biāo)類型和目標(biāo)地址、將運(yùn)算結(jié)果寫(xiě)入相應(yīng)類型存儲(chǔ)中,存儲(chǔ)包括共享內(nèi)存、寄存器文件和全局內(nèi)存。
51、作為優(yōu)選,host包括cpu、memory和編譯器,cpu作為主處理器用于執(zhí)行任務(wù)的建立、分配、調(diào)度和釋放,編譯器用于對(duì)寫(xiě)入的程序進(jìn)行編譯、生成gpgpu可執(zhí)行的操作指令,memory用于提供數(shù)據(jù)存儲(chǔ),包括存儲(chǔ)程序和操作指令。
52、作為優(yōu)選,所述gpgpu作為協(xié)處理器,還包括pcie控制、線程塊調(diào)度以及gpgpu配置模塊;
53、所述pcie控制模塊用于例化pcie接口,控制host中cpu與gpgpu的通信,并將gpgpu存儲(chǔ)與host中?memory建立連接,實(shí)現(xiàn)數(shù)據(jù)在host與gpgpu之間的傳輸;
54、所述線程塊調(diào)度模塊用于實(shí)現(xiàn)線程塊的執(zhí)行調(diào)度;
55、所述gpgpu配置模塊用于初始化gpgpu,并配置gpgpu的控制參數(shù)。
56、本發(fā)明的基于gpgpu的指令流水線優(yōu)化及動(dòng)態(tài)規(guī)劃方法及系統(tǒng)具有以下優(yōu)點(diǎn):
57、1、將高復(fù)雜度的浮點(diǎn)型或特殊函數(shù)運(yùn)算拆分成多個(gè)低復(fù)雜度的運(yùn)算流水執(zhí)行,降低了運(yùn)算復(fù)雜度,改善了芯片時(shí)序,提高了穩(wěn)定性,可進(jìn)一步提高gpgpu的主頻,增強(qiáng)性能;
58、2、將流水線的執(zhí)行階段拆分為多個(gè)運(yùn)算階段,有效降低了因多周期運(yùn)算造成的流水線停滯問(wèn)題,節(jié)省了額外的等待耗時(shí),提高了流水線效率,提升了計(jì)算性能;
59、3、多階段執(zhí)行可在當(dāng)前指令進(jìn)入執(zhí)行階段后允許更多的指令同時(shí)進(jìn)入執(zhí)行階段,提高了指令吞吐率,并且為編譯器提供了更多的優(yōu)化空間,編譯器可以更細(xì)致地安排指令的執(zhí)行順序。