欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
TMS320C64x+ DSP------Using Cache - 日志 - xiaow...

一、配置cache
>配置L1 Cache:
     CACHE_L1pSetSize();                           CACHE_L1dSetSize();

>配置L2 cache:
    啟動(dòng)時(shí)默認狀態(tài)下L2 cache被disabled, 全部L2為SRAM。如果啟用了DSP/BIOS,則L2 cache被自動(dòng)使能;否則,可以通過(guò)調用CSL命令:CACHE_L2SetSize()來(lái)使能L2 cache。

>外部?jì)却娴腸acheability                                                                                                  
    L1D 和 L2可以通過(guò)調用CSL命令CACHE_enableCaching(CACHE_MARi)修改對應MAR-bit來(lái)控制外部?jì)却娑蔚腸acheability; 而對L1P,外部?jì)却婵偸莄acheability的,跟MAR無(wú)關(guān)。

注意:配置成cache的地址段就不能再放入data and code,因為鏈接的時(shí)候,是不包含cache地址段的,如果要使用L1D SRAM或L1P SRAM,

則應該相應減小cache段大小。

>example for C64x+ Linker Command File
    MEMORY
    {
       L2SRAM :   origin = 00800000h             length = 001C0000h
       CE0    :   origin = 80000000h             length = 01000000h (DDR第一個(gè)16M配置成可cache)
    }
    SECTIONS
    {
      .cinit      > L2SRAM
      .text        > L2SRAM
      .stack      > L2SRAM
      .bss         > L2SRAM
      .const      > L2SRAM
      .data        > L2SRAM
      .far           > L2SRAM
      .switch     > L2SRAM
      .sysmem > L2SRAM
      .tables      > L2SRAM
      .cio          > L2SRAM
      .external > CE0
    }

>example for C64x+ CSL Command Sequence to Enable Caching
[
   #include   <csl.h>
   #include   <csl_cache.h>
   ...
  
   CACHE_enableCaching(CACHE_CE00);
   CACHE_setL2Size(CACHE_256KCACHE);
]

二、cache一致性問(wèn)題

    如果內存是共享的,可以cache訪(fǎng)問(wèn)的,并且被修改了,那么這塊內存就存在cache一致性維護的問(wèn)題。對目前我們簡(jiǎn)單的編解碼器移植來(lái)說(shuō),存在A(yíng)RM與DSP的共享,但不存在同時(shí)修改的問(wèn)題,故無(wú)需一致性維護。 對C64x+ DSPs來(lái)說(shuō),其cache 控制器可以根據snoop command以硬件cache一致性協(xié)議來(lái)自動(dòng)維護由CPU EDMA/IDMA所訪(fǎng)問(wèn)數據的一致性。當DMA發(fā)起讀和寫(xiě)命令時(shí)就激活了一致性維護機制。當DMA讀L2 SRAM cache內存時(shí),數據直接從L1D cache提交給DMA,而不會(huì )在L2 SRAM更新;當DMA寫(xiě)時(shí),數據直接提交到L1D cache,并且更新L2 SRAM。

>除了一致性操作,對于DMA buffer,最好將其按L2 cacheline對齊,并保證其為cachelines size的整數倍,可以通過(guò)以下方式保證:
   #pragma DATA_ALIGN(InBuffA, CACHE_L2_LINESIZE)
   #pragma DATA_ALIGN(InBuffB, CACHE_L2_LINESIZE)
   #pragma DATA_ALIGN(OutBuffA,CACHE_L2_LINESIZE)
   #pragma DATA_ALIGN(OutBuffB,CACHE_L2_LINESIZE)

   unsigned char InBuffA [N*CACHE_L2_LINESIZE];
   unsigned char OutBuffA[N*CACHE_L2_LINESIZE];
   unsigned char InBuffB [N*CACHE_L2_LINESIZE];
   unsigned char OutBuffB[N*CACHE_L2_LINESIZE];
 
  位置規律
       使用Cache是基于時(shí)間和空間兩種規律,具體說(shuō)就是CPU讀取內存中的某一數據或指令很可能在下一時(shí)鐘周期或很短的時(shí)間內會(huì )使用這一指令相鄰的指令或數 據(空間),有時(shí)候當前使用的指令或數據會(huì )重復使用(時(shí)間),所以CPU不僅將當前指令讀進(jìn)Cache,而且會(huì )將相鄰指令一并讀入,讀入的大小取決于 Cache的大小和Cache line的大小.
       L1P是direct-mapped型,16K,512個(gè)line,每個(gè)line32byte,正好可以長(cháng)一個(gè)取指包,8條指令。
      Cache缺失有必然缺失,沖突缺失,容量缺失。
      L1D是set-associative型,16K,2way,每way128line,每line64byte,LRU指向最近最少使用的line,沒(méi) 有write miss,也就是說(shuō)L1D如果沒(méi)有要寫(xiě)的數據,通過(guò)write buffer(write buffer 4個(gè)入口,每個(gè)入口64bit)直接寫(xiě)到下一級存儲器,如果L1D又要寫(xiě)的數據就直接寫(xiě),并且dirty bit 置1,表示如果要替換該line的數據要先write back該line的數據到下一級存儲器,
      DM642有最大可配置為256K的二級Cache,一級cache read miss向二級cache查找,如果沒(méi)有就有二級cache向外部存儲器讀,然后傳給一級cache,最后送給CPU,如果這期間哪一級line的 dirty bit是1,就要向下一級cache進(jìn)行write back操作。對于不可cache的外部存儲器有CPU直接read.如果CPU對于二級cache write miss,二級cache首先要從外部存儲器讀入相應數據,CPU直接在二級cache上修改該數據,不會(huì )再將數據cache到L1D,因為L(cháng)1D是 read-allocate,同樣如果二級cache相應line的dirty bit是1就要先write back。
    
      兩種情況:1 DMA讀L2RAM某一line ,首先L2CACHE會(huì )檢查該line是否被cache在L1D,如果不是,DMA直接讀取L2RAMzhogndeshuju ,如果是會(huì )將L1D 中相應line的invalidate置位,并且write back數據到L2RAM中。2 DMA寫(xiě)L2RAM某一line,情況差不多。
      對于一般的CPU信號處理加上外圍設備的DMA數據讀寫(xiě)情況,處理方法是在內存中開(kāi)辟pingpong緩沖區。inbufa,outbufa, inbufb,outbufb四塊內存區,當CPU處理inbufa的數據并將產(chǎn)生的結果放到outbufa,這是外圍器件DMA搬移數據到 inbufb,另一外圍設備將數據從outbufb搬出;同理當CPU處理inbufb并將產(chǎn)生的結果放到outbufb時(shí),外圍設備利用DMA分別從 inbufa和outbufa搬入數據和搬出數據。一般L2RAM DMA實(shí)現代碼如下:
      for (i=0; i<(DATASIZE/BUFSIZE)–2; i+=2)
{
/* –––––––––––––––––––––––––––––––––––––––––––––––––––– */
/* InBuffA –> OutBuffA Processing */
/* –––––––––––––––––––––––––––––––––––––––––––––––––––– */
<DMA_transfer(peripheral, InBuffB, BUFSIZE)>
<DMA_transfer(OutBuffB, peripheral, BUFSIZE)>
process(InBuffA, OutBuffA, BUFSIZE);
/* ––––––––––––––––––––––––––––––––––––––––––––––––––––– */
/* InBuffB –> OutBuffB Processing */
/* ––––––––––––––––––––––––––––––––––––––––––––––––––––– */
<DMA_transfer(peripheral, InBuffA, BUFSIZE)>
<DMA_transfer(OutBuffA, peripheral, BUFSIZE)>
process(InBuffB, OutBuffB, BUFSIZE);
}
     上面CACHE的一致性由CPU自動(dòng)管理,無(wú)須程序員設置,而下面要說(shuō)的片外RAM開(kāi)辟雙緩沖區時(shí)要求程序員掌握L2cache 和片外RAM coherence(一致性)以及L2RAM和L1D的一致性,否則程序會(huì )出錯。
     對于C64x系列,無(wú)論什么時(shí)候當片外設備DMA寫(xiě)片外RAM開(kāi)辟的inbuf時(shí),都要使用CACHE_invL2(InBuffB, BUFSIZE, CACHE_WAIT),使L1D當中的inbuffb無(wú)效;當片外設備DMA讀片外RAM開(kāi)辟的outbuf時(shí),都要使用CACHE_wbL2 (OutBuffB, BUFSIZE, CACHE_WAIT),使L1D當中的相應數據write back 到片外RAM .
      External Memory DMA Double Buffering Code Example
