chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ARM攢機(jī)指南 - 基礎(chǔ)篇

安芯教育科技 ? 來(lái)源:極術(shù)社區(qū) ? 作者:djygrdzh ? 2021-11-02 14:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文轉(zhuǎn)載于極術(shù)社區(qū)

極術(shù)專欄:ARM攢機(jī)指南

作者:djygrdzh

CCI400是怎么做到硬件一致性的呢?簡(jiǎn)單來(lái)說(shuō),就是處理器組C1,發(fā)一個(gè)包含地址信息的特殊讀寫(xiě)的命令到總線,然后總線把這個(gè)命令轉(zhuǎn)給另一個(gè)處理器組C2。C2收到請(qǐng)求后,根據(jù)地址逐步查找二級(jí)和一級(jí)緩存,如果發(fā)現(xiàn)自己也有,那么就返回?cái)?shù)據(jù)或者做相應(yīng)的緩存一致性操作,這個(gè)過(guò)程稱作snooping(監(jiān)聽(tīng))。

具體的操作我不展開(kāi),ARM使用MOESI一致性協(xié)議,里面都有定義。在這個(gè)過(guò)程中,被請(qǐng)求的C2中的處理器核心并不參與這個(gè)過(guò)程,所有的工作由緩存和總線接口單元BIU等部件來(lái)做。

為了符合從設(shè)備不主動(dòng)發(fā)起請(qǐng)求的定義,需要兩組主從設(shè)備,每個(gè)處理器組占一個(gè)主和一個(gè)從。這樣就可以使得兩組處理器互相保持一致性。而有些設(shè)備如DMA控制器,它本身不包含緩存,也不需要被別人監(jiān)聽(tīng),所以它只包含從設(shè)備,如上圖桔黃色的部分。在ARM的定義中,具有雙向功能的接口被稱作ACE,只能監(jiān)聽(tīng)別人的稱作ACE-Lite。它們除了具有AXI的讀寫(xiě)通道外,還多了個(gè)監(jiān)聽(tīng)通道。

多出來(lái)的監(jiān)聽(tīng)通道,同樣也有地址(從到主),回應(yīng)(主到從)和數(shù)據(jù)(主到從)。每組信號(hào)內(nèi)都包含和AXI一樣的標(biāo)志符,用來(lái)支持多OT。如果在主設(shè)備找到數(shù)據(jù)(稱為命中),那么數(shù)據(jù)通道會(huì)被使用,如果沒(méi)有,那告知從設(shè)備未命中就可以了,不需要傳數(shù)據(jù)。由此,對(duì)于上文的DMA控制器,它永遠(yuǎn)不可能傳數(shù)據(jù)給別人,所以不需要數(shù)據(jù)組,這也就是ACE和ACE-Lite的主要區(qū)別。

我們還可以看到,在讀通道上有個(gè)額外的線RACK,它的用途是,當(dāng)從設(shè)備發(fā)送讀操作中的數(shù)據(jù)給主,它并不知道何時(shí)主能收到這個(gè)數(shù)據(jù),因?yàn)槲覀冋f(shuō)過(guò)插入寄存器會(huì)導(dǎo)致總線延遲變長(zhǎng)。萬(wàn)一這個(gè)時(shí)候,對(duì)同樣的地址A,它需要發(fā)送新的監(jiān)聽(tīng)請(qǐng)求給主,就會(huì)產(chǎn)生一個(gè)問(wèn)題:主是不是已經(jīng)收到前面發(fā)出的地址A的數(shù)據(jù)了呢?如果沒(méi)收到,那它可能會(huì)告知監(jiān)聽(tīng)未命中。但實(shí)際上地址A的數(shù)據(jù)已經(jīng)發(fā)給主了,它該返回命中。加了這個(gè)RACK后,從設(shè)備在收到主給的確認(rèn)RACK之前,不會(huì)發(fā)送新的監(jiān)聽(tīng)請(qǐng)求給主,從而避免了上述問(wèn)題。寫(xiě)通道上的WACK同樣如此。

我們之前計(jì)算過(guò)NIC400上的延遲,有了CCI400的硬件同步,是不是訪問(wèn)更快了呢?首先,硬件一致性的設(shè)計(jì)目的不是為了更快,而是軟件更簡(jiǎn)單。而實(shí)際上,它也未必就快。因?yàn)榻o定一個(gè)地址,我們并不知道它是不是在另一組處理器的緩存內(nèi),所以無(wú)論如何都需要額外的監(jiān)聽(tīng)動(dòng)作。當(dāng)未命中的時(shí)候,這個(gè)監(jiān)聽(tīng)動(dòng)作就是多余的,因?yàn)槲覀冞€是得從內(nèi)存去抓數(shù)據(jù)。這個(gè)多余的動(dòng)作就意味著額外的延遲,10加10一共20個(gè)總線周期,增長(zhǎng)了100%。當(dāng)然,如果命中,雖然總線總共上也同樣需要10周期,可是從緩存拿數(shù)據(jù)比從內(nèi)存拿快些,所以此時(shí)是有好處的。綜合起來(lái)看,當(dāng)命中大于一定比例,總體還是受益的。

可從實(shí)際的應(yīng)用程序情況來(lái)看,除了特殊設(shè)計(jì)的程序,通常命中不會(huì)大于10%。所以我們必須想一些辦法來(lái)提高性能。一個(gè)辦法就是,無(wú)論結(jié)果是命中還是未命中,都讓總線先去內(nèi)存抓數(shù)據(jù)。等到數(shù)據(jù)抓回來(lái),我們也已經(jīng)知道監(jiān)聽(tīng)的結(jié)果,再?zèng)Q定把哪邊的數(shù)據(jù)送回去。這個(gè)辦法的缺點(diǎn),功耗增大,因?yàn)闊o(wú)論如何都要去讀內(nèi)存。第二,在內(nèi)存訪問(wèn)本身就很頻繁的時(shí)候,這么做會(huì)降低總體性能。

