前言
嵌入式領域的處理器已向多核架構迅速發展,TI公司的KeyStone架構的TMS320C6678是目前市面上性能最高的多核DSP處理器。TMS320C6678集成8核C66x DSP處理器,每個內核頻率高達1.25 GHz,提供每秒高達40 GMAC定點運算和20 GFLOP浮點運算能力;1片TMS320C6678提供等效達10 GHz的內核頻率,單精度浮點並行運算能力理論上可達160 GFLOP,是TS201S的50倍、C67x+的115.2倍,適合於諸如油氣勘探、雷達信號處理、圖像處理以及定位導航等對定浮點運算能力及實時性有較高要求的超高性能計算應用。
然而,核間通信是多核處理器系統所面臨的主要難點,通信機制的優劣直接影響多核處理器的性能,高效的通信機制是發揮多核處理器高性能的重要保障。
創龍科技(Tronlong)專注於DSP、ARM、FPGA多核異構技術開發,本文爲您介紹TMS320C6678處理器開發中比較常用的兩種多核通信方式:TI-IPC和OpenMP,以及多核編程注意事項。
1 硬件平臺
本文基於創龍科技TL6678-EasyEVM評估板進行演示。
TL6678-EasyEVM是一款基於TI KeyStone架構C6000系列TMS320C6678八核C66x定點/浮點高性能處理器設計的高端多核DSP評估板,由核心板與底板組成。核心板經過專業的PCB Layout和高低溫測試驗證,穩定可靠,可滿足各種工業應用環境。
評估板接口資源豐富,引出雙路千兆網口、SRIO、PCIe等高速通信接口,方便用戶快速進行產品方案評估與技術預研。
TL6678-EasyEVM評估板
開發案例主要包括:
(1) 裸機開發案例
(2) RTOS(SYS/BIOS)開發案例
(3) IPC、OpenMP多核開發案例
(4) SRIO、PCIe、雙千兆網口開發案例
(5) 圖像處理開發案例
(6) DSP算法開發案例
(7) 串口、網絡遠程升級開發案例
C66x DSP視頻教程、中文手冊、產品資料(用戶手冊、核心板硬件資料、產品規格書)可點:site.tronlong.com/pfdownload 直接獲取。
2 OpenMP
2.1 簡介
OpenMP是一種多核開發軟件框架,其主要特性如下:
(1) 可跨平臺使用,代碼兼容性強。
(2) 以共享內存爲通信基礎。
(3) 支持C/C++以及Fortran語言。
(4) 一般基於SYS/BIOS運行。
2.2 基本語法
#pragma omp 指令 [子句 [ [ [,]子句 ] ... ]
{
...
}
表3
指令 |
說明 |
parallel |
開始並行執行語句 |
for |
在多個線程中並行執行for循環 |
sections |
包含多個可並行執行的sectone結構體 |
single |
單線程執行 |
master |
主線程執行 |
critical |
任意時刻僅可被單個線程執行 |
barrier |
指定屏障,用於同步所有線程 |
taskwait |
等待子線程完成 |
atomic |
確保指定內存位置執行原子更新操作 |
flush |
使線程當前內存數據與實際內存數據一致 |
ordered |
並行執行的for循環將按循環體變量順序執行 |
threadprivate |
指定變量爲本地存儲 |
表4
子句 |
說明 |
default |
控制parallel或task結構體中變量數據的共享屬性 |
shared |
parallel或task結構中,一個或多個變量爲共享變量 |
private |
一個或多個變量爲本地變量 |
firstprivate |
一個或多個變量爲本地變量,且變量值爲並行結構執行前的值 |
lastprivate |
一個或多個變量爲本地變量,且變量值爲並行結構執行後的值 |
reduction |
一個或多個變量爲本地變量,但變量值將根據不同的運算符來決定,執行完成後變量值將被更新 |
copyin |
使線程本地變量值與主線程變量值相同 |
copyprivate |
使屬於parallel區域的變量值在不同線程中相同 |
schedule |
設置for循環並行執行方式:dynamic、guided、runtime和static |
num_threads |
線程數目 |
if |
並行語句執行條件 |
nowait |
忽略線程同步等待 |
以裸機的omp_matavec案例爲例,使用場景的概要流程圖如下。
C66xx_0核心創建主線程,通過OpenMP框架加載matvec算法至C66xx_0~C66xx_7核心進行並行運算,從而減少C66xx_0核心負載,並可加快運算速度。
2.3 代碼分析
以裸機的omp_matavec案例爲例進行代碼分析,見圖中註釋。
3 TI-IPC
3.1 簡介
TI-IPC(Inter-Processor Communication)組件提供與處理器硬件無關的API,可用於多核處理器核間通信、同一處理器進程間通信和設備間通信。API支持消息傳遞、流和鏈接列表,它們在單處理器和多處理器中配置均可兼容。
TI-IPC被設計在運行SYS/BIOS應用程序的處理器上使用,一般爲DSP處理器(如TMS320C6678、TMS320C6657),但在某些情況下亦可能是ARM處理器。
IPC常見的通信模塊如下:
表1
Ipc |
提供Ipc_start()函數,並允許配置啓動順序 |
MessageQ |
大小可變的消息傳遞模塊 |
Notify |
以中斷方式實現輕量數據傳輸的模塊 |
ListMp |
用於實現對鏈接列表的互斥訪問 |
GateMp |
用於實現對共享資源的互斥訪問 |
HeapBufMp |
大小固定的共享內存堆 |
HeapMenMp |
大小可變的共享內存堆 |
SharedRegion |
用於維護共享內存區域 |
List |
用於創建雙向鏈接列表 |
MultiProc |
用於管理多核處理器核心ID |
NameServer |
用於應用程序基於本地名稱檢索,以及存儲變量值 |
3.2 常用模塊
3.2.1 MessageQ
該模塊具有如下特點:
(1) 兼容性強,可在不更改運行代碼的情況移植至另一個支持TI-IPC MessageQ的處理器或其他傳輸層(如Shared Memory、Multicore Navigator、SRIO)。
(2) 支持可變長度消息的結構化發送與接收。
(3) 單個MessageQ隊列支持單個reader和多個writer。
(4) 消息接收支持超時機制。
(5) reader可根據消息頭部信息對writer進行確認後再回復。
(6) Ipc_start()會幫助用戶完成下圖中灰色框內的功能,用戶僅需關注紅色框中的內容即可。
MessageQ通過消息隊列發送和接收消息。reader是一個從消息隊列中讀取消息的線程,writer是一個將消息寫入消息隊列的線程。每個消息隊列都有一個reader,但可有多個writer。
■ reader:調用MessageQ_create()、MessageQ_get()、MessageQ_free()和MessageQ_delete()。
■ writer:調用MessageQ_open()、MessageQ_alloc()、MessageQ_put()和MessageQ_close()。
MessageQ常見的工作流程如下所示。
下面以多核IPC通信的shmIpcBenchmark案例爲例,分析代碼中MessageQ的使用,見圖中註釋。
3.2.2 Notify
該模塊具有如下特點:
(1) 可獨立於MessageQ模塊進行使用。
(2) 着重於多核通知功能,是更爲簡單的多核通信形式。
(3) 僅可基於Shared Memroy方式進行使用。
Notify通過硬件中斷傳輸消息,Receiver註冊Notify事件中斷,Sender通過Notify發送事件中斷,從而實現通知並攜帶小量消息的目的。
■ Receiver:調用Notify_registerEvent()註冊事件中斷服務函數。
■ Sender:調用Notify_sendEvent()發送事件中斷。
Notify常見的工作流程如下所示。
3.3 物理傳輸方式
TI-IPC的數據傳輸需結合特定物理硬件與底層驅動,方可實現兩個線程在同一個設備或跨設備間進行通信。常用三種的物理傳輸方式包括Shared Memory、Multicore Navigator和SRIO,具體說明如下。
表2
傳輸方式 |
優點 |
缺點 |
Shared Memory |
使用簡單,速率較高 |
僅可用於單個設備IPC通信,可能與其他使用Shared Memory的任務存在競爭 |
Multicore Navigator |
速率最高,消耗CPU週期最少 |
僅可用於單個設備IPC通信 |
SRIO |
可用於跨設備IPC通信 |
速率最低 |
下圖爲使用Multicore Navigator、SRIO的API調用流程,用戶僅需關注MessageQ部分操作即可,其他模塊均由系統自動調用。
4 多核編程注意事項
4.1 多核單/多鏡像
在開發過程中,需將程序可執行文件分別加載至對應的核心運行。此時需瞭解多核單/多鏡像的優缺點,再根據實際情況進行選擇。
多核單鏡像
多核單鏡像指所有核心運行完全相同的用戶程序。
優點:僅需維護一個工程,管理便捷。
缺點:需兼容多個核心代碼,程序可執行文件較大。
多核多鏡像
多核多鏡像指不同核心運行不同的用戶程序。
優點:無需考慮各核心功能的兼容性,單個程序可執行文件較小。
缺點:需維護多個工程,管理不便。
4.2 外設訪問
所有核心共享外設,如SRIO、PCIe、Ethernet、SPI、I2C、EMIF等。在對外設進行初始化後,所有核心可在任意時間對外設進行讀寫,無需再次初始化。
4.3 數據存儲
(1) 注意區分全局與局部地址。
L1/L2SRAM有全局與局部兩個地址,全局地址可被所有核心訪問,但局部地址僅可被指定核心訪問。
以C66xx_0核心的L2SRAM爲例,對應的全局地址爲0x10800000,局部地址爲0x00800000。C66xx_0核心使用0x10800000或0x00800000,均可訪問C66xx_0核心的L2SRAM。而C66xx_1核心使用0x00800000僅可訪問C66xx_1核心的L2SRAM,使用0x10800000方可訪問C66xx_0核心的L2SRAM。
L2SRAM全局與局部地址對應關係如下表:
表5
核心 |
全局地址 |
局部地址 |
C66xx_0 |
0x10800000 |
0x00800000 |
C66xx_1 |
0x11800000 |
0x00800000 |
C66xx_2 |
0x12800000 |
0x00800000 |
C66xx_3 |
0x13800000 |
0x00800000 |
C66xx_4 |
0x14800000 |
0x00800000 |
C66xx_5 |
0x15800000 |
0x00800000 |
C66xx_6 |
0x16800000 |
0x00800000 |
C66xx_7 |
0x17800000 |
0x00800000 |
(2)注意避免內存衝突。
如數據需存放至MSMCSRAM、DDR3共享內存設備,請將對應內存劃分爲MSMCSRAM_MASTER段(主核使用)與MSMCSRAM_SLAVE段(從核使用),從而避免運行時內存衝突。
5 參考鏈接
-IPC
https://training.ti.com/system/files/docs/keystone-intro-ipc-slides.pdf
https://processors.wiki.ti.com/index.php/IPC_Users_Guide/MessageQ_Module
-OpenMP
http://processors.wiki.ti.com/index.php/OpenMP_on_C6000
https://processors.wiki.ti.com/index.php/BIOS_MCSDK_2.0_User_Guide#OpenMP
http://community.topcoder.com/tc?module=Static&d1=features&d2=091106
-Multicore Programming Guide
https://www.ti.com/lit/an/sprab27b/sprab27b.pdf
6 免費試用
可以直接到廠家官網免費申請TL6678-EasyEVM評估板進行快速評估。
7 技術交流
TMS320C6678 DSP交流:79635273、332643352
8 更多推薦