支持simd體系結構的分布式堆棧數據存儲方法
【專利摘要】本發(fā)明公開一種支持SIMD體系結構的分布式堆棧數據存儲方法,在內存中分布式分配堆棧空間,在標量存儲器中分配存儲標量信息的標量棧,在向量存儲器中分配存儲向量信息的向量棧;當程序編譯時,將標量單元需要訪問的局部變量分配在標量棧中,將向量單元需要訪問的局部變量分配在標量棧中;當程序運行時,將程序切換現場需要保存的標量信息保存在標量棧中、需要保存的向量信息保存在向量棧中,程序現場返回時,直接從標量棧中讀取標量信息到標量單元、從向量棧中讀取向量數據到向量單元。本發(fā)明具有堆棧數據存儲和訪問速度快、帶寬需求小、系統(tǒng)性能高且功耗低的優(yōu)點。
【專利說明】支持SIMD體系結構的分布式堆棧數據存儲方法
【技術領域】
[0001]本發(fā)明涉及SMD處理器領域,尤其涉及一種支持SMD體系結構的分布式堆棧數據存儲方法。
【背景技術】
[0002]隨著問題規(guī)模的增大和對實時性要求的提高,只有標量單元的微處理器的處理能力已難以滿足應用需求,SIMD (Single Instruction Data,單指令多數據流)向量處理器尤其是帶有向量單元的微處理器在業(yè)界得到了廣泛應用。
[0003]程序的運行狀態(tài)一般由編譯器通過堆棧進行管理,即運行時在內存中分配一塊內存作為堆棧,對函數運行過程的上下文、局部變量以及動態(tài)分配的數據區(qū)等進行管理從而可以支持函數調用、中斷處理以及動態(tài)數據區(qū)的分配等。目前,已有編譯器中堆棧的構建一般是在內存中分配一塊物理上連續(xù)的空間,堆棧存儲的內容包括局部變量、臨時變量、上層函數棧底、通用寄存器、條件寄存器、函數返回地址、上層函數棧頂以及動態(tài)分配區(qū)等內容。
[0004]在SMD微處理器的應用程序中,局部變量包括標量局部變量和向量局部變量,保存現場需要保存的寄存器包括標量寄存器和向量寄存器,調用參數包括標量參數和向量參數,同時分配動態(tài)內存區(qū)所存儲的數據也包括標量數據和向量數據。而在SMD微處理器體系結構中,一方面通常由標量單元負責執(zhí)行程序的流控,另一方面向量存儲器對所要存儲的數據長度以及存儲邊界要求更為嚴格,因此一般的堆棧結構直接存儲于向量存儲器效率較低,故目前業(yè)界一般SMD微處理器體系結構的堆棧都分配在標量存儲器中。將堆棧放置于標量存儲器中在功能上雖然能夠達到程序的正確性要求,然而對SMD微處理器體系結構性能支持方面存在以下缺陷:
(1)由于SMD微處理器的向量處理單元通常比較多,因此向量參數和向量寄存器的位也比較寬。假設SMD微處理器含有P個向量單元,則一個32位整數類型的向量參數,其長度為32*P位,因此從放置于標量存儲器的堆棧中讀取向量數據要花費較長的訪問時間并占用較大帶寬;
(2)由于向量數據位寬很大,因此在存儲、訪問堆棧時需要較長時間占用標量存儲器的訪問端口,從而阻塞了標量單元的存儲器訪問;
(3)由于標量存儲器并不直接連接向量單元,因此需要通過向量存儲器進行中轉。如從堆棧中讀取向量數據時需要將堆棧數據通過DMA (Direct Memory Access,直接存儲訪問)從標量存儲器傳輸到向量存儲器,然后再通過向量的訪存操作將數據從向量存儲器讀取到向量寄存器中,因此訪問向量數據需要進行兩步操作,更進一步降低了系統(tǒng)性能。
【發(fā)明內容】
[0005]本發(fā)明要解決的技術問題就在于:針對現有技術存在的問題,本發(fā)明提供一種實現方法簡單、堆棧數據存儲和訪問速度快、帶寬需求小、系統(tǒng)性能高且功耗低的支持SMD體系結構的分布式堆棧數據存儲方法。[0006]為解決上述技術問題,本發(fā)明提出的技術方案為:
一種支持SIMD體系結構的分布式堆棧數據存儲方法,在內存中分布式分配堆棧空間,分別在標量存儲器中分配用于存儲標量信息的標量棧,在向量存儲器中分配用于存儲向量信息的向量棧;程序編譯時,將標量單元需要訪問的局部變量分配于標量棧中,向量單元需要訪問的局部變量分配于向量棧中;程序運行時,將程序現場切換時需要保存的標量信息保存在標量棧中、需要保存的向量信息保存在向量棧中,程序現場返回時,直接從標量棧中讀取標量信息到標量單元、從向量棧中讀取向量信息到向量單元。
[0007]作為本發(fā)明的進一步改進,所述標量棧中存儲的標量信息包括:標量局部變量、標量臨時變量、上層標量幀指針、上層向量幀指針、標量通用寄存器、標量條件寄存器、標量參數、函數返回地址、上層標量棧指針、上層向量棧指針和標量動態(tài)數據。
[0008]作為本發(fā)明的進一步改進,所述向量棧中存儲的向量信息包括:向量局部變量、向量臨時變量、向量通用寄存器、向量參數和向量動態(tài)數據。
[0009]作為本發(fā)明的進一步改進,所述程序編譯后還包括鏈接程序時,在鏈接腳本文件中配置標量棧和向量棧的大小、起始地址。
[0010]作為本發(fā)明的進一步改進,所述程序運行時的具體步驟為:
(3.1)判斷程序執(zhí)行的狀態(tài);
(3.2)當步驟(3.1)判斷為調用函數時,將標量單元的標量局部變量、標量臨時變量、上層標量函數的棧底指針、函數返回地址、標量調用參數、需要保存的標量寄存器信息保存到標量棧中,將向量單元的向量局部變量、向量調用參數、需要保存的向量寄存器信息保存到向量棧中;調用完函數返回時,將標量棧中信息讀取到標量單元的相應寄存器中,將向量棧中信息讀取到向量單元的相應寄存器中;
(3.3)當步驟(3.1)判斷為執(zhí)行中斷服務程序時,在中斷服務程序執(zhí)行之前將標量寄存器保存在標量棧中,向量寄存器保存在向量棧中;中斷服務程序返回時,將標量棧中標量寄存器讀取到標量單元中的相應寄存器中,將向量棧中向量寄存器讀取到向量單元的相應寄存器中;
(3.4)當步驟(3.1)判斷為進行數據動態(tài)分配時,根據數據類型及動態(tài)分配函數參數的類型,將標量動態(tài)數據分配至標量棧、向量動態(tài)數據分配至向量棧中。
[0011]與現有技術相比,本發(fā)明的優(yōu)點在于:
(I)本發(fā)明將用戶程序的堆棧數據分布式存儲于標量存儲器和向量存儲器中,無論是標量單元或是向量單元對于局部變量的訪問性能都能夠得到提高。
[0012](2)本發(fā)明根據數據特性將標量信息存儲于標量存儲器中、向量信息存儲于向量存儲器中,充分利用了兩種存儲器存儲數據的優(yōu)勢,同時由于向量單元在訪問堆棧中的向量數據時,無需在標量存儲器和向量存儲器之間傳輸數據,能夠高效的實現堆棧數據訪問同時降低存儲器傳輸帶寬需求,提高系統(tǒng)性能,從而降低系統(tǒng)功耗。
[0013](3)本發(fā)明在函數調用和中斷現場保存時,所有現場寄存器存儲于本地存儲器中,能夠有效提高中斷處理性能;在動態(tài)分配向量數據空間時,編譯器將該空間直接分配到向量存儲器中,能夠實現高效訪問動態(tài)空間中向量數據。
【專利附圖】
【附圖說明】[0014]圖1是本實施例中SMD微處理器體系結構示意圖。
[0015]圖2是本實施例中向量單元(SIMDU)結構示意圖。
[0016]圖3是傳統(tǒng)編譯器的堆棧內存分配結構示意圖。
[0017]圖4是本實施例中支持SIMD體系結構的分布式堆棧存儲方法實現流程示意圖。
[0018]圖5是本實施例中支持SIMD體系結構的分布式堆棧內存分配結構示意圖。
[0019]圖6是本實施例中在函數調用時堆棧內存分配結構示意圖。
[0020]圖7是本實施例中在執(zhí)行中斷程序時堆棧內存分配結構示意圖。
[0021]圖8是本實施例中在動態(tài)數據分配時堆棧內存分配結構示意圖。
【具體實施方式】
[0022]以下結合說明書附圖和具體優(yōu)選的實施例對本發(fā)明作進一步描述,但并不因此而限制本發(fā)明的保護范圍。
[0023]如圖1所不,本實施例中SIMD微處理器體系結構,包括一個標量單兀(SU)和一個SMD單元(SMDU),其中SU主要負責程序流控處理、標量運算以及SMDU的異常處理,SMDU主要負責向量運算并支持基于向量的數據混洗操作等,SIMDU即為向量單元且包含有P個VPE向量處理單元。SU和SMDU共用取指和派發(fā)部件,SU指令和SMDU指令在取指、派發(fā)和執(zhí)行過程中并行執(zhí)行。SMD微處理器中還包括一個標量存儲單元和一個向量存儲單元,其中標量存儲單元負責給SU供數,向量存儲單元則負責給SIMDU單元供數。向量存儲單元支持向量數據按行訪問,從而能夠提高SIMDU單元的數據訪問效率,標量存儲單元和向量存儲單元之間通過DMA傳輸機制實現數據共享。
[0024]如圖2所示,本實施例中向量單元(SIMDU)結構,包含P個向量處理單元VPE (VPE,Vector Process Element),其中每個向量處理單元VPE中包含多個獨立的功能部件,分別為:乘法部件MUL、加法部件ALU、移位部件BP等,且每個向量處理單元VPE包含一組局部寄存器RcTRr。向量單元中所有同一編號向量處理單元VPE的局部寄存器在邏輯上又組成一個向量寄存器,例如向量處理單元VPEtl — VPElri的Rtl寄存器在邏輯上組成了向量寄存器VR0,每個向量處理單兀VPE所對應的Rtl寄存器稱為向量寄存器的一個兀素。向量處理器在同一條向量指令的控制下,P個向量處理單元VPE同時對各自的局部寄存器進行相同操作,用以實現應用程序的數據級并行性。
[0025]現有編譯技術中程序運行過程中的動態(tài)信息是存儲在內存中一片連續(xù)的空間內。如圖3所示,傳統(tǒng)編譯器的堆棧內存分配結構,堆棧一般存儲的內容包括局部變量、臨時變量、上層幀指針、通用寄存器、條件寄存器、參數存儲區(qū)、函數返回地址、上層棧指針以及動態(tài)分配區(qū)等,按地址增長方向依次進行存儲,即豎直箭頭所指向的方向,當前幀指針指向程序當前堆棧的棧頂,當前棧指針指向程序當前堆棧的棧底。而當硬件體系結構為SIMD微處理器時,局部變量、臨時變量、通用寄存器、參數存儲區(qū)和動態(tài)分配區(qū)的內容還包含向量數據。
[0026]基于上述SIMD微處理器體系結構及傳統(tǒng)編譯器的堆棧內存分配結構,本實施例在內存空間分配時采用分布式分配堆棧的方式,首先在標量存儲單元中分配一片連續(xù)的存儲空間作為標量棧,用于存儲標量單元需要訪問的標量信息;同時在向量存儲單元中分配一片連續(xù)的存儲空間作為向量棧,用于存儲向量單元需要訪問的向量信息。[0027]如圖4所示,本實施例中支持SIMD體系結構的分布式堆棧數據存儲方法,步驟為:
O在內存中分布式分配堆棧空間,分別在SIMD微處理器的標量存儲單兀中分配用于存儲標量單元需要訪問的標量信息的標量棧,在向量存儲單元中分配用于存儲向量單元需要訪問的向量信息的向量棧;
2)程序編譯時,將標量單元需要訪問的局部變量分配于標量棧中,向量單元需要訪問的局部變量分配于向量棧中;
3)程序運行時,將程序現場切換時需要保存的標量信息保存在標量棧中、需要保存的向量信息保存在向量棧中,程序現場返回時,直接從標量棧中讀取標量信息到標量單元、從向量棧中讀取向量信息到向量單元。
[0028]本實施例中,在鏈接程序時,用戶需要在鏈接腳本文件中配置程序需要的標量棧和向量棧的大小、起始地址,其中將標量棧分配于標量存儲器中,將向量棧分配于向量存儲器中。
[0029]本實施例將應用程序的堆棧數據分別保存到標量存儲單元和向量存儲單元中,根據數據類型由標量單元和向量單元分別進行存儲和訪問,能夠有效提高標量單元、向量單元的數據及局部變量的訪問性能。向量數據存儲在向量存儲單元中,相比于存儲在標量存儲器中能夠有效減少存儲和訪問的時間,同時由于不占用標量存儲單元的訪問端口,避免了對標量單元存儲器訪問造成阻塞;且向量單元在訪問堆棧中的向量數據時,無需在標量存儲單元和向量存儲單元之間傳輸數據,降低了存儲器傳輸帶寬需求,提高系統(tǒng)性能,從而降低系統(tǒng)功耗。
[0030]如圖5所示,本實施例中支持SIMD體系結構的分布式堆棧內存分配結構,在傳統(tǒng)編譯器堆棧內存分配結構的基礎上,在標量存儲單元中分配一塊連續(xù)的空間作為標量棧,同時在向量存儲單元中單獨分配一塊連續(xù)的空間作為向量棧,其中標量棧存儲標量單元需要訪問的標量信息,標量棧的內存分配結構為:分配標量局部變量、標量臨時變量、上層標量幀指針、上層向量幀指針、標量通用寄存器、標量條件寄存器、標量參數存儲區(qū)、函數返回地址、上層標量棧指針、上層向量棧指針存儲空間和標量動態(tài)分配區(qū),當前標量巾貞指針指向當前標量棧棧頂和棧底;向量棧存儲向量單元單元需要訪問的向量信息,向量棧的內存分配結構為:分配向量局部變量、向量臨時變量、向量通用寄存器的存儲空間、向量參數存儲區(qū)和向量動態(tài)分配區(qū),當前向量幀指針指向當前向量棧棧頂和棧底。
[0031]本實施例中,程序運行時的具體步驟為:
(3.1)判斷程序執(zhí)行的狀態(tài);
(3.2)當步驟(3.1)判斷為調用函數時,將標量單元的標量局部變量、標量臨時變量、上層標量函數的棧底指針、函數返回地址、標量調用參數、需要保存的標量寄存器信息保存到標量棧中,將向量單元的向量局部變量、向量調用參數、需要保存的向量寄存器信息保存到向量棧中;調用完函數返回時,將標量棧中信息讀取標量單元的相應寄存器中,將向量棧中信息讀取到向量單元的相應寄存器中;
(3.3)當步驟(3.1)判斷為執(zhí)行中斷服務程序時,在中斷服務程序執(zhí)行之前將標量寄存器保存在標量棧中,向量寄存器保存在向量棧中;中斷服務程序返回時,將標量棧中標量寄存器讀取到標量單元單元中的相應寄存器中,將向量棧中向量寄存器讀取到向量單元的相應寄存器中;
(3.4)當步驟(3.1)判斷為進行數據動態(tài)分配時,根據數據類型及動態(tài)分配函數參數的類型,將標量動態(tài)數據分配至標量棧、向量動態(tài)數據分配至向量棧中。
[0032]如圖6所示,本實施例中在函數調用時堆棧分配存儲空間結構,從當前標量棧指針指向的標量棧棧頂開始分配相應的空間用于存儲標量局部變量、標量臨時變量、當前標量幀指針、當前向量幀指針、標量通用寄存器、條件寄存器、標量參數、函數返回地址、當前向量棧指針和當前標量棧指針,并更新標量棧指針;從當前向量棧指針指向的向量棧棧頂開始分配相應的空間用于存儲向量局部變量、向量臨時變量、向量通用寄存器和向量參數,并更新向量棧指針。
[0033]如圖7所示,本實施例中在執(zhí)行中斷時堆棧分配存儲空間結構,從當前標量棧指針指向的標量棧棧頂開始分配相應的空間存儲當前標量巾貞指針、當前向量巾貞指針、標量通用寄存器、條件寄存器、當前向量棧指針和當前標量棧指針,并更新標量棧頂指針;從當前向量棧指針指向的向量棧棧頂開始分配相應的空間存儲向量通用寄存器,并更新向量棧指針。
[0034]如圖8所示,本實施例中在動態(tài)數據空間分配時堆棧分配結構,根據編譯器根據需要分配的數據類型進行判斷,若為標量數據,則從標量棧棧頂開始分配相應的空間存儲標量動態(tài)數據,并更新標量棧頂指針;若為向量數據,則從向量棧棧頂開始分配相應的空間存儲向量動態(tài)數據,并更新向量棧頂指針。
[0035]本實施例在函數調用和中斷現場保存時,所有現場寄存器存儲于本地存儲器中,能夠有效提高中斷處理性能;在動態(tài)分配向量數據空間時,編譯器將該空間直接分配到向量存儲單元中,具有較高的動態(tài)空間中向量數據訪問性能。同時由于向量單元在訪問堆棧中的向量數據時,無需在標量存儲單元和向量存儲單元之間傳輸數據,能夠降低存儲器傳輸帶寬需求,提高系統(tǒng)性能,從而降低系統(tǒng)功耗。
[0036]以上僅是本發(fā)明的優(yōu)選實施方式,本發(fā)明的保護范圍并不僅局限于上述實施例,凡屬于本發(fā)明思路下的技術方案均屬于本發(fā)明的保護范圍。應當指出,對于本【技術領域】的普通技術人員來說,在不脫離本發(fā)明原理前提下的若干改進和潤飾,應視為本發(fā)明的保護范圍。
【權利要求】
1.一種支持SIMD體系結構的分布式堆棧數據存儲方法,其特征在于:在內存中分布式分配堆??臻g,分別在標量存儲器中分配用于存儲標量信息的標量棧,在向量存儲器中分配用于存儲向量信息的向量棧;當程序編譯時,將標量單元需要訪問的局部變量分配于標量棧中,向量單元需要訪問的局部變量分配于向量棧中;當程序運行時,將程序現場切換時需要保存的標量信息保存在標量棧中、需要保存的向量信息保存在向量棧中,程序現場返回時,直接從標量棧中讀取標量信息到標量單元、從向量棧中讀取向量信息到向量單元。
2.根據權利要求1所述的支持SIMD體系結構的分布式堆棧數據存儲方法,其特征在于,所述標量棧中存儲的標量信息包括:標量局部變量、標量臨時變量、上層標量巾貞指針、上層向量幀指針、標量通用寄存器、標量條件寄存器、標量參數、函數返回地址、上層標量棧指針、上層向量棧指針和標量動態(tài)數據。
3.根據權利要求1所述的支持SIMD體系結構的分布式堆棧數據存儲方法,其特征在于,所述向量棧中存儲的向量信息包括:向量局部變量、向量臨時變量、向量通用寄存器、向量參數和向量動態(tài)數據。
4.根據權利要求1或2或3所述的支持SIMD體系結構的分布式堆棧數據存儲方法,其特征在于,所述程序編譯后還包括鏈接程序時,在鏈接腳本文件中配置所述標量棧和所述向量棧的大小、起始地址。
5.根據權利要求1或2或3所述的支持SIMD體系結構的分布式堆棧數據存儲方法,其特征在于,所述程序運行時的具體步驟為: (3.1)判斷程序執(zhí)行的狀態(tài); (3.2)當步驟(3.1)判斷為調用函數時,將標量單元的標量局部變量、標量臨時變量、上層標量函數的棧底指針、函數返回地址、標量調用參數、需要保存的標量寄存器信息保存到標量棧中,將向量單元的向量局部變量、向量調用參數、需要保存的向量寄存器信息保存到向量棧中;調用完函數返回時,直接將標量棧中信息讀取到標量單元的相應寄存器中,將向量棧中信息讀取到向量單元的相應寄存器中; (3.3)當步驟(3.1)判斷為執(zhí)行中斷服務程序時,在中斷服務程序執(zhí)行之前將標量寄存器保存在標量棧中,向量寄存器保存在向量棧中;中斷服務程序返回時,直接將標量棧中標量寄存器讀取到標量單元中的相應寄存器中,將向量棧中向量寄存器讀取到向量單元的相應寄存器中; (3.4)當步驟(3.1)判斷為進行數據動態(tài)分配時,根據數據類型及動態(tài)分配函數參數的類型,將標量動態(tài)數據分配至標量棧、向量動態(tài)數據分配至向量棧中。
【文檔編號】G06F12/02GK103942152SQ201410173672
【公開日】2014年7月23日 申請日期:2014年4月28日 優(yōu)先權日:2014年4月28日
【發(fā)明者】孫海燕, 陽柳, 王霽, 張雪萌, 陳書明, 郭陽, 陳躍躍, 龔國輝, 劉衡竹, 彭元喜, 李 燦, 陳偉業(yè) 申請人:中國人民解放軍國防科學技術大學