另外一個(gè)方法就是,如果預(yù)先知道數(shù)據(jù)不在別的處理器組緩存,那就可以讓發(fā)出讀寫(xiě)請(qǐng)求的主設(shè)備,特別注明不需要監(jiān)聽(tīng),總線就不會(huì)去做這個(gè)動(dòng)作。這個(gè)方法的缺點(diǎn)就是需要軟件干預(yù),雖然代價(jià)并不大,分配操作系統(tǒng)頁(yè)面的時(shí)候設(shè)下寄存器就可以,可是對(duì)程序員的要求就高了,必須充分理解目標(biāo)系統(tǒng)。

CCI總線還使用了一個(gè)新的方法來(lái)提高性能,那就是在總線里加入一個(gè)監(jiān)聽(tīng)過(guò)濾器(SnoopFilter)。這其實(shí)也是一塊緩存(TAG RAM),把它所有處理器組內(nèi)部一級(jí)二級(jí)緩存的狀態(tài)信息都放在里面。數(shù)據(jù)緩存(DATA RAM)是不需要的,因?yàn)樗回?fù)責(zé)查看命中與否。這樣做的好處就是,監(jiān)聽(tīng)請(qǐng)求不必發(fā)到各組處理器,在總線內(nèi)部就可以完成,省了將近10個(gè)總線周期,功耗也優(yōu)于訪問(wèn)內(nèi)存。它的代價(jià)是增加了一點(diǎn)緩存(一二級(jí)緩存10%左右的容量)。并且,如果監(jiān)聽(tīng)過(guò)濾器里的某行緩存被替換(比如寫(xiě)監(jiān)聽(tīng)命中,需要無(wú)效化(Invalidate)緩存行,MOESI協(xié)議定義),同樣的操作必須在對(duì)應(yīng)處理器組的一二級(jí)緩存也做一遍,以保持一致性。這個(gè)過(guò)程被稱作反向無(wú)效化,它添加了額外的負(fù)擔(dān),因?yàn)樵诟乱欢?jí)緩存的時(shí)候,監(jiān)聽(tīng)過(guò)濾器本身也需要追蹤更新的狀態(tài),否則就無(wú)法保證一致性。幸好,在實(shí)際測(cè)試中發(fā)現(xiàn),這樣的操作并不頻繁,一般不超過(guò)5%的可能性。當(dāng)然,有些測(cè)試代碼會(huì)頻繁的觸發(fā)這個(gè)操作,此時(shí)監(jiān)聽(tīng)過(guò)濾器的缺點(diǎn)就顯出來(lái)了。

以上的想法在CCI500中實(shí)現(xiàn),示意圖如下:

62d0f83c-38cb-11ec-82a8-dac502259ad0.jpg

在經(jīng)過(guò)實(shí)際性能測(cè)試后,CCI設(shè)計(jì)人員發(fā)現(xiàn)總線瓶頸移到了訪問(wèn)這個(gè)監(jiān)聽(tīng)過(guò)濾器的窗口,這個(gè)瓶頸其實(shí)掩蓋了上文的反向無(wú)效化問(wèn)題,它總是先于反向無(wú)效化被發(fā)現(xiàn)。把這個(gè)窗口加大后,又在做測(cè)試時(shí)發(fā)現(xiàn),如果每個(gè)主從接口都拼命灌數(shù)據(jù)(主從設(shè)備都是OT無(wú)限大,并且一主多從有前后交叉),在主從設(shè)備接口處經(jīng)常出現(xiàn)等待的情況,也就是說(shuō),明明數(shù)據(jù)已經(jīng)準(zhǔn)備好了,設(shè)備卻來(lái)不及接收。于是,又增加了一些緩沖來(lái)存放這些數(shù)據(jù)。其代價(jià)是稍大的面積和功耗。請(qǐng)注意,這個(gè)緩沖和存放OT的狀態(tài)緩沖并不重復(fù)。

根據(jù)實(shí)測(cè)數(shù)據(jù),在做完所有改進(jìn)后,新的總線帶寬性能同頻增加50%以上。而頻率可以從500Mhz提高到1GMhz。當(dāng)然這個(gè)結(jié)果只是一個(gè)模糊的統(tǒng)計(jì),如果我們考慮處理器和內(nèi)存控制器OT數(shù)量有限,被監(jiān)聽(tīng)數(shù)據(jù)的百分比有不同,命中率有變化,監(jiān)聽(tīng)過(guò)濾器大小有變化,那肯定會(huì)得到不同的結(jié)果。

作為一個(gè)手機(jī)芯片領(lǐng)域的總線,需要支持傳輸?shù)亩鄡?yōu)先級(jí)也就是QoS。因?yàn)轱@示控制器等設(shè)備對(duì)實(shí)時(shí)性要求高,而處理器組的請(qǐng)求也很重要。支持QoS本身沒(méi)什么困難,只需要把各類請(qǐng)求放在一個(gè)緩沖,根據(jù)優(yōu)先級(jí)傳送即可。但是在實(shí)際測(cè)試中,發(fā)現(xiàn)如果各個(gè)設(shè)備的請(qǐng)求太多太頻繁,緩沖很快就被填滿,從而阻塞了新的高優(yōu)先級(jí)請(qǐng)求。為了解決這個(gè)問(wèn)題,又把緩沖按優(yōu)先級(jí)分組,每一組只接受同等或更高優(yōu)先級(jí)的請(qǐng)求,這樣就避免了阻塞。

此外,為了支持多時(shí)鐘電源域,使得每一組處理器都可以動(dòng)態(tài)調(diào)節(jié)電壓和時(shí)鐘頻率,CCI系列總線還可以搭配異步橋ADB(Asynchronous Domain Bridge)。它對(duì)于性能有一定的影響,在倍頻是2的時(shí)候,信號(hào)穿過(guò)它需要一個(gè)額外的總線時(shí)鐘周期。如果是3,那更大些。在對(duì)于訪問(wèn)延遲有嚴(yán)格要求的系統(tǒng)里面,這個(gè)時(shí)間不可忽略。如果不需要額外的電源域,我們可以不用它,省一點(diǎn)延遲。NIC/CCI/CCN/NoC總線天然就支持異步傳輸。

