簡體   English   中英

如何使用DSP加速OMAP上的代碼?

[英]How to use DSP to speed-up a code on OMAP?

我正在為OMAP3430開發視頻編解碼器。 我已經有用C ++編寫的代碼,我嘗試修改/移植它的某些部分以利用DSP(SDK(OMAP ZOOM3430 SDK)我有一個額外的DSP)。

我嘗試移植一個小的for循環,它運行的是非常少量的數據(~250字節),但是在不同的數據上運行大約2M次。 但CPU和DSP之間通信的過載遠遠超過增益(如果我有的話)。

我認為這個任務就像在普通計算機中優化GPU的代碼一樣。 我的問題是移植什么樣的部件會有益? GPU程序員如何處理這些任務?

編輯:

  1. GPP應用程序分配大小為0x1000字節的緩沖區。
  2. GPP應用程序調用DSPProcessor_ReserveMemory為每個分配的緩沖區保留DSP虛擬地址空間,使用比分配的緩沖區大4K的大小來考慮自動頁面對齊。 總預留大小也必須沿4K頁面邊界對齊。
  3. GPP應用程序調用DSPProcessor_Map將每個分配的緩沖區映射到上一步中保留的DSP虛擬地址空間。
  4. GPP應用程序准備一條消息,通知DSP執行階段虛擬地址空間的基地址,該地址已映射到GPP上分配的緩沖區。 GPP應用程序使用DSPNode_PutMessage將消息發送到DSP。
  5. GPP調用memcpy將要處理的數據復制到共享內存中。
  6. GPP應用程序調用DSPProcessor_FlushMemory以確保已刷新數據高速緩存。
  7. GPP應用程序准備一條消息,通知DSP執行階段已完成寫入緩沖區,DSP現在可以訪問緩沖區。 該消息還包含寫入緩沖區的數據量,以便DSP知道要復制的數據量。 GPP使用DSPNode_PutMessage將消息發送到DSP,然后調用DSPNode_GetMessage等待從DSP聽回消息。

在這些之后,DSP程序的執行開始,並且DSP在完成處理時通過消息通知GPP。 只是為了嘗試我不在DSP程序中進行任何處理。 我只是將“處理完成”消息發送回GPP。 這仍然需要耗費大量時間。 可能是因為內部/外部內存使用,還是因為通信過載?

OMAP3430沒有板載DSP,它有一個連接到系統總線的IVA2 +視頻/音頻解碼引擎,Cortex核心具有類似DSP的SIMD指令。 OMAP3430上的GPU是基於PowerVR SGX的設備。 雖然它確實有可編程着色器,但我不認為有任何支持通用編程ala CUDA或OpenCL。 我可能錯了,但我從來沒有聽說過這樣的支持

如果您使用板載的IVA2 +編碼/解碼引擎,則需要為此單元使用適當的庫,並且它僅支持我所知道的特定編解碼器。 您是否正在嘗試將自己的庫編寫到此模塊中?

如果您使用Cortex的內置DSPish(SIMD指令),請發布一些代碼。

如果您的開發板上有一些額外的DSP,那么什么是DSP以及它如何連接到OMAP?

至於桌面GPU的問題,在視頻解碼的情況下,你使用供應商提供的功能庫來調用硬件,有幾個,Linux上的Nvidia VDAPU,Windows上類似的庫(我認為它叫PureViewHD)。 ATI還有用於板載解碼引擎的linux和windows庫,我不知道名字。

我不知道您的傳輸數據的時間基准是什么,但我知道SDK的規格表中列出的TMS32064x具有非常強大的DMA引擎。 (我假設它是原始的ZOOM OMAP34X MDK。它說它有64xx。)我希望OMAP有一些simalar,使用它們是最充分的優勢。 我建議在64xx的內部ram中設置“乒乓”緩沖區,並使用SDRAM作為共享內存,並通過DMA進行傳輸處理。 外部RAM將成為任何6xxx系列器件的瓶頸,因此請保留可鎖定在內部存儲器中的任何內容以提高性能。 通常,這些部件能夠在內部存儲器中將8個32位字總線連接到處理器內核,但是根據它允許您映射為直接訪問RAM的級別緩存,部件之間會有所不同。 TI的成本敏感部件將“可映射存儲器”移動得比其他一些芯片更遠。 此外,TI提供的所有部件手冊均可以PDF格式免費下載。 他們甚至給了我免費的TMS320C6000 CPU和指令集手冊和許多其他書籍的硬拷貝。

就編程而言,您可能需要使用一些“處理器內在函數”或內聯匯編來優化您正在進行的任何數學運算。 對於64xx有利於整數操作,因為它沒有內置浮點核心。 (這些是在67xx系列中。)如果查看執行單元並且您可以映射計算,使得不同的部分以可以在單個循環中發生的方式針對不同的操作,那么您將能夠實現最佳性能那些部分。 指令集手冊列出了每個執行單元執行的操作類型。 如果您可以打破計算到雙數據流集並稍微展開循環,那么當完全優化啟用時,編譯器將“更好”。 這是因為處理器分為左側和右側,兩側的執行單元幾乎相同。

希望這可以幫助。

根據我的測量結果,CPU和DSP之間的一個消息傳遞周期大約需要160us。 我不知道這是因為我使用的內核還是橋驅動程序; 但這是一個非常長的時間來進行簡單的來回傳遞。

如果總計算負載與消息傳遞所需的時間相當,那么將算法移植到DSP似乎是合理的。 如果算法適合在CPU和DSP上同時計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM