国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      Dma向量緩沖區(qū)的制作方法

      文檔序號:6516347閱讀:873來源:國知局
      Dma向量緩沖區(qū)的制作方法
      【專利摘要】根據(jù)一個示例實(shí)施方案,公開一種直接存儲器訪問(DMA)引擎和緩沖區(qū)。所述向量緩沖區(qū)可為顯式可編程,且可包括用于重新排序非單位步長向量數(shù)據(jù)的先進(jìn)邏輯電路。示例MEMCPY指令可向所述DMA緩沖區(qū)提供訪問請求,所述DMA緩沖區(qū)然后可異步為所述請求提供服務(wù)。逐位保護(hù)被設(shè)置在使用中的存儲器上,且當(dāng)讀取每一位時被清除。
      【專利說明】DMA向量緩沖區(qū)
      [0001]相關(guān)申請的交叉引用
      [0002]本申請請求2012 年 10 月 23 日提交的題為 “Compiler Directed Direct MemoryAccess(DMA)Vector Buffer”的美國臨時申請61/717,564的優(yōu)先權(quán),所述申請以引用的方式全部并入。
      【技術(shù)領(lǐng)域】
      [0003]本公開一般涉及計(jì)算機(jī)處理器,且更具體說來,涉及直接存儲器訪問緩沖區(qū)。
      【背景技術(shù)】
      [0004]并行處理通常由處理器來實(shí)施以優(yōu)化處理應(yīng)用,例如,由數(shù)字信號處理器(DSP)來實(shí)施以優(yōu)化數(shù)字信號處理應(yīng)用。處理器可操作為單指令多數(shù)據(jù)(SMD)或數(shù)據(jù)并行處理器以實(shí)現(xiàn)并行處理。在SMD操作中,單指令被發(fā)送到處理器的若干處理元件,其中每個處理元件可對不同數(shù)據(jù)執(zhí)行相同的操作。
      [0005]在向量處理中,“步長(stride ) ”代表每個元素的增量程序步大小,步長可與元素大小相同或不相同。例如,32位(4字節(jié))的元素?cái)?shù)組尤其是在有32位數(shù)據(jù)字長的處理器上可具有4字節(jié)的步長。當(dāng)每N個元素訪問一個項(xiàng)目時,出現(xiàn)非單位步長。例如,在步長為4的情況下,訪問每4個字。
      【專利附圖】

      【附圖說明】
      [0006]通過結(jié)合附圖閱讀時的以下詳細(xì)描述來更好地理解本公開。應(yīng)強(qiáng)調(diào),根據(jù)行業(yè)的標(biāo)準(zhǔn)實(shí)踐,各種特征并非按比例繪制且只用于說明的目的使用。實(shí)際上,為達(dá)到清楚討論的目的,各種特征的尺寸可任意增大或減小。
      [0007]圖1是示出本公開的各種組件和子系統(tǒng)之間的互連的方塊圖。
      [0008]圖2是根據(jù)本公開的各種方面的示例存儲器子系統(tǒng)的方塊圖。
      [0009]圖3是根據(jù)本公開的各種方面的處理器系統(tǒng)的示意方塊圖。
      [0010]圖4是示出根據(jù)本公開的各種方面的圖1的處理器系統(tǒng)的操作所產(chǎn)生的示例數(shù)據(jù)流的方塊圖。
      [0011]圖5是根據(jù)本公開的各種方面的存儲器緩沖區(qū)之間的示例讀寫周期的方塊圖。
      [0012]圖6是根據(jù)本公開的各種方面的受保護(hù)的緩沖區(qū)的方塊圖。
      [0013]圖7是根據(jù)本公開的各種方面的受保護(hù)的緩沖區(qū)的另外的方塊圖。
      [0014]圖8是根據(jù)本公開的各種方面的由DMA引擎執(zhí)行的示例方法的流程圖。
      [0015]圖9是根據(jù)本公開的各種方面的示例硬件指令的方塊圖。
      【具體實(shí)施方式】
      [0016]MM
      [0017]根據(jù)本說明書的一個方面,公開一種直接存儲器訪問(DMA)引擎,其包括經(jīng)配置以進(jìn)行以下操作的邏輯電路:接收定向到存儲器塊的DMA請求;開始DMA傳送;以及當(dāng)DMA傳送進(jìn)行時,更新與存儲器塊中的DMA傳送完成的部分相關(guān)聯(lián)的保護(hù)。
      [0018]根據(jù)本說明書的另一方面,一種處理器包括提供定向到存儲器塊的存儲器指令的電路,該指令經(jīng)配置以:測試與存儲器塊相關(guān)聯(lián)的保護(hù);如果設(shè)置保護(hù),那么停滯指令;和如果未設(shè)置保護(hù),那么:識別空閑的DMA通道;和將對存儲器塊的DMA請求發(fā)送到DMA引擎。
      [0019]根據(jù)本說明書的又一方面,公開一種計(jì)算機(jī)實(shí)施的方法,包括:接收定向到被尋址的存儲器區(qū)域的存儲器訪問請求;在存儲器區(qū)域上設(shè)置至少一個保護(hù);識別空閑存儲器通道來為存儲器訪問請求提供服務(wù);發(fā)起數(shù)據(jù)傳送來為存儲器訪問請求提供服務(wù);和在完成數(shù)據(jù)傳送的至少一部分之后,釋放與完成部分相關(guān)聯(lián)的保護(hù)。
      [0020]示例實(shí)施方案的詳細(xì)描述
      [0021]包括例如中央處理器(CPU)和數(shù)字信號處理器(DSP)的處理器持續(xù)速度和復(fù)雜性增大的速度比存儲器技術(shù)的速度大。由于增大的能力又意味著處理器可在單個時間增量中處理更多數(shù)據(jù),所以進(jìn)一步加劇了處理器速度與存儲器速度的明顯分歧。這可成為執(zhí)行的有用每秒操作(OPS)的數(shù)量的限制因素。例如,如果快速處理器依賴慢速存儲器,那么快速處理器的大部分時間可閑置,等待數(shù)據(jù)操作數(shù)寫入寄存器,或者等待舊的計(jì)算結(jié)果從寄存器寫出。另外,以處理器的速度運(yùn)行或接近處理器的速度運(yùn)行的存儲器可能比相對于處理器慢速的存儲器要貴幾個數(shù)量級。
      [0022]一個解決方案是提供一級或更多級本地、芯片上或靠近芯片的存儲器,諸如高速緩存或本地LI存儲器。本地存儲器以處理器的速度運(yùn)行或接近處理器的速度運(yùn)行,并因此從處理器的角度看來可幾乎立即提供數(shù)據(jù)。高速緩存持有在較慢主存儲器中具有原始位置的數(shù)據(jù)的副本,并提供表格來追蹤當(dāng)前在本地存儲器中的數(shù)據(jù)和它們與主存儲器中相同數(shù)據(jù)的一致性。因此,處理器可通過主存儲器地址來尋址數(shù)據(jù),但是如果副本存儲在本地存儲器中,那么就可從本地存儲器接收副本。在一些實(shí)施方案中,本地LI存儲器可為可直接尋址。
      [0023]存儲器體系結(jié)構(gòu)中影響性能的另一方面是數(shù)據(jù)放置。如果有關(guān)于數(shù)據(jù)如何在存儲器和處理器之間的路徑上移動的限制,那么可更有效地實(shí)施該路徑。例如,向量處理器的每個處理元件可被限制只訪問某些數(shù)據(jù),諸如具有特定地址對齊的那些數(shù)據(jù)。因此,如果數(shù)據(jù)是以特定方式排列,那么算法可更有效,特定方式可能不是簡單的線性塊。
      [0024]選擇數(shù)據(jù)加載到高速緩存或本地存儲器的任務(wù)可由獨(dú)立的硬件來處理,獨(dú)立的硬件使用某些已知算法來選擇存儲器以預(yù)加載,通常提取存儲器的大型相鄰塊,如常見于在相鄰塊上操作。然而,在高速緩存“缺失”的情況下,其中請求的數(shù)據(jù)還未預(yù)提取到高速緩存,處理器“停滯”,有時停滯多達(dá)幾十或幾百個時鐘周期,而有用數(shù)據(jù)從主存儲器提取。
      [0025]例如,可能很快又需要最近訪問的數(shù)據(jù)(時間局部性),且使用試探法來增大所需數(shù)據(jù)在高速緩存中的可能性,以提取尚未被訪問的項(xiàng)目(諸如提取鄰近請求的那些項(xiàng)目的項(xiàng)目(空間局部性))和對訪問模式的分析以預(yù)測后續(xù)訪問。
      [0026]在一些情況下,程序員可保持高速緩存操作為不可知。程序員只根據(jù)數(shù)據(jù)的主存儲器地址來尋址數(shù)據(jù),且數(shù)據(jù)移入和移出主存儲器完全由硬件管理。然而,在一些情況下,高速緩存空間將浪費(fèi)在無用數(shù)據(jù)上,且一些高速緩存缺失是不可避免的,從而導(dǎo)致處理器停滯。非顯式高速緩存控制器也不解決非線性數(shù)據(jù)放置的問題。[0027]替代性方法是使快速存儲器和慢速存儲器都可直接尋址并顯式編程直接存儲器訪問(DMA)控制器以傳送數(shù)據(jù)。具有算法知識的程序員可確保只將有用數(shù)據(jù)加載到本地存儲器,且確保當(dāng)需要時可獲得有用數(shù)據(jù)。一些DMA控制器也可被編程以在數(shù)據(jù)移動之后重組數(shù)據(jù),從而解決數(shù)據(jù)放置問題。
      [0028]非高速緩存或高速緩存加LI存儲器處理器可依賴DMA引擎來有效地把數(shù)據(jù)復(fù)制進(jìn)處理器的存儲器或從處理器的存儲器復(fù)制出來。一些DMA體系結(jié)構(gòu)未與處理器指令執(zhí)行同步(或者最多松散匹配),并因此難以編程,使得數(shù)據(jù)剛好及時到達(dá)(或?qū)懗?。由于DMA引擎是與核心并行有效操作的獨(dú)立的處理器,所以可安排數(shù)據(jù)移動以免在核心使用存儲器先前重寫核心需要的存儲器,且反之亦然。
      [0029]稱為寬向量處理器的另一類處理器可在靜態(tài)排程、可預(yù)測循環(huán)代碼中最有效地執(zhí)行,從而可有效地消耗并產(chǎn)生長的相鄰向量。與通用PC不同,向量處理器常被編程以只進(jìn)行小部分固定的、重復(fù)的任務(wù)。作為傳統(tǒng)高速緩存的替代或補(bǔ)充,向量處理器可依賴本地“LI”存儲器。向量處理器的數(shù)據(jù)緩沖區(qū)也可不以相鄰向量的形式組織在LI存儲器的外部。
      [0030]根據(jù)本公開的某些方面,顯式預(yù)提取機(jī)制可由用戶或編譯器編程。特別說來,本公開的一個實(shí)施方案提供一種處理器體系結(jié)構(gòu)和方法,以通過顯式可編程、異步、基于DMA的數(shù)據(jù)預(yù)提取器來最小化最壞情況的等待時間;促進(jìn)DMA控制器編程的基于指令的方法;以及使DMA傳送與核心同步。另外,所公開的DMA控制器可具有足夠的尋址復(fù)雜性來啟用從非單位步長存儲器到處理器的本地LI存儲器的有效映射。
      [0031]另外,根據(jù)本公開的某些方面,處理器體系結(jié)構(gòu)促進(jìn)DMA數(shù)據(jù)移動與處理核心的同步。例如,如下文進(jìn)一步描述,公開一種將顯式同步數(shù)據(jù)預(yù)加載/后存儲到指令級處理器的方法,且該方法可用“原語”實(shí)施。這個上下文中的原語是指可用以結(jié)合其它原語或更高級操作來構(gòu)建更高級操作且以非限制性實(shí)例的方式可為用戶可訪問硬件指令、作為另一硬件指令的部分執(zhí)行的用戶不可訪問操作、用戶可訪問軟件程序或作為不同用戶可訪問軟件程序的部分執(zhí)行的用戶不可訪問軟件程序的基本或原語操作。該方法可通過將一個或更多個DMA通道用于支持處理器級存儲器(諸如LI存儲器)來實(shí)現(xiàn)。在示例實(shí)施方案中,DMA通道與處理器加載/存儲單元共享硬件互鎖,并與數(shù)據(jù)高速緩存共享大量硬件。一個或更多個處理器指令可向DMA通道提供有效的通信。另外,尤其對于向量處理,DMA通道可將復(fù)雜的甚至非單位步長/分散-集中尋址模式映射到處理器的LI存儲器中的連續(xù)向量緩沖區(qū)區(qū)域或從連續(xù)向量緩沖區(qū)區(qū)域映射復(fù)雜的甚至非單位步長/分散-集中尋址模式。特別說來,如下文進(jìn)一步描述,本公開提供某些示例實(shí)施方案,以非限制性實(shí)例的方式包括:
      [0032]a.與簡單發(fā)布將異步完成的存儲器請求的核心同步執(zhí)行的MEMCPY原語;
      [0033]b.存儲器(例如,LI存儲器)上的保護(hù)位,或其它替代性的保護(hù),諸如比較器;
      [0034]c.當(dāng)設(shè)置保護(hù)位時的處理器讀取或?qū)懭氩僮魍?br> [0035]d.設(shè)置或清除保護(hù)位的MEMCPY原語;
      [0036]e.當(dāng)讀取或?qū)懭胛恢脮r設(shè)置或清除保護(hù)位的異步存儲器傳送;
      [0037]f.具有步長模式的MEMCPY型原語(即,二維(2d) DMA);和
      [0038]g.不具有步長模式的MEMCPY型原語(SP,一維(Id) DMA)。
      [0039]現(xiàn)參看附圖,圖1是根據(jù)本公開的示例實(shí)施方案的數(shù)字信號處理系統(tǒng)100的方塊圖。在圖1中,系統(tǒng)總線220判定若干子系統(tǒng)之間的通信,子系統(tǒng)例如包括核心300、本地LI存儲器120、DMA引擎212、主存儲器320和I/O設(shè)備310。DMA引擎212經(jīng)配置將數(shù)據(jù)(諸如操作數(shù))從主存儲器320 (或某個其它I/O設(shè)備310)傳送到LI存儲器120。核心300操作這些數(shù)據(jù)以在LI存儲器120中產(chǎn)生結(jié)果,以及然后DMA引擎212將結(jié)果傳送到主存儲器320 或 I/O 設(shè)備 310。
      [0040]圖2是根據(jù)本公開的各種方面的存儲器子系統(tǒng)200的示意方塊圖。存儲器子系統(tǒng)200與核心300通信并與系統(tǒng)總線220通信,核心300可包括一個或更多個處理元件。存儲器子系統(tǒng)200包括本地LI存儲器120、包括DMA通道210的DMA引擎212,且在一些實(shí)施方案中,存儲器子系統(tǒng)200可為特別專用于為計(jì)算陣列130的處理元件PE提供服務(wù)(圖3)的DMA引擎,或者可包括特別專用于相同目的的DMA通道。存儲器子系統(tǒng)200可通過系統(tǒng)總線220與輸入/輸出(I/O)設(shè)備310、其它設(shè)備或它們的組合互連。本地LI存儲器120可為在一些實(shí)施方案中與計(jì)算陣列130集成在單一芯片上的快速的小存儲器,而主存儲器320 (圖1)可為較大的相對慢速芯片外存儲器。然而,本領(lǐng)域那些技術(shù)人員將認(rèn)識到,已知且常使用存儲器的其它組合和配置。
      [0041]提供DMA引擎212來在數(shù)字信號處理系統(tǒng)100的各種設(shè)備之間直接傳送數(shù)據(jù)(圖1)。在一個實(shí)施方案中,LI存儲器120和主存儲器320 (圖1)都可直接尋址,使得程序員可顯式編程DMA引擎212來在系統(tǒng)組件之間傳送數(shù)據(jù)。
      [0042]在示例實(shí)施方案中,DMA引擎212能夠訪問多個DMA通道210。在操作中,如下文進(jìn)一步描述,示例MEMCPY原語發(fā)布DMA請求,且DMA引擎212尋找空閑的DMA通道210。如果沒有通道空閑,那么DMA引擎212提供“DMA阻塞”信號以警告核心300 (圖3)沒有DMA通道可用。一旦通道變得可用,那么DMA引擎212提供“DMA非阻塞”。為了提供DMA請求例如作為MEMCPY原語的部分,核心300可將源起始地址、目標(biāo)起始地址、源結(jié)束地址和目標(biāo)結(jié)束地址寫到通道的寄存器214,并然后終止原語。
      [0043]DMA引擎212以循環(huán)方式為有效DMA通道210提供服務(wù),從而執(zhí)行來自源起始地址的單傳送并然后在移到下一通道之前增量起始寄存器中的地址。一旦起始地址增量超過對應(yīng)的結(jié)束地址,那么DMA通道就空閑下來供后來的MEMCPY原語再使用。在其它實(shí)施方案中,可使用在通道之間判定的其它方法,諸如為最久以前完成傳送的通道提供服務(wù)或隨意選擇通道。
      [0044]示例保護(hù)機(jī)制可由比較器230提供。例如,當(dāng)核心300執(zhí)行加載指令時,它的地址被與所有目標(biāo)起始和結(jié)束地址作比較,且如果它落入任何范圍,那么停滯加載直到起始地址增量到超過加載指令的地址。類似地,當(dāng)存儲指令的地址落入任何源范圍時,停滯存儲指令。
      [0045]圖3是根據(jù)本公開的各種方面的示例數(shù)字信號處理器(DSP)核心300的示意方塊圖,示出了相對于核心300原位置的LI存儲器120。為達(dá)到清楚的目的且為了更好地理解本公開的一些新穎概念,簡化了圖1。可添加另外的特征到300或整體DSP系統(tǒng)100,且下文描述的一些特征可在DSP300的其它實(shí)施方案中被更換或消除。另外,DSP系統(tǒng)100只是作為可受益于本公開的處理器的一個示例實(shí)施方案而提供的??墒褂冒ㄖ醒胩幚韱卧推渌删幊淘O(shè)備的其它類型的處理器,且廣義上,本說明書的公開內(nèi)容可結(jié)合符合已知馮諾依曼結(jié)構(gòu)的任何機(jī)器使用。
      [0046]核心300可包括通過互連網(wǎng)絡(luò)144通信地耦合到LI存儲器120的控制單元110和計(jì)算陣列130。在實(shí)例中,計(jì)算陣列130包括可執(zhí)行計(jì)算和數(shù)據(jù)處理功能的多個處理元件PE0核心300的一些實(shí)施方案可包括其它組件,諸如用于執(zhí)行微控制器指令的微控制器、直接存儲器訪問(DMA)單元和到芯片外設(shè)備的各種接口。另外,雖然存儲器120在這里示出為LI存儲器的單個邏輯塊,但是本領(lǐng)域那些技術(shù)人員將認(rèn)識到,存儲器120可包括系統(tǒng)主存儲器、各種等級的芯片上高速緩存和/或其它易失性或非易失性存儲器技術(shù)。為達(dá)到這個示例實(shí)施方案的目的,存儲器120被視為非高速緩存本地LI存儲器,且主存儲器320被視為相對低速主系統(tǒng)存儲器。
      [0047]控制單元110促進(jìn)程序在核心300上執(zhí)行。控制單元110可包括算術(shù)邏輯單元和數(shù)據(jù)地址生成(ALU-DAG)單元112、程序定序器114和程序存儲器116??刂茊卧?10也可包括其它組件,諸如指令高速緩存、計(jì)時器和指令寄存器。ALU-DAG單元112支持通用整數(shù)運(yùn)算并提供地址作為存儲器地址。例如,當(dāng)在LI存儲器120和寄存器(諸如下文描述的計(jì)算陣列130的寄存器堆)之間傳送數(shù)據(jù)時,ALU-DAGl 12提供存儲器地址。ALU-DAG單元112可向數(shù)據(jù)存儲器(例如,LI存儲器120或主存儲器320)和/或程序存儲器116提供地址。程序定序器114向程序存儲器116提供指令地址以進(jìn)行指令提取。程序存儲器116存儲核心300實(shí)施以處理數(shù)據(jù)的程序(諸如存儲在存儲器120中的程序),且也可存儲過程數(shù)據(jù)。程序包括具有一個或更多個指令的指令集,且核心300通過提取指令、解碼指令并執(zhí)行指令來實(shí)施程序。在實(shí)例中,程序可包括實(shí)施各種DSP算法的指令集。
      [0048]LI存儲器120存儲將由核心300處理的信息/數(shù)據(jù)(數(shù)據(jù)存儲器)、由核心300實(shí)施以處理信息/數(shù)據(jù)的程序(程序存儲器)或它們的組合。在所描繪的實(shí)施方案中,LI存儲器120具有多個組塊化交織的存儲器結(jié)構(gòu),使得存儲器120包括存儲器組塊M1、M2、M3……Mn,其中n是LI存儲器120的存儲器組塊的總數(shù)。在實(shí)例中,LI存儲器120是隨機(jī)存取存儲器,諸如靜態(tài)隨機(jī)存取存儲器(SRAM)、動態(tài)RAM (DRAM)、快閃或其它適當(dāng)?shù)拇鎯ζ骷夹g(shù)。在實(shí)例中,一個或更多個存儲器組塊M是獨(dú)立的RAM?;蛘?,在各種實(shí)施中,LI存儲器120是另一適當(dāng)類型的存儲`器。
      [0049]互連網(wǎng)絡(luò)140、142和144與控制單元110、LI存儲器120和計(jì)算陣列130互連,從而在控制單元110、存儲器120和計(jì)算陣列130之間提供通信路徑。互連網(wǎng)絡(luò)140、互連網(wǎng)絡(luò)142和互連網(wǎng)絡(luò)144可包括單根總線、多根總線、交叉矩陣網(wǎng)絡(luò)、單級網(wǎng)絡(luò)、多級網(wǎng)絡(luò)、其它類型的互連網(wǎng)絡(luò)或它們的組合??刂茊卧?10通過互連網(wǎng)絡(luò)142發(fā)布指令和數(shù)據(jù)地址到計(jì)算陣列130?;ミB網(wǎng)絡(luò)142因此通過互連網(wǎng)絡(luò)142把指令和數(shù)據(jù)的地址傳送到計(jì)算陣列130的各種處理元件PE?;ミB網(wǎng)絡(luò)144傳送來自存儲器(諸如LI存儲器120、程序存儲器116、其它存儲器或它們的組合)的數(shù)據(jù)和/或指令,使得核心300中任何寄存器的內(nèi)容可傳送到任何其它寄存器或任何存儲器位置,且存儲器120可提供數(shù)據(jù)操作數(shù)(值)到計(jì)算陣列。
      [0050]在一些實(shí)施方案中,計(jì)算陣列130包括多個處理元件PE1、PE2、PE3……PEN,其中N是計(jì)算陣列的處理元件的總數(shù)。在實(shí)例中,計(jì)算陣列110可包括四個處理元件(PE1、PE2、PE3和PE4)。處理元件PE執(zhí)行DSP算法的數(shù)值處理。處理元件PE可獨(dú)立操作、并行操作或作為SMD引擎操作。在本實(shí)例中,每個處理元件PE可為向量處理器?;蛘撸幚碓E可為標(biāo)量處理器和向量處理器的組合。
      [0051]處理元件PE每個都包括各自的計(jì)算單元(⑶)152。在所描繪的實(shí)施方案中,計(jì)算單元152可相同,但是本公開考慮計(jì)算單元152不相同的實(shí)施方案。本公開還考慮一個或更多個處理元件PE不包括計(jì)算單元152的配置。在本實(shí)例中,計(jì)算單元152每個都包括算術(shù)邏輯單元(ALU)、乘法累加器(MAC)、移位器、其它計(jì)算單元或它們的組合。ALU可執(zhí)行算術(shù)及邏輯運(yùn)算,諸如加、減、求反、遞增、遞減、絕對值、與、或、異或、非、除法原語、其它算術(shù)運(yùn)算、其它邏輯運(yùn)算或它們的組合。示例MAC可執(zhí)行乘法運(yùn)算以及乘法和累加運(yùn)算,諸如單周期乘法、乘法/加法、乘法/減法、其它運(yùn)算或它們的組合。移位器可執(zhí)行邏輯和算術(shù)移位、位操作、規(guī)格化、去規(guī)格化、指數(shù)求導(dǎo)運(yùn)算、其它運(yùn)算或它們的組合。各種算術(shù)運(yùn)算、邏輯運(yùn)算和其它運(yùn)算可用定點(diǎn)和浮點(diǎn)格式執(zhí)行。在各種實(shí)施方案中,ALU、MAC和/或移位器包括與之相關(guān)的寄存器。
      [0052]處理元件PE也可每個都包括各自的寄存器堆154。在所描繪的實(shí)施方案中,寄存器堆154可相同,但是本公開考慮寄存器堆154不相同的實(shí)施方案。本公開還考慮一個或更多個處理元件PE不包括寄存器堆154的配置。寄存器堆154包括在處理元件PE和數(shù)據(jù)互連網(wǎng)絡(luò)(例如,互連網(wǎng)絡(luò)144)之間傳送數(shù)據(jù)并存儲結(jié)果的寄存器。在本實(shí)例中,寄存器堆154可包括各自的通用寄存器組155,通用寄存器組155包括寬度依賴于核心300的設(shè)計(jì)需要的通用寄存器,諸如32位通用寄存器、40位通用寄存器、64位通用寄存器、128位通用寄存器、其它寬度通用寄存器或它們的組合。為達(dá)到以下討論的目的,通用寄存器155包括32位通用寄存器。
      [0053]核心300可經(jīng)配置以執(zhí)行各種并行操作。例如,在單循環(huán)期間,處理元件PE可訪問指令(通過互連網(wǎng)絡(luò)142)并從存儲器訪問N個數(shù)據(jù)操作數(shù)(通過互連網(wǎng)絡(luò)144)以進(jìn)行同步處理。在SMD模式下,核心300可并行處理多個數(shù)據(jù)流。例如,當(dāng)在SMD模式下時,單循環(huán)中的核心300可通過互連網(wǎng)絡(luò)142把單指令分派給每個處理元件PE或多個處理元件PE ;通過互連網(wǎng)絡(luò)144從存儲器(存儲器120、程序存儲器116、其它存儲器或它們的組合)加載N個數(shù)據(jù)集,每個處理元件PE —個數(shù)據(jù)集(在實(shí)例中,每個數(shù)據(jù)集可包括兩個數(shù)據(jù)操作數(shù));在處理元件PE中同步執(zhí)行單指令;和把來自同步執(zhí)行的數(shù)據(jù)結(jié)果存儲在存儲器120中。
      [0054]圖4示出根據(jù)本公開的各種方面的可在核心300操作期間產(chǎn)生的示例數(shù)據(jù)流。這個操作可通過在LI存儲器120中分配多個緩沖區(qū)來優(yōu)化,使得DMA引擎212傳送和核心操作可并行發(fā)生,其中LI存儲器120包括多個緩沖區(qū)(例如,如圖5示出,四個緩沖區(qū)(緩沖區(qū)1、緩沖區(qū)2、緩沖區(qū)3和緩沖區(qū)4))。圖4的方塊圖示出整體數(shù)據(jù)流,其中DMA引擎212把數(shù)據(jù)直接從主存儲器120傳送到LI緩沖區(qū)1120-1。同時,DMA引擎212可能能夠處理從LI存儲器緩沖區(qū)120-2到主存儲器120的寫入。
      [0055]例如,如圖5所見,在第一時間段^中,核心300可從緩沖區(qū)510-1讀取數(shù)據(jù)(操作數(shù))且把結(jié)果寫入緩沖區(qū)510-2,而DMA緩沖區(qū)210-1傳送來自緩沖區(qū)3510-3的結(jié)果(先前由核心300計(jì)算),且另一 DMA緩沖區(qū)210-2把未來數(shù)據(jù)(供核心300計(jì)算)傳送到緩沖區(qū)4510-4 (圖5)。這由以下偽代碼示出:
      [0056]for (時間 tl) {
      [0057]緩沖區(qū)_1 (操作數(shù))一核心(結(jié)果)一緩沖區(qū)_2 ;
      [0058]緩沖區(qū)3 (先前結(jié)果)一DMA引擎_1—主存儲器;
      [0059]主存儲器(未來操作數(shù))一DMA引擎_2 —緩沖區(qū)_4);
      [0060]}[0061]一旦這些活動結(jié)束,緩沖區(qū)可切換且過程再次啟動。例如:
      [0062]for (時間 t2){
      [0063]緩沖區(qū)_4 (操作數(shù))一核心(結(jié)果)一緩沖區(qū)_1 ;
      [0064]緩沖區(qū)2 (先前結(jié)果)一DMA引擎_1—主存儲器;
      [0065]主存儲器(未來操作數(shù))一DMA引擎_2 —緩沖區(qū)_3);
      [0066]}
      [0067]在第三時間段期間,緩沖區(qū)可再次切換如下:
      [0068]for (時間 t3) {
      [0069]緩沖區(qū)_3 (操作數(shù))一核心(結(jié)果)一緩沖區(qū)_4 ;
      [0070]緩沖區(qū)_1(先前結(jié)果)一DMA引擎_1—主存儲器;
      [0071]主存儲器(未來數(shù)據(jù))一DMA引擎_2 —緩沖區(qū)_2);
      [0072]}
      [0073]編程這個并行活動的一個困難是使核心300和DMA緩沖區(qū)210同步。為了解決這個困難,可顯式編碼DMA引擎212以確保DMA引擎212寫入的數(shù)據(jù)在核心300試圖讀取數(shù)據(jù)之前可用,且確保核心300寫入的數(shù)據(jù)在DMA引擎212試圖讀取數(shù)據(jù)之前可用。有天賦的程序員可理論預(yù)測每個處理固定量的數(shù)據(jù)所花費(fèi)的最大和最小時間,并在兩者之間安排足夠的延遲以確保閱讀器追不上寫入器。然而,隨著系統(tǒng)發(fā)展,基于原始計(jì)算的假設(shè)可失效。
      [0074]如圖6示出,一種確保存儲器緩沖區(qū)能力的示例方法實(shí)施軟件握手,使得核心300和DMA引擎212都知道一個何時完成寫入,這樣另一個就可以開始閱讀了。
      [0075]然而,如圖7示出,本公開的示例實(shí)施方案添加了保護(hù)610(諸如保護(hù)位、比較器或類似標(biāo)記機(jī)制)以促進(jìn)核心300和DMA引擎210之間的同步。這可使得能夠進(jìn)行安全存儲器操作,同時消耗比圖6示出的軟件握手體系結(jié)構(gòu)所需要的更少的存儲器緩沖區(qū)510。保護(hù)610阻止核心300訪問存儲器緩沖區(qū)510中DMA引擎212正使用的部分。當(dāng)存儲器操作開始時,整個存儲器緩沖區(qū)510被保護(hù),且隨著傳送進(jìn)行,所保護(hù)區(qū)域被減小到只有存儲器緩沖區(qū)510中留待處理的部分。在一些實(shí)施方案中,被保護(hù)的存儲器傳送可被稱為“受保護(hù)傳送”。
      [0076]因此,根據(jù)一些實(shí)施方案,如圖7示出的,核心300和DMA引擎212可安全使用相同緩沖區(qū)510。在圖7中,核心300把結(jié)果寫入存儲器緩沖區(qū)510-3,同時DMA引擎212把結(jié)果傳送出去到DMA緩沖區(qū)210-1,以及核心300從存儲器緩沖區(qū)510-4讀取操作數(shù),同時DMA引擎212把數(shù)據(jù)傳送到DMA緩沖區(qū)210-2。
      [0077]在本公開的一個特定實(shí)施方案中,一組保護(hù)位610被添加到LI存儲器120,使得每個保護(hù)位610與LI存儲器120的某一數(shù)量的字節(jié)相關(guān)。也可添加原語以發(fā)起批量數(shù)據(jù)傳送。例如,本公開提出發(fā)起把指定大小的數(shù)據(jù)塊從外部地址(例如,從主存儲器320)傳送到LI存儲器120中的地址的“存儲器拷貝入”(MEMCPY_IN)原語:
      [0078]MEMCPY_IN(address_in_Ll, external_address, size)
      [0079]也添加“存儲器拷貝出”(MEMCPY_0UT)原語以發(fā)起把指定大小的數(shù)據(jù)塊從LI存儲器120中的地址傳送到外部地址(例如,在主存儲器120中):
      [0080]MEMCPY_0UT(address_in_Ll, external_address, size)
      [0081]本領(lǐng)域那些技術(shù)人員將認(rèn)識到,根據(jù)本發(fā)明實(shí)施方案的MEMCPY原語不需要具有專用名MEMCPY或者與本文公開的示例原語相同。
      [0082]圖8是從DMA引擎212的角度看來示例MEMCPY方法的流程圖。始于塊800,在塊810,DMA引擎212接收定向到存儲器塊的存儲器訪問請求,包括例如起始地址、字長或數(shù)據(jù)串大小和傳送的若干字,這些都根據(jù)本領(lǐng)域已知的方法。在塊830,DMA引擎212檢查空閑的DMA通道210。如果沒有空閑的DMA通道210,那么在塊840,DMA引擎212設(shè)置DMA阻塞,DMA阻塞通知核心300不可啟動DMA操作直到DMA通道210清空為止。一旦發(fā)現(xiàn)空閑的DMA通道,那么在塊850就設(shè)置DMA非阻塞。
      [0083]在塊860,DMA引擎212發(fā)起DMA傳送,在塊870,DMA傳送以部分傳送開始,意指所請求的存儲器操作的第一部分完成。例如,如果DMA請求是從存儲器加載四個字,那么DMA引擎212可在第一時鐘周期上完成加載第一字。在塊882,DMA引擎212然后可清除與第一字相關(guān)聯(lián)的任何保護(hù),諸如與第一字相關(guān)聯(lián)的保護(hù)位。保護(hù)位用作示例保護(hù)機(jī)制,但是可使用本說明書中公開的任何保護(hù),且本領(lǐng)域那些技術(shù)人員將認(rèn)識到其它可能性的保護(hù)機(jī)制。另外,雖然本實(shí)施方案“清除”保護(hù),但是本領(lǐng)域那些技術(shù)人員將認(rèn)識到可用指示存儲器區(qū)域已可用的各種方式來更新保護(hù)。
      [0084]在清除保護(hù)位之后,在決定塊880,DMA引擎212檢查全塊存儲器訪問是否已完成。如果未完成,那么方法返回到塊870以傳送所請求的存儲器的下一部分。如果完成了,那么在塊890,DMA終止。
      [0085]圖9是從核心300的角度看來用于執(zhí)行存儲器加載和存儲操作的示例方法的流程圖。當(dāng)DMA引擎212繼續(xù)為先前的存儲器請求提供服務(wù)時,可執(zhí)行該方法,且該方法可執(zhí)行作為MEMCPY原語的部分或結(jié)合MEMCPY原語執(zhí)行。明確的目的是把某些操作結(jié)合到一起考慮,即使核心300經(jīng)配置把這些操作視為獨(dú)立的指令或原語。例如,核心300可提供獨(dú)立的MEMCPY原語,以如上文所述分開設(shè)置保護(hù)位,同時加載和存儲原語是分開提供的。然而,在替代性實(shí)施方案中,加載和存儲原語自身可經(jīng)配置以設(shè)置保護(hù)位而不實(shí)質(zhì)改變本文公開的方法的精神。
      [0086]始于塊900,在塊910,核心300發(fā)布讀(“加載”)或?qū)?“存儲”)訪問請求。在塊920,核心300檢查是否看到有保護(hù)設(shè)置在請求的存儲器塊上。如果所請求塊的全部或部分被保護(hù),那么MEMCPY指令停滯且在塊930進(jìn)入等待狀態(tài)。一旦所請求存儲器區(qū)域的保護(hù)位被清除,那么在塊960,核心300就發(fā)布可定向到DMA引擎212的塊存儲器訪問請求。在發(fā)布DMA請求之后,在塊970,MEMCPY原語可終止而不用等待DMA引擎212完成存儲器操作。
      [0087]MEMCPY原語的其它實(shí)施方案可具有例如以二維DMA的方式指定通過外部或內(nèi)部存儲器的步長的附加參數(shù)。
      [0088]在其他實(shí)施方案中也可提供替代性保護(hù)方法。例如,在來自核心300的訪問請求之后,所請求地址可使用比較器(如圖2示出)直接與有效MEMCPY操作的范圍作比較。這個方法把MEMCPY原語限制為簡單的塊數(shù)據(jù)操作,但也包括發(fā)起階段上的較小延遲。這也可允許LI存儲器120外面的區(qū)域被保護(hù)。
      [0089]在又一實(shí)施方案中,通過用以確保到快速存儲器的數(shù)據(jù)傳送的完整性的標(biāo)準(zhǔn)硬件握手協(xié)議來使閱讀器停滯。例如,通過先進(jìn)可擴(kuò)展接口(AXI)從屬端口讀取LI存儲器120的DMA控制器212可通過在指示已接受地址的從屬斷言ARREADY和指示數(shù)據(jù)可用的斷言RVALID之間的潛在較長的延遲來停滯。[0090]停滯DMA引擎120 (或核心300)可能是不可接受的。因此,根據(jù)本發(fā)明的另一實(shí)施方案,硬件標(biāo)志在VSTORE事件之后產(chǎn)生DMA引擎212的中斷,VSTORE事件發(fā)起存儲器事務(wù)而不是盲目地發(fā)起傳送和停滯,如圖9示出。在處理器側(cè),標(biāo)志狀態(tài)轉(zhuǎn)換可發(fā)起快速線程交換(在硬件線程處理器的情況下)。如果允許多個DMA通道210,那么這個實(shí)施方案需要把有效位映射到DMA通道210中斷的機(jī)制。
      [0091]根據(jù)本公開的某些實(shí)施方案,由于向量緩沖區(qū)的閱讀器和寫入器自動保持同步,所以程序員可把DMA增量地引入他們的應(yīng)用。例如,當(dāng)開發(fā)應(yīng)用時,可在循環(huán)持續(xù)時間向緩沖區(qū)分配對齊約束,且只有當(dāng)應(yīng)用工作時,才調(diào)整緩沖區(qū)的壽命以最大化核心300和DMA引擎212的并行操作。即使在調(diào)諧應(yīng)用之后,如果在異常系統(tǒng)狀態(tài)下閱讀器追得上寫入器,那么保護(hù)位610也確保正確的操作。
      [0092]根據(jù)本公開的各種實(shí)施方案,MEMCPY原語可用軟件實(shí)施且通過API訪問,或用硬件實(shí)施且通過硬件指令訪問。
      [0093]在本公開的另一示例實(shí)施方案中,也可添加使目標(biāo)范圍歸零的MEMZER0原語。
      [0094]在本公開的又一示例實(shí)施方案中,添加硬件隊(duì)列以保護(hù)傳送,使得可使若干受保護(hù)傳送排隊(duì),且每個傳送將以先進(jìn)先出(FIFO)順序完成。如果當(dāng)隊(duì)列滿時發(fā)布MEMCPY,那么MEMCPY將被停滯。
      [0095]如果在停滯期間發(fā)生中斷,如果MEMCPY原語正在等待先前的MEMCPY原語完成,那么MEMCPY原語可停滯無法接受的長時間。在示例實(shí)施方案中,為了不無限期地延遲中斷,MEMCPY原語經(jīng)配置處理中斷。特別說來,因?yàn)镸EMCPY原語不開始執(zhí)行,所以在中斷處理完成之后,中斷機(jī)制將返回到MEMCPY原語并重新執(zhí)行MEMCPY原語。
      [0096]在又一示例實(shí)施方案中,當(dāng)隊(duì)列空時,MEMCPY原語可斷言中斷位。可屏蔽中斷位,使得不實(shí)際發(fā)生中斷。也可添加等待指令以停滯,直到斷言特定中斷位為止。這可被其它未屏蔽中斷搶占,但在中斷處理完成之后,它將返回到等待。只有指定中斷將使等待指令完成。
      [0097]在又一示例實(shí)施方案中,添加超時計(jì)數(shù)器控制寄存器,使得不良傳送不會引起無限等待。這個示例寄存器可只在等待指令有效時計(jì)數(shù)。在例如3,000周期的某一閾值時間之后,寄存器可經(jīng)配置迫使等待進(jìn)入關(guān)閉狀態(tài)。
      [0098]在又一示例實(shí)施方案中,可用保護(hù)LI高速緩存120中的緩沖區(qū)510的“有效”或“臟”位來實(shí)施等待。每當(dāng)數(shù)據(jù)寫入緩沖區(qū)510就可設(shè)置臟位以指示已修改緩沖區(qū)510。在排隊(duì)DMA請求之后,示例MEMCPY原語也可把目標(biāo)緩沖區(qū)510標(biāo)記為失效或“臟”。一旦DMA引擎212把數(shù)據(jù)移入緩沖區(qū)510的部分或從緩沖區(qū)510的部分移出,它就把緩沖區(qū)510標(biāo)記為有效或“干凈”。
      [0099]在又一示例實(shí)施方案中,MEMCPY原語和DMA傳送可經(jīng)配置以在可高速緩存存儲器區(qū)域操作。這可能需要例如與高速緩存控制器互動以獲取一個或更多個高速緩存行的所有權(quán)。然后可合成保護(hù)位以使核心300和DMA引擎212根據(jù)回寫高速緩存控制器的“標(biāo)準(zhǔn)”有效和臟位同步。標(biāo)準(zhǔn)位可具有包括以下的定義:
      [0100]a.失效:這一行并非邏輯上在高速緩存中。讀取(由DMA引擎212或核心300讀取)應(yīng)停滯直到這一行被標(biāo)記為有效。
      [0101]b.有效:數(shù)據(jù)可供讀取,且該行不需回寫到存儲器。[0102]有效和臟狀態(tài)都暗示該行不能“終止”。該行應(yīng)在改變狀態(tài)之前回寫到主存儲器。
      [0103]如果DMA引擎212把數(shù)據(jù)移到高速緩沖存儲器,即,寫到緩沖區(qū),那么它就應(yīng)與高速緩存控制器互動以在核心300試圖例如通過加載指令首先訪問存儲器地址時阻止控制器疏忽試圖把該行填充。在完成DMA寫入緩沖區(qū)的高速緩存行部分之后,可設(shè)置有效位(因此,解決停滯狀態(tài),使得到該高速緩存行區(qū)域的加載指令將進(jìn)行)。
      [0104]如果DMA引擎212把數(shù)據(jù)從高速緩存移到主存儲器320,那么它可能需要與高速緩存控制器通信以控制映射到緩沖區(qū)的行。DMA引擎212然后可等待緩沖區(qū)區(qū)域的每個高速緩存行被標(biāo)記為有效和臟,如高速緩存控制邏輯電路在來自核心300的寫操作之后所設(shè)置。在完成DMA從高速緩存寫入主存儲器320之后,DMA引擎212然后可清除有效和臟位。
      [0105]根據(jù)又一實(shí)施方案,LI高速緩存訪問和失效數(shù)據(jù)的核心讀取停滯,直到設(shè)置有效位為止。寫入臟區(qū)域也延遲,直到DMA引擎212把它們標(biāo)記為干凈。有利地,臟位的使用啟用與標(biāo)準(zhǔn)C “memcpy () ”調(diào)用具有相同語義的MEMCPY原語,所以代碼可用便攜式方式寫入。
      [0106]在又一實(shí)施方案中,LI存儲器中的雙緩沖程序由以下代碼表示,其中有一個輸入緩沖區(qū)((1以111_131^€61'0)和一個輸出緩沖區(qū)(dram_buffer I),其中a和b是LI存儲器中的兩個緩沖區(qū)。這個代碼進(jìn)行了至少三次傳輸,其中第一次預(yù)提取輸入,中間的一次進(jìn)行工作,且最后一次保存最終輸出。
      [0107]
      【權(quán)利要求】
      1.一種直接存儲器訪問(DMA)引擎,其包括經(jīng)配置以進(jìn)行以下操作的邏輯電路: 接收定向到存儲器塊的DMA請求; 開始DMA傳送;以及 當(dāng)所述DMA傳送進(jìn)行時,更新與所述存儲器塊中的所述DMA傳送完成的部分相關(guān)聯(lián)的保護(hù)。
      2.如權(quán)利要求1所述的DMA引擎,其中所述邏輯電路還經(jīng)配置以: 在接收所述DMA請求之后: 提供DMA阻塞信號; 識別空閑的DMA通道;以及 在識別空閑的DMA通道之后,提供DMA未阻塞信號。
      3.如權(quán)利要求1所述的DMA引擎,其中更新所述保護(hù)包括清除保護(hù)位。
      4.如權(quán)利要求3所述的DMA引擎,其中所述保護(hù)位也充當(dāng)高速緩沖存儲器的臟位或無效位。
      5.如權(quán)利要求1所述的DMA引擎,其中更新所述保護(hù)包括改變界定受保護(hù)的存儲器塊的保存界限的緩沖區(qū),使得所述緩沖區(qū)不包括存儲器中已被傳送的部分。
      6.如權(quán)利要求1所述的DMA引擎,還包括用于處理多個DMA請求的隊(duì)列,其中所述隊(duì)列以先進(jìn)先出順序操作。`
      7.如權(quán)利要求1所述的DMA引擎,還經(jīng)配置以自動重新排序包括非單位步長向量的數(shù)據(jù)。
      8.一種包括提供定向到存儲器塊的存儲器指令的電路的處理器,所述指令經(jīng)配置以: 測試與所述存儲器塊相關(guān)聯(lián)的保護(hù); 如果設(shè)置所述保護(hù),那么停滯所述指令;以及 如果未設(shè)置所述保護(hù),那么: 識別空閑的DMA通道;以及 將對所述存儲器塊的DMA請求發(fā)送到DMA引擎。
      9.如權(quán)利要求8所述的處理器,其中所述處理器經(jīng)配置以在發(fā)送所述DMA請求之后終止所述指令。
      10.如權(quán)利要求8所述的處理器,其中所述保護(hù)包括保護(hù)位。
      11.如權(quán)利要求10所述的處理器,其中設(shè)置所述保護(hù)包括設(shè)置多個保護(hù)位,其中所述保護(hù)位中每一個與所述存儲器塊的部分相關(guān)聯(lián)。
      12.如權(quán)利要求8所述的處理器,其中所述保護(hù)包括識別使用中的存儲器塊的地址范圍的緩沖區(qū),且其中測試所述保護(hù)包括將所述請求的存儲器塊與所述使用中的存儲器塊的所述地址范圍比較。
      13.如權(quán)利要求8所述的處理器,其中設(shè)置保護(hù)包括使用標(biāo)準(zhǔn)硬件握手協(xié)議。
      14.如權(quán)利要求8所述的處理器,其中所述處理器被配置成在發(fā)起所述DMA傳送之后: 不禁用中斷; 發(fā)布啟動狀態(tài)機(jī)的第一指令;以及 發(fā)布可中斷的且等待所述狀態(tài)機(jī)完成的第二指令。
      15.如權(quán)利要求8所述的處理器,其中所述存儲器指令是經(jīng)配置以將數(shù)據(jù)從所述存儲器塊傳送到所述處理器的加載指令。
      16.如權(quán)利要求8所述的處理器,其中所述存儲器指令是經(jīng)配置以將數(shù)據(jù)從所述處理器傳送到所述存儲器塊的存儲指令。
      17.—種計(jì)算機(jī)實(shí)施的方法,其包括: 接收定向到被尋址的存儲器區(qū)域的存儲器訪問請求; 在所述存儲器區(qū)域上設(shè)置至少一個保護(hù); 識別空閑存儲器通道來為所述存儲器訪問請求提供服務(wù); 發(fā)起數(shù)據(jù)傳送來為所述存儲器訪問請求提供服務(wù);以及 在完成所述數(shù)據(jù)傳送的至少一部分之后,釋放與所述完成部分相關(guān)聯(lián)的所述保護(hù)。
      18.如權(quán)利要求17所述的方法,其中: 所述保護(hù)包括將存儲器的一個或更多個區(qū)域識別為使用中的存儲器緩沖區(qū); 設(shè)置所述保護(hù)包括將所述存儲器區(qū)域識別為使用中的存儲器區(qū)域;以及釋放所述保護(hù)包括從所述存儲器緩沖區(qū)移除所述存儲器區(qū)域中的所述數(shù)據(jù)傳送已完成的所述部分。
      19.如權(quán)利要求17所述的方法,還包括在發(fā)起所述數(shù)據(jù)傳送之后終止提供所述存儲器訪問請求的指令。
      20.如權(quán)利要求17所述的方法,其中設(shè)置所述保護(hù)包括設(shè)置保護(hù)位,且釋放所述保護(hù)包括釋放所述保護(hù)位。`
      【文檔編號】G06F9/38GK103777923SQ201310502511
      【公開日】2014年5月7日 申請日期:2013年10月23日 優(yōu)先權(quán)日:2012年10月23日
      【發(fā)明者】A·J·希格哈姆, M·S·艾倫, J·L·瑞德福特 申請人:亞德諾半導(dǎo)體技術(shù)公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
      1