和一致性相關(guān)的是訪存次序和鎖,有些程序員把它們搞混了。假設(shè)我們有兩個(gè)核C0和C1。當(dāng)C0和C1分別訪問(wèn)同一地址A0,無(wú)論何時(shí),都要保證看到的數(shù)據(jù)一致,這是一致性。然后在C0里面,它需要保證先后訪問(wèn)地址A0和A1,這稱作訪問(wèn)次序,此時(shí)不需要鎖,只需要壁壘指令。如果C0和C1上同時(shí)運(yùn)行兩個(gè)線程,當(dāng)C0和C1分別訪問(wèn)同一地址A0,并且需要保證C0和C1按照先后次序訪問(wèn)A0,這就需要鎖。所以,單單壁壘指令只能保證單核單線程的次序,多核多線程的次序需要鎖。而一致性保證了在做鎖操作時(shí),同一變量在緩存或者內(nèi)存的不同拷貝,都是一致的。

ARM的壁壘指令分為強(qiáng)壁壘DSB和弱壁壘DMB。我們知道讀寫(xiě)指令會(huì)被分成請(qǐng)求和完成兩部分,強(qiáng)壁壘要求上一條讀寫(xiě)指令完成后才能開(kāi)始下一個(gè)請(qǐng)求,弱壁壘則只要求上一條讀寫(xiě)指令發(fā)出請(qǐng)求后就可以繼續(xù)下一條讀寫(xiě)指令的請(qǐng)求,且只能保證,它之后的讀寫(xiě)指令完成時(shí),它之前的讀寫(xiě)指令肯定已經(jīng)完成了。顯然,后一種情況性能更高,OT》1。但測(cè)試表明,多個(gè)處理器組的情況下,壁壘指令如果傳輸?shù)娇偩€,只能另整體系統(tǒng)性能降低,因此在新的ARM總線中是不支持壁壘的,必須在芯片設(shè)計(jì)階段,通過(guò)配置選項(xiàng)告訴處理器自己處理壁壘指令,不要送到總線。但這并不影響程序中的壁壘指令,處理器會(huì)在總線之前把它過(guò)濾掉。

具體到CCI總線上,壁壘機(jī)制是怎么實(shí)現(xiàn)的呢?首先,壁壘和讀寫(xiě)一樣,也是使用讀寫(xiě)通道的,只不過(guò)它地址總是0,且沒(méi)有數(shù)據(jù)。標(biāo)志符也是有的,此外還有額外的2根線BAR0/1,表明本次傳輸是不是壁壘,是哪種壁壘。他是怎么傳輸?shù)哪兀肯瓤慈醣趬?,如下圖:

62fd693a-38cb-11ec-82a8-dac502259ad0.jpg

Master0寫(xiě)了一個(gè)數(shù)據(jù)data,然后又發(fā)了弱壁壘請(qǐng)求。CCI和主設(shè)備接口的地方,一旦收到壁壘請(qǐng)求,立刻做兩件事,第一,給Master0發(fā)送壁壘響應(yīng);第二,把壁壘請(qǐng)求發(fā)到和從設(shè)備Slave0/1的接口。Slave1接口很快給了壁壘響應(yīng),因?yàn)樗抢餂](méi)有任何未完成傳輸。而Slave0接口不能給壁壘響應(yīng),因?yàn)閐ata還沒(méi)發(fā)到從設(shè)備,在這條路徑上的壁壘請(qǐng)求必須等待,并且不能和data的寫(xiě)請(qǐng)求交換次序。這并不能阻撓Master0發(fā)出第二個(gè)數(shù)據(jù),因?yàn)樗呀?jīng)收到它的所有下級(jí)(Master0接口)的壁壘回應(yīng),所以它又寫(xiě)出了flag。如下圖:

632bc78a-38cb-11ec-82a8-dac502259ad0.jpg

此時(shí),flag在Master0接口中等待它的所有下一級(jí)接口的壁壘響應(yīng)。而data達(dá)到了Slave0后,壁壘響應(yīng)走到了Master0接口,flag繼續(xù)往下走。此時(shí),我們不必?fù)?dān)心data沒(méi)有到slave0,因?yàn)槟侵?,?lái)自Slave0接口的壁壘響應(yīng)不會(huì)被送到Master0接口。這樣,就做到了弱壁壘的次序保證,并且在壁壘指令完成前,flag的請(qǐng)求就可以被送出來(lái)。

對(duì)于強(qiáng)壁壘指令來(lái)說(shuō),僅僅有一個(gè)區(qū)別,就是Master0接口在收到所有下一級(jí)接口的壁壘響應(yīng)前,它不會(huì)發(fā)送自身的壁壘響應(yīng)給Master0。這就造成flag發(fā)不出來(lái),直到壁壘指令完成。如下圖:

635c619c-38cb-11ec-82a8-dac502259ad0.jpg

這樣,就保證了強(qiáng)壁壘完成后,下一條讀寫(xiě)指令才能發(fā)出請(qǐng)求。此時(shí),強(qiáng)壁壘前的讀寫(xiě)指令肯定是完成了的。

另外需要特別注意的是,ARM的弱壁壘只是針對(duì)顯式數(shù)據(jù)訪問(wèn)的次序。什么叫顯式數(shù)據(jù)訪問(wèn)?讀寫(xiě)指令,緩存,TLB操作都算。相對(duì)的,什么是隱式數(shù)據(jù)訪問(wèn)?在處理器那一節(jié),我們提到,處理器會(huì)有推測(cè)執(zhí)行,預(yù)先執(zhí)行讀寫(xiě)指令;緩存也有硬件預(yù)取機(jī)制,根據(jù)之前數(shù)據(jù)訪問(wèn)的規(guī)律,自動(dòng)抓取可能用到的緩存行。這些都不包含在當(dāng)前指令中,弱壁壘對(duì)他們無(wú)能為力。因此,切記,弱壁壘只能保證你給出的指令次序,并不能保證在它們之間沒(méi)有別的模塊去訪問(wèn)內(nèi)存,哪怕這個(gè)模塊來(lái)自于同一個(gè)核。

簡(jiǎn)單來(lái)說(shuō),如果只需要保證讀寫(xiě)次序,用弱壁壘;如果需要某個(gè)讀寫(xiě)指令完成才能做別的事情,用強(qiáng)壁壘。以上都是針對(duì)普通內(nèi)存類型。當(dāng)我們把類型設(shè)成設(shè)備時(shí),自動(dòng)保證強(qiáng)壁壘。