for (i=0; i<(DATASIZE/BUFSIZE)–2; i+=2)
{
/* ––––––––––––––––––––––––––––––––––––––––––––––––––––– */
/* InBuffA –> OutBuffA Processing */
/* ––––––––––––––––––––––––––––––––––––––––––––––––––––– */
CACHE_wbInvL2(InBuffB, BUFSIZE, CACHE_WAIT);
<DMA_transfer(peripheral, InBuffB, BUFSIZE)>
CACHE_wbL2(OutBuffB, BUFSIZE, CACHE_WAIT);
<DMA_transfer(OutBuffB, peripheral, BUFSIZE)>
process(InBuffA, OutBuffA, BUFSIZE);
/* ––––––––––––––––––––––––––––––––––––––––––––––––––––– */
/* InBuffB –> OutBuffB Processing */
/* ––––––––––––––––––––––––––––––––––––––––––––––––––––– */
CACHE_wbInvL2(InBuffA, BUFSIZE, CACHE_WAIT);
<DMA_transfer(peripheral, InBuffA, BUFSIZE)>
CACHE_wbL2(OutBuffA, BUFSIZE, CACHE_WAIT);
<DMA_transfer(OutBuffA, peripheral, BUFSIZE)>
process(InBuffB, OutBuffB, BUFSIZE);
}
     雖然我們可以指定一定大小的buf被write back或者invalidate或者write back+invalidate,但是cache controller是對完整的line操作,這就要求我們在片外RAM開(kāi)辟內存( 或者數組)作buffer時(shí),盡量使得其大小是CACHE_L2_LINESIZE(128)的整數倍并且CACHE_L2_LINESIZE對齊,為此 我們需要:

     #pragma DATA_ALIGN(InBuffA, CACHE_L2_LINESIZE)
     #pragma DATA_ALIGN(InBuffB, CACHE_L2_LINESIZE)
     #pragma DATA_ALIGN(OutBuffA,CACHE_L2_LINESIZE)
     #pragma DATA_ALIGN(OutBuffB,CACHE_L2_LINESIZE)

來(lái)對齊buffer。
       使用宏#define CACHE_ROUND_TO_LINESIZE(cache,elcnt,elsize) \
                                                                                ((CACHE_#cache#_LINESIZE * \
                                                                                      ((elcnt)*(elsize)/CACHE_#cache#_LINESIZE) + 1) / \
                                                                                            (elsize))
來(lái)對其內存,使用如下;
unsigned char InBuffA [CACHE_ROUND_TO_LINESIZE(L2, N, sizeof(unsigned char)];
unsigned char OutBuffA[CACHE_ROUND_TO_LINESIZE(L2, N, sizeof(unsigned char)];
unsigned char InBuffB [CACHE_ROUND_TO_LINESIZE(L2, N, sizeof(unsigned char)];
unsigned char OutBuffB[CACHE_ROUND_TO_LINESIZE(L2, N, sizeof(unsigned char)];
這樣我們得到的數組就是內存對齊并且其大小是CACHE_L2_LINESIZE的整數倍,盡管這樣做浪費片外RAM。由于L2CACHE最大256K,所以如果生命的數組大小超過(guò)256K,就需要多用幾次cache write back和invalidate函數。
      如果程序沒(méi)有配置L2CACHE,也就是說(shuō)片內256K都作為RAM,那么當利用片外RAM開(kāi)辟buffer時(shí)要考慮的L1D和L1P與片外設備的一致性問(wèn)題,也有一組相應的write back和invalidate函數對應。

3   基于cache的程序優(yōu)化
   3.1   應用級優(yōu)化 (application-level optimization)
      1) 合理設置cache大小,盡量將DMA用到的buffer開(kāi)在片內RAM上
      2) 將一般性程序代碼和數據放到片外RAM,將DSP型代碼和數據放到L2RAM。所謂一般性代碼是指帶有很多條件分支轉移的指令,程序執行在空間上有隨意 性,不利于流水線(xiàn)的形成,外在片外可以發(fā)揮L2CACHE 4 way的優(yōu)勢。DSP型代碼是指算法型的代碼,放在L2RAM,CPU stall 時(shí)間少,可以充分發(fā)揮DSP速度快的優(yōu)勢。
   3.2 程序級優(yōu)化(procedural-level optimization)
      1)選擇合適的數據類(lèi)型。能用short就不要用int。
      2)將同一個(gè)函數要處理的數據盡量在內存中連續存放。
   3.3避免L1P read miss
      這種情況發(fā)生在一個(gè)循環(huán)體中有兩個(gè)或以上的函數要執行,要利用#pragma DATA_SECTION偽指令將和CMD文件將其在內存中相鄰定位,這樣不會(huì )發(fā)生兩個(gè)程序對應L1P中相同line所造成的沖突缺失。
     若果循環(huán)體中的兩個(gè)函數大小超過(guò)L1P容量,將這兩個(gè)函數分別放到兩個(gè)循環(huán)體中。這樣做會(huì )造成中間數據變量的加大。
     3.4避免L1D read miss
      利用#pragma DATA_SECTION偽指令將函數要同時(shí)處理的數組在內存中相鄰存放。最好再用#pragma DATA_MEM_BANK 將數組內存對齊

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Cache 優(yōu)化
DDR與SRAM間數據搬運Cache一致性問(wèn)題
解析 STM32 的啟動(dòng)過(guò)程(寫(xiě)的不錯)
基于dm642的H.264的算法改進(jìn)
mips一致性DMA映射、流式DMA映射的使用(轉)
Linux的內存管理
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久