天天看點

關于DM8168中移植算法速度慢、效率低的新發現

       有不少的朋友,特别是剛剛接觸dsp的朋友。基于dvrrdk編寫c代碼發現執行速度特别慢,我在上面簡單的對每一個像素的uv分量指派=0x80,這樣就成了灰階圖像。對1080p圖像進行操作,發現處理每幀要耗時10-20ms,真是慢的不可思議。

       近期将swosd的完整代碼看了一遍發現了玄機。

       主要問題是在ddr中讀寫資料拖慢了速度。

       經測試swosd進行一幀d1的疊加僅須要400us(疊加大小大概208*32*3個窗體);

       細緻分析。其内部使用了基于内部 ialg_daram0(雙通片上資料存儲)的乒乓緩存結構:

此函數為tms320 algorithm standard 即xdais中的 algalloc()函數的實作。其傳回一個該算法所需的記憶體記錄表。(詳見spru360e)

在使用時:

然後内部将要處理的資料用dma複制到memlinebuf,并使用乒乓結構:

至于上面的代碼片段中目的位址 (void *)((uint32)plinebufa[0] + 0x30000000)中為什麼在plinebufa[0] 加了0x30000000還是沒有弄明确。請高人指點。

(由于dma是個外設,他看到的位址和dsp看到的位址是不一樣的。

之間有個0x30000000的偏移。

l2 sram address is 0x108_00000. the l3 address of c674 l2 sram address (gem umap0) is 0x408_0000 .the conversion is from 0x108_0000 to 0x408_0000 by adding 0x0300_0000. dont use 0x300_0000 .it will crash the system.)

本文眼下僅僅總結出了原因,至于實作正在嘗試。

歡迎交流溝通。