我們提到,壁壘只是針對(duì)單核。在多核多線程時(shí),哪怕使用了壁壘指令,也沒(méi)法保證讀寫(xiě)的原子性。解決辦法有兩個(gè),一個(gè)是軟件鎖,一個(gè)是原子操作。AXI/ACE協(xié)議不支持原子操作。所以手機(jī)通常需要用到軟件鎖。

軟件鎖中有個(gè)自旋鎖,能用一個(gè)ARM硬件機(jī)制exclusive access來(lái)實(shí)現(xiàn)。當(dāng)使用特殊指令對(duì)一個(gè)地址寫(xiě)入值,相應(yīng)緩存行上會(huì)做一個(gè)特殊標(biāo)記,表示還沒(méi)有別的核去寫(xiě)這行緩存。然后下條指令讀這個(gè)行,如果標(biāo)記沒(méi)變,說(shuō)明寫(xiě)和讀之間沒(méi)有人打擾,那么就拿到鎖了。如果變了,那么回到寫(xiě)的過(guò)程重新獲取鎖。由于緩存一致性,這個(gè)鎖變量可以被多個(gè)核與線程使用。當(dāng)然,過(guò)程中還是需要壁壘指令來(lái)保證次序。

在支持ARMv8.2和AMBA 5.0 CHI接口的系統(tǒng)中,原子操作被重新引入。在硬件層面,其實(shí)原子操作非常容易理解,如果某個(gè)數(shù)據(jù)存在于自己的緩存,那就直接修改;如果存在于別人的緩存,那對(duì)所有其他緩存執(zhí)行Eviction操作,踢出后,放到自己的緩存繼續(xù)操作。這個(gè)過(guò)程其實(shí)和exclusive access非常類似。

對(duì)于普通內(nèi)存,還會(huì)產(chǎn)生一個(gè)問(wèn)題,就是讀寫(xiě)操作可能會(huì)經(jīng)過(guò)緩存,你不知道數(shù)據(jù)是否最終寫(xiě)到了內(nèi)存中。通常我們使用clean操作來(lái)刷緩存。但是刷緩存本身是個(gè)模糊的概念,緩存存在多級(jí),有些在處理器內(nèi),有些在總線之后,到底刷到哪里算是終結(jié)呢?還有,為了保證一致性,刷的時(shí)候是不是需要通知?jiǎng)e的處理器和緩存?為了把這些問(wèn)題規(guī)范化,ARM引入了Point of Unification/Coherency,Inner/Outer Cacheable和System/Inner/Outer/Non Shareable的概念。

63969448-38cb-11ec-82a8-dac502259ad0.jpg

PoU是指,對(duì)于某一個(gè)核Master,附屬于它的指令,數(shù)據(jù)緩存和TLB,如果在某一點(diǎn)上,它們能看到一致的內(nèi)容,那么這個(gè)點(diǎn)就是PoU。如上圖右側(cè),MasterB包含了指令,數(shù)據(jù)緩存和TLB,還有二級(jí)緩存。指令,數(shù)據(jù)緩存和TLB的數(shù)據(jù)交換都建立在二級(jí)緩存,此時(shí)二級(jí)緩存就成了PoU。而對(duì)于上圖左側(cè)的MasterA,由于沒(méi)有二級(jí)緩存,指令,數(shù)據(jù)緩存和TLB的數(shù)據(jù)交換都建立在內(nèi)存上,所以內(nèi)存成了PoU。還有一種情況,就是指令緩存可以去監(jiān)聽(tīng)數(shù)據(jù)緩存,此時(shí),不需要二級(jí)緩存也能保持?jǐn)?shù)據(jù)一致,那一級(jí)數(shù)據(jù)緩存就變成了PoU。

PoC是指,對(duì)于系統(tǒng)中所有Master(注意是所有的,而不是某個(gè)核),如果存在某個(gè)點(diǎn),它們的指令,數(shù)據(jù)緩存和TLB能看到同一個(gè)源,那么這個(gè)點(diǎn)就是PoC。如上圖右側(cè),二級(jí)緩存此時(shí)不能作為PoC,因?yàn)镸asterB在它的范圍之外,直接訪問(wèn)內(nèi)存。所以此時(shí)內(nèi)存是PoC。在左圖,由于只有一個(gè)Master,所以內(nèi)存是PoC。

再進(jìn)一步,如果我們把右圖的內(nèi)存換成三級(jí)緩存,把內(nèi)存接在三級(jí)緩存后面,那PoC就變成了三級(jí)緩存。

有了這兩個(gè)定義,我們就可以指定TLB和緩存操作指令到底發(fā)到哪個(gè)范圍。比如在下圖的系統(tǒng)上,有兩組A15,每組四個(gè)核,組內(nèi)含二級(jí)緩存。系統(tǒng)的PoC在內(nèi)存,而A15的PoU分別在它們自己組內(nèi)的二級(jí)緩存上。在某個(gè)A15上執(zhí)行Clean清指令緩存,范圍指定PoU。顯然,所有四個(gè)A15的一級(jí)指令緩存都會(huì)被清掉。那么其他的各個(gè)Master是不是受影響?那就要用到Inner/Outer/Non Shareable。

63eb56e0-38cb-11ec-82a8-dac502259ad0.jpg

Shareable的很容易理解,就是某個(gè)地址的可能被別人使用。我們?cè)诙x某個(gè)頁(yè)屬性的時(shí)候會(huì)給出。Non-Shareable就是只有自己使用。當(dāng)然,定義成Non-Shareable不表示別人不可以用。某個(gè)地址A如果在核1上映射成Shareable,核2映射成Non-Shareable,并且兩個(gè)核通過(guò)CCI400相連。那么核1在訪問(wèn)A的時(shí)候,總線會(huì)去監(jiān)聽(tīng)核2,而核2訪問(wèn)A的時(shí)候,總線直接訪問(wèn)內(nèi)存,不監(jiān)聽(tīng)核1。顯然這種做法是錯(cuò)誤的。

對(duì)于Inner和Outer Shareable,有個(gè)簡(jiǎn)單的的理解,就是認(rèn)為他們都是一個(gè)東西。在最近的ARM A系列處理器上上,配置處理器RTL的時(shí)候,會(huì)選擇是不是把inner的傳輸送到ACE口上。當(dāng)存在多個(gè)處理器簇或者需要雙向一致性的GPU時(shí),就需要設(shè)成送到ACE端口。這樣,內(nèi)部的操作,無(wú)論inner shareable還是outer shareable,都會(huì)經(jīng)由CCI廣播到別的ACE口上。

說(shuō)了這么多概念,你可能會(huì)想這有什么用處?回到上文的Clean指令,PoU使得四個(gè)A7的指令緩存中對(duì)應(yīng)的行都被清掉。由于是指令緩存操作,Inner Shareable屬性使得這個(gè)操作被擴(kuò)散到總線。而CCI400總線會(huì)把這個(gè)操作廣播到所有可能接受的口上。ACE口首當(dāng)其沖,所以四個(gè)A15也會(huì)清它們對(duì)應(yīng)的指令緩存行。對(duì)于Mali和DMA控制器,他們是ACE-Lite,本不必清。但是請(qǐng)注意它們還連了DVM接口,專門負(fù)責(zé)收發(fā)緩存維護(hù)指令,所以它們的對(duì)應(yīng)指令緩存行也會(huì)被清。不過(guò)事實(shí)上,它們沒(méi)有對(duì)應(yīng)的指令緩存,所以只是接受請(qǐng)求,并沒(méi)有任何動(dòng)作。

要這么復(fù)雜的定義有什么用?用處是,精確定義TLB/緩存維護(hù)和讀寫(xiě)指令的范圍。如果我們改變一下,總線不支持Inner/Outer Shareable的廣播,那么就只有A7處理器組會(huì)清緩存行。顯然這么做在邏輯上不對(duì),因?yàn)锳7/A15可能運(yùn)行同一行代碼。并且,我們之前提到過(guò),如果把讀寫(xiě)屬性設(shè)成Non-Shareable,那么總線就不會(huì)去監(jiān)聽(tīng)其他主,減少訪問(wèn)延遲,這樣可以非常靈活的提高性能。

再回到前面的問(wèn)題,刷某行緩存的時(shí)候,怎么知道數(shù)據(jù)是否最終寫(xiě)到了內(nèi)存中?對(duì)不起,非常抱歉,還是沒(méi)法知道。你只能做到把范圍設(shè)成PoC。如果PoC是三級(jí)緩存,那么最終刷到三級(jí)緩存,如果是內(nèi)存,那就刷到內(nèi)存。不過(guò)這在邏輯上沒(méi)有錯(cuò),按照定義,所有Master如果都在三級(jí)緩存統(tǒng)一數(shù)據(jù)的話,那就不必刷到內(nèi)存了。

簡(jiǎn)而言之,PoU/PoC定義了指令和命令的所能抵達(dá)的緩存或內(nèi)存,在到達(dá)了指定地點(diǎn)后,Inner/Outer Shareable定義了它們被廣播的范圍。

再來(lái)看看Inner/Outer Cacheable,這個(gè)就簡(jiǎn)單了,僅僅是一個(gè)緩存的前后界定。一級(jí)緩存一定是Inner Cacheable的,而最外層的緩存,比如三級(jí),可能是Outer Cacheable,也可能是Inner Cacheable。他們的用處在于,在定義內(nèi)存頁(yè)屬性的時(shí)候,可以在不同層的緩存上有不同的處理策略。

在ARM的處理器和總線手冊(cè)中,還會(huì)出現(xiàn)幾個(gè)PoS(Point of Serialization)。它的意思是,在總線中,所有主設(shè)備來(lái)的各類請(qǐng)求,都必須由控制器檢查地址和類型,如果存在競(jìng)爭(zhēng),那就會(huì)進(jìn)行串行化。這個(gè)概念和其他幾個(gè)沒(méi)什么關(guān)系。

縱觀整個(gè)總線的變化,還有一個(gè)核心問(wèn)題并沒(méi)有被提及,那就是動(dòng)態(tài)規(guī)劃re-scheduling與合并Merging。處理器和內(nèi)存控制器中都有同樣的模塊,專門負(fù)責(zé)把所有的傳輸進(jìn)行分類,合并,調(diào)整次序,甚至預(yù)測(cè)未來(lái)可能接收到的讀寫(xiě)請(qǐng)求地址,以實(shí)現(xiàn)最大效率的傳輸。這個(gè)問(wèn)題在分析性能時(shí)會(huì)重新提到。但是在總線這層,軟件能起的影響很小。清楚了總線延遲和OT最大的好處是可以和性能計(jì)數(shù)器的統(tǒng)計(jì)結(jié)果精確匹配,看看是不是達(dá)到預(yù)期了。

現(xiàn)在手機(jī)和平板上最常見(jiàn)的用法,CCI連接CPU和GPU,作為子網(wǎng),網(wǎng)內(nèi)有硬件一致性。NoC連接子網(wǎng),同時(shí)連接其余的設(shè)備,包括多個(gè)內(nèi)存控制器和視頻,顯示控制器,不需要一致性。優(yōu)點(diǎn)是兼顧一致性,大帶寬和靈活性,缺點(diǎn)是CPU/GPU到內(nèi)存控制器要跨過(guò)兩個(gè)網(wǎng),延遲有點(diǎn)大。

訪存路徑的最后一步是內(nèi)存。有的程序員認(rèn)為內(nèi)存是一個(gè)所有地址訪問(wèn)時(shí)間相等的設(shè)備,是這樣的么?這要看情況。

DDR地址有三個(gè)部分組成,行,bank,列。一旦這三個(gè)部分定了,那么就可以選中確定的一個(gè)物理頁(yè),通常有2-8KB大小。我們買內(nèi)存的時(shí)候,有3個(gè)性能參數(shù),比如10-10-10。這個(gè)表示訪問(wèn)一個(gè)地址所需要的三個(gè)操作時(shí)間,行有效(包括選bank),列選通(命令/數(shù)據(jù)訪問(wèn)),還有預(yù)充電。前兩個(gè)好理解,第三個(gè)的意思是,某個(gè)內(nèi)存物理頁(yè)暫時(shí)用不著,必須關(guān)閉,保持電容電壓,否則再次使用這頁(yè)數(shù)據(jù)就丟失了。如果連續(xù)的內(nèi)存訪問(wèn)都是在同行同bank,那么第一和第三個(gè)10都可以省略,每一次訪問(wèn)只需要10單位時(shí)間;同行不同bank,表示需要打開(kāi)一個(gè)新的頁(yè),只有第三個(gè)10可以省略,共20單位時(shí)間;不同行同bank,那么需要關(guān)閉老頁(yè)面,打開(kāi)一個(gè)新頁(yè)面,預(yù)充電沒(méi)法省,共30單位時(shí)間。

我們得到什么結(jié)論?如果控制好物理地址,就能使某段時(shí)間內(nèi)的訪存都集中在一個(gè)頁(yè)內(nèi),從而節(jié)省大量的時(shí)間。根據(jù)經(jīng)驗(yàn),在突發(fā)訪問(wèn)時(shí),最多可以省50%。那怎么做到這一點(diǎn)?去查查芯片手冊(cè)中物理內(nèi)存地址到內(nèi)存管腳的映射,就可以得到需要的物理地址。然后調(diào)用系統(tǒng)函數(shù),為這個(gè)物理地址分配虛擬地址,就可以使得程序只訪問(wèn)某個(gè)固定的物理內(nèi)存頁(yè)。

在訪問(wèn)有些數(shù)據(jù)結(jié)構(gòu)時(shí),特定的大小和偏移有可能會(huì)不小心觸發(fā)不同行同bank這個(gè)條件。這樣可能每次訪問(wèn)都是最差情況。為了避免這種最差情況的產(chǎn)生,有些內(nèi)存控制器可以自動(dòng)讓最終地址哈?;?,打亂原有的不同行同bank條件,從而在一定程度上減少延遲。我們也可以通過(guò)計(jì)算和調(diào)整軟件物理地址來(lái)避免上述情況的發(fā)生。

在實(shí)際的訪問(wèn)中,通常無(wú)法保證訪問(wèn)只在一個(gè)頁(yè)中。DDR內(nèi)存支持同時(shí)打開(kāi)多個(gè)頁(yè),比如4個(gè)。而通過(guò)交替訪問(wèn),我們可以同時(shí)利用這4個(gè)頁(yè),不必等到上一次完成就開(kāi)始下一個(gè)頁(yè)的訪問(wèn)。這樣就可以減少平均延遲。如下圖:

64290738-38cb-11ec-82a8-dac502259ad0.jpg

我們可以通過(guò)突發(fā)訪問(wèn),讓上圖中的綠色數(shù)據(jù)塊更長(zhǎng),那么相應(yīng)的利用率就越高。此時(shí)甚至不需要用到四個(gè)bank,如下圖:

64793e92-38cb-11ec-82a8-dac502259ad0.jpg

如果做的更好些,我們可以通過(guò)軟件控制地址,讓上圖中的預(yù)充電,甚至行有效盡量減少,那么就可以達(dá)到更高的效率。還有,使用更好的內(nèi)存顆粒,調(diào)整配置參數(shù),減少行有效,列選通,還有預(yù)充電的時(shí)間,提高DDR傳輸頻率,也是好辦法,這點(diǎn)PC機(jī)超頻玩家應(yīng)該有體會(huì)。此外,在DDR板級(jí)布線的時(shí)候,控制每組時(shí)鐘,控制線,數(shù)據(jù)線之間的長(zhǎng)度差,調(diào)整好走線阻抗,做好自校準(zhǔn),設(shè)置合理的內(nèi)存控制器參數(shù),調(diào)好眼圖,都有助于提高信號(hào)質(zhì)量,從而可以使用更短的時(shí)序參數(shù)。

如果列出所有數(shù)據(jù)突發(fā)長(zhǎng)度情況,我們就得到了下圖:

64ba2876-38cb-11ec-82a8-dac502259ad0.jpg

上面這個(gè)圖包含了更直觀的信息。它模擬內(nèi)存控制器連續(xù)不斷的向內(nèi)存顆粒發(fā)起訪問(wèn)。X軸表示在訪問(wèn)某個(gè)內(nèi)存物理頁(yè)的時(shí)候,連續(xù)地址的大小。這里有個(gè)默認(rèn)的前提,這塊地址是和內(nèi)存物理頁(yè)對(duì)齊的。Y軸表示同時(shí)打開(kāi)了多少個(gè)頁(yè)。Z軸表示內(nèi)存控制器訪問(wèn)內(nèi)存顆粒時(shí)帶寬的利用率。我們可以看到,有三個(gè)波峰,其中一個(gè)在128字節(jié),利用率80%。而100%的情況下,訪問(wèn)長(zhǎng)度分別為192字節(jié)和256字節(jié)。這個(gè)大小恰恰是64字節(jié)緩存行的整數(shù)倍,意味著我們可以利用三個(gè)或者四個(gè)8拍的突發(fā)訪問(wèn)完成。此時(shí),我們需要至少4個(gè)頁(yè)被打開(kāi)。

還有一個(gè)重要的信息,就是X軸和Z軸的斜率。它對(duì)應(yīng)了DDR時(shí)序參數(shù)中的tFAW,限定單位時(shí)間內(nèi)同時(shí)進(jìn)行的頁(yè)訪問(wèn)數(shù)量。這個(gè)數(shù)字越小,性能可能越低,但是同樣的功耗就越低。

對(duì)于不同的DDR,上面的模型會(huì)不斷變化。而設(shè)計(jì)DDR控制器的目的,就是讓利用率盡量保持在100%。要做到這點(diǎn),需要不斷的把收到的讀寫(xiě)請(qǐng)求分類,合并,調(diào)整次序。而從軟件角度,產(chǎn)生更多的緩存行對(duì)齊的讀寫(xiě),保持地址連續(xù),盡量命中已打開(kāi)頁(yè),減少行地址和bank地址切換,都是減少內(nèi)存訪問(wèn)延遲的方法。

交替訪問(wèn)也能提高訪存性能。上文已經(jīng)提到了物理頁(yè)的交替,還可以有片選信號(hào)的交替訪問(wèn)。當(dāng)有兩個(gè)內(nèi)存控制器的時(shí)候,控制器之間還可以交替。無(wú)論哪種交替訪問(wèn),都是在前一個(gè)訪問(wèn)完成前,同時(shí)開(kāi)始下一個(gè)傳輸。當(dāng)然,前提必須是他們使用的硬件不沖突。物理頁(yè),片選,控制器符合這一個(gè)要求。交替訪問(wèn)之后,原本連續(xù)分布在一個(gè)控制器的地址被分散到幾個(gè)不同的控制器。最終期望的效果如下圖:

64df789c-38cb-11ec-82a8-dac502259ad0.jpg

這種方法對(duì)連續(xù)的地址訪問(wèn)效果最好。但是實(shí)際的訪存并沒(méi)有上圖那么理想,因?yàn)槟呐率沁B續(xù)的讀,由于緩存中存在替換eviction和硬件預(yù)取,最終送出的連續(xù)地址序列也會(huì)插入擾動(dòng),而如果取消緩存直接訪存,可能又沒(méi)法利用到硬件的預(yù)取機(jī)制和額外的OT資源。

實(shí)測(cè)下來(lái),可能會(huì)提升30%左右。此外,由于多個(gè)主設(shè)備的存在,每一個(gè)主都產(chǎn)生不同的連續(xù)地址,使得效果進(jìn)一步降低。因此,只有采用交織訪問(wèn)才能真正的實(shí)現(xiàn)均勻訪問(wèn)多個(gè)內(nèi)存控制器。

當(dāng)然,此時(shí)的突發(fā)長(zhǎng)度和粒度要匹配,不然粒度太大也沒(méi)法均勻,就算均勻了也未必是最優(yōu)的。對(duì)于某個(gè)內(nèi)存控制來(lái)說(shuō),最好的期望是總收到同一個(gè)物理頁(yè)內(nèi)的請(qǐng)求。

還有一點(diǎn)需要提及。如果使用了帶ecc的內(nèi)存,那么最好所有的訪問(wèn)都是ddr帶寬對(duì)齊(一般64位)。因?yàn)槭鼓躤cc后,所有內(nèi)存訪問(wèn)都是帶寬對(duì)齊的,不然ecc沒(méi)法算。如果你寫(xiě)入小于帶寬的數(shù)據(jù),內(nèi)存控制器需要知道原來(lái)的數(shù)據(jù)是多少,于是就去讀,然后改動(dòng)其中一部分,再計(jì)算新的ecc值,再寫(xiě)入。這樣就多了一個(gè)讀的過(guò)程。根據(jù)經(jīng)驗(yàn),如果訪存很多,關(guān)閉ecc會(huì)快8%。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19885

    瀏覽量

    235062
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7255

    瀏覽量

    91814
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2959

    瀏覽量

    89728

原文標(biāo)題:技術(shù)分享 | ARM攢機(jī)指南 - 基礎(chǔ)篇

文章出處:【微信號(hào):Ithingedu,微信公眾號(hào):安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RK3568驅(qū)動(dòng)指南|第十二 GPIO子系統(tǒng)-第130章 GPIO的調(diào)試方法

    RK3568驅(qū)動(dòng)指南|第十二 GPIO子系統(tǒng)-第130章 GPIO的調(diào)試方法
    的頭像 發(fā)表于 06-03 11:32 ?521次閱讀
    RK3568驅(qū)動(dòng)<b class='flag-5'>指南</b>|第十二<b class='flag-5'>篇</b> GPIO子系統(tǒng)-第130章 GPIO的調(diào)試方法

    RK3568驅(qū)動(dòng)指南|第十二 GPIO子系統(tǒng)-第135章 GPIO子系統(tǒng)與pinctrl子系統(tǒng)相結(jié)合實(shí)驗(yàn)

    RK3568驅(qū)動(dòng)指南|第十二 GPIO子系統(tǒng)-第135章 GPIO子系統(tǒng)與pinctrl子系統(tǒng)相結(jié)合實(shí)驗(yàn)
    的頭像 發(fā)表于 05-23 13:47 ?356次閱讀
    RK3568驅(qū)動(dòng)<b class='flag-5'>指南</b>|第十二<b class='flag-5'>篇</b> GPIO子系統(tǒng)-第135章 GPIO子系統(tǒng)與pinctrl子系統(tǒng)相結(jié)合實(shí)驗(yàn)

    RK3568驅(qū)動(dòng)指南|驅(qū)動(dòng)基礎(chǔ)進(jìn)階-進(jìn)階7 向系統(tǒng)中添加一個(gè)系統(tǒng)調(diào)用

    RK3568驅(qū)動(dòng)指南|驅(qū)動(dòng)基礎(chǔ)進(jìn)階-進(jìn)階7 向系統(tǒng)中添加一個(gè)系統(tǒng)調(diào)用
    的頭像 發(fā)表于 05-21 14:15 ?279次閱讀
    RK3568驅(qū)動(dòng)<b class='flag-5'>指南</b>|驅(qū)動(dòng)基礎(chǔ)進(jìn)階<b class='flag-5'>篇</b>-進(jìn)階7 向系統(tǒng)中添加一個(gè)系統(tǒng)調(diào)用

    STM32開(kāi)發(fā)板教程之STM32開(kāi)發(fā)指南免費(fèi)下載

      本開(kāi)發(fā)指南將由淺入深,帶領(lǐng)大家進(jìn)入 STM32 的世界。本指南總共分為三:1,硬件,主要介紹本指南的實(shí)驗(yàn)平臺(tái);2,軟件
    發(fā)表于 02-28 09:08 ?179次下載

    華為PCB的EMC設(shè)計(jì)指南【可下載】

    轉(zhuǎn)載一華為《PCB的EMC設(shè)計(jì)指南》,合計(jì)94頁(yè)P(yáng)DF,對(duì)PCB的EMC設(shè)計(jì)從布局、布線、背板的EMC設(shè)計(jì)、射頻PCB的EMC設(shè)計(jì)等方面做了系統(tǒng)的總結(jié),供大家進(jìn)行PCB的EMC設(shè)計(jì)參考。 獲取完整文檔可下載附件哦!?。?!
    發(fā)表于 02-26 15:52

    RK3568驅(qū)動(dòng)指南|第三-并發(fā)與競(jìng)爭(zhēng)-第19章 并發(fā)與競(jìng)爭(zhēng)實(shí)驗(yàn)

    RK3568驅(qū)動(dòng)指南|第三-并發(fā)與競(jìng)爭(zhēng)-第19章 并發(fā)與競(jìng)爭(zhēng)實(shí)驗(yàn)
    的頭像 發(fā)表于 02-24 16:26 ?571次閱讀
    RK3568驅(qū)動(dòng)<b class='flag-5'>指南</b>|第三<b class='flag-5'>篇</b>-并發(fā)與競(jìng)爭(zhēng)-第19章 并發(fā)與競(jìng)爭(zhēng)實(shí)驗(yàn)

    Arm預(yù)測(cè)2025年芯片設(shè)計(jì)發(fā)展趨勢(shì)

    Arm 對(duì)未來(lái)技術(shù)的發(fā)展方向及可能出現(xiàn)的趨勢(shì)有著廣泛而深刻的洞察。在《Arm 解析未來(lái)行業(yè)技術(shù)趨勢(shì)——AI 》中,我們預(yù)測(cè)了該領(lǐng)域的 11 個(gè)未來(lái)趨勢(shì),本文將著重于芯片設(shè)計(jì),帶你深入了解 2025 年及未來(lái)在這一方面的關(guān)鍵技術(shù)
    的頭像 發(fā)表于 01-20 09:52 ?948次閱讀

    華為PCB的EMC設(shè)計(jì)指南

    轉(zhuǎn)載一華為《PCB的EMC設(shè)計(jì)指南》,合計(jì)94頁(yè)P(yáng)DF,對(duì)PCB的EMC設(shè)計(jì)從布局、布線、背板的EMC設(shè)計(jì)、射頻PCB的EMC設(shè)計(jì)等方面做了系統(tǒng)的總結(jié),供大家進(jìn)行PCB的EMC設(shè)計(jì)參考。 ?
    的頭像 發(fā)表于 01-15 10:09 ?1416次閱讀
    華為PCB的EMC設(shè)計(jì)<b class='flag-5'>指南</b>

    迅為iTOP-RK3568開(kāi)發(fā)板驅(qū)動(dòng)開(kāi)發(fā)指南-第十八 PWM

    期_SPI 第十七期_串口 第十八期_PWM 第十九期_RTC 第二十期_看門狗 未完待續(xù),持續(xù)更新中... 更新內(nèi)容 ◆教程更新 《iTOP-RK3568開(kāi)發(fā)板驅(qū)動(dòng)開(kāi)發(fā)指南》V2.4 新增第十八_PWM
    發(fā)表于 10-29 10:13

    【北京迅為】i.mx8mm嵌入式linux開(kāi)發(fā)指南第四 嵌入式Linux系統(tǒng)移植第六十九章uboot移植

    【北京迅為】i.mx8mm嵌入式linux開(kāi)發(fā)指南第四 嵌入式Linux系統(tǒng)移植第六十九章uboot移植
    的頭像 發(fā)表于 10-22 14:46 ?1163次閱讀
    【北京迅為】i.mx8mm嵌入式linux開(kāi)發(fā)<b class='flag-5'>指南</b>第四<b class='flag-5'>篇</b> 嵌入式Linux系統(tǒng)移植<b class='flag-5'>篇</b>第六十九章uboot移植

    從STM32到基于Arm的MSPM0的遷移指南

    電子發(fā)燒友網(wǎng)站提供《從STM32到基于Arm的MSPM0的遷移指南.pdf》資料免費(fèi)下載
    發(fā)表于 09-07 11:31 ?0次下載
    從STM32到基于<b class='flag-5'>Arm</b>的MSPM0的遷移<b class='flag-5'>指南</b>

    從遷移到基于Arm STM32的MSPMO指南

    電子發(fā)燒友網(wǎng)站提供《從遷移到基于Arm STM32的MSPMO指南.pdf》資料免費(fèi)下載
    發(fā)表于 09-07 11:17 ?0次下載
    從遷移到基于<b class='flag-5'>Arm</b> STM32的MSPMO<b class='flag-5'>指南</b>

    從Renesas RL78到基于Arm的MSPM0的遷移指南

    電子發(fā)燒友網(wǎng)站提供《從Renesas RL78到基于Arm的MSPM0的遷移指南.pdf》資料免費(fèi)下載
    發(fā)表于 08-23 09:28 ?0次下載
    從Renesas RL78到基于<b class='flag-5'>Arm</b>的MSPM0的遷移<b class='flag-5'>指南</b>

    【《大語(yǔ)言模型應(yīng)用指南》閱讀體驗(yàn)】+ 基礎(chǔ)

    今天開(kāi)始學(xué)習(xí)《大語(yǔ)言模型應(yīng)用指南》第一——基礎(chǔ),對(duì)于人工智能相關(guān)專業(yè)技術(shù)人員應(yīng)該可以輕松加愉快的完成此閱讀,但對(duì)于我還是有許多的知識(shí)點(diǎn)、專業(yè)術(shù)語(yǔ)比較陌生,需要網(wǎng)上搜索學(xué)習(xí)更多的資
    發(fā)表于 07-25 14:33

    【《大語(yǔ)言模型應(yīng)用指南》閱讀體驗(yàn)】+ 俯瞰全書(shū)

    上周收到《大語(yǔ)言模型應(yīng)用指南》一書(shū),非常高興,但工作項(xiàng)目繁忙,今天才品鑒體驗(yàn),感謝作者編寫(xiě)了一部?jī)?nèi)容豐富、理論應(yīng)用相結(jié)合、印刷精美的著作,也感謝電子發(fā)燒友論壇提供了一個(gè)讓我了解大語(yǔ)言模型和機(jī)器學(xué)習(xí)
    發(fā)表于 07-21 13:35