OpenEM 簡介和基于 OpenEM 的大矩陣乘實現(xiàn)
摘要
本文引用地址:http://cafeforensic.com/article/201809/388587.htmOpenEM 的全稱是 Open Event Machine。是 TI 針對嵌入式應(yīng)用開發(fā)的 multicore runtime system library。OpenEM 可以在多核上有效的調(diào)度,分發(fā)任務(wù)。它把任務(wù)調(diào)度給負載輕的核,進而實現(xiàn)動態(tài)的負載平衡。OpenEM 是基于 TI Keystone 系列芯片的 multicore Navigator 構(gòu)建的,具有開銷小,效率高的特點。本文首先對 OpenEM 的原理做了簡單的介紹。然后結(jié)合一個大矩陣乘的演示用例詳細介紹了 OpenEM 的使用。最后通過量化分析這個演示用例的執(zhí)行cycle 數(shù),總結(jié)了 OpenEM 的效率和局限。希望本文能成為學(xué)習(xí) OpenEM 的讀者的一個有用的參考。
1、OpenEM 簡介
OpenEM 的全稱是 Open Event Machine。它是 TI 開發(fā)的可應(yīng)用于 Keystone 多核 DSP 的multicore runtime system library。OpenEM 的目的是在多核上有效的調(diào)度,分發(fā)任務(wù),實現(xiàn)動態(tài)的負載平衡?;?OpenEM,用戶可以很容易的把原來的單核應(yīng)用移植到 Keystone 多核芯片。需要注意的是 OpenEM 目前只能把任務(wù)調(diào)度分發(fā)到同一個 DSP 的多個核上,不能跨 DSP 調(diào)度分發(fā)。 OpenEM不依賴于 BIOS。它可以在芯片上裸跑,代碼精簡,效率高。而且,OpenEM不同于業(yè)界已經(jīng)有 OpenMP 和 OpenCL 等開放式的 multi-core runtime systems。它是針對嵌入式系統(tǒng)的設(shè)計,更能滿足嵌入式設(shè)計的實時性要求。TI 的 keystone 架構(gòu)多核芯片中有 Multicore Navigator。它由 Queue Manager(簡稱為 QMSS)和一系列 Packet DMA engine 構(gòu)成。OpenEM就是基于這套硬件系統(tǒng)構(gòu)建的。例如,OpenEM 的 scheduler 是運行在 QMSS 的 PDSP(QMSS內(nèi)部的 RISC 處理器)上的。OpenEM的 preload 功能是通過 QMSS 的 packet DMA 實現(xiàn)的。熟悉QMSS 的編程對學(xué)習(xí) OpenEM 很有幫助。OpenEM 是 MCSDK 的一個組件。它還在不斷的發(fā)展改進中。本文對 OpenEM 的介紹以及演示用例都是基于 BIOS MCSDK 2.01.02 的 OpenEM 1.0.0.2。
1.1 OpenEM 的軟件對象
下面通過列表和圖示介紹了 OpenEM的主要軟件對象。表 1 是 OpenEM 的主要軟件對象的列表。
需要注意的是,本文介紹的 OpenEM 的運行模式是:Scheduler 運行在 PDSP,Dispatcher 是“run to completion ”模式。
圖 1 是一個軟件對象關(guān)系圖,顯示出了表 1 中列舉的軟件對象。定義了 2 個 queue group,5 個queue 和 3 個 execution object。Queue group1 的 core mask 對應(yīng)核 0 和 1。所以來自 queue1,2,3,4 的 event 只能在核 0 和核 1 上執(zhí)行,因為這些 queue 屬于 queue group1。Queue group2 的 core mask 對應(yīng)核 2 和 3。所以來自 queue5 的 event 只能在核 2 和核 3 上執(zhí)行,因為queue5 屬于 queue group2。execution object 1 和 queue 1,2,3 映射關(guān)聯(lián)。execution object 2 和queue 4 映射關(guān)聯(lián)。execution object 3 和 queue 5 映射關(guān)聯(lián)。圖中的藍線表示了 event 的行徑,紅線表示 command 的行徑。圖中的 SD queue 是 hardware queue,它不是一個軟件對象而是OpenEM內(nèi)部的組件。
1.2 OpenEM 的兩個重要概念
OpenEM中有兩個容易混淆的重要概念:prefetch 和 preload。
• Prefetch 是指每個 DSP 核向 scheduler 發(fā)命令,告訴 scheduler“本核已經(jīng)空閑了,可以分配新的工作給本核了”。只有收到一個核的 prefetch 命令,scheduler 才會調(diào)度新的 event 給這個核。如果 DSP 核不發(fā)出 prefetch 命令,它就不會被分派任務(wù)。這是 OpenEM 的 scheduler的基本調(diào)度原則。
• Preload 和 event 的屬性有關(guān)。通常,event 的數(shù)據(jù)是位于 DDR 的。如果 DSP 核直接訪問DDR 效率會比較低。所以,OpenEM 可以把 event 的數(shù)據(jù)通過 QMSS 的 packet DMA 搬到DSP 核的 local L2。這個搬移的過程就是 preload。每個 event 的數(shù)據(jù)是否做 preload 是可配的。每個 event 在創(chuàng)建的時候都可以指定一個 preload 屬性。Event 的 preload 屬性可以是:
– Preload disable, 即不做預(yù)搬移
– Preload up to sizeA,即做預(yù)搬移,但是最多只搬 sizeA bytes
– Preload up to sizeB,即做預(yù)搬移,但是最多只搬 sizeB bytes
– Preload up to sizeC,即做預(yù)搬移,但是最多只搬 sizeC bytes
– 其中 SizeA,SizeB 和 SizeC 是常數(shù),在 OpenEM 初始化的時候可以配置。
1. 3 OpenEM 的常用 API cycle 數(shù)
OpenEM的附帶開銷是應(yīng)用最關(guān)注特性之一。所以我們實測了 OpenEM 常用 API 的 cycle 數(shù)如表2。需要注意的是:由于 OpenEM會負責(zé) cache 一致性的維護,而有些 API 的處理過程中含有cache 一致性的維護操作。所以這些 API 的調(diào)用 cycle 數(shù)很大程度上取決于它對多大的數(shù)據(jù)緩沖區(qū)做了 cache 一致性的維護。本文測試這些 cycle 的場景使用的數(shù)據(jù)緩沖區(qū)的大小是是 4096 words(32bit)。
2、基于 OpenEM 的大矩陣乘實現(xiàn)
大矩陣相乘的目的是計算 X*Y = Z
矩陣 X 是(100 × 2048 )的浮點實數(shù)矩陣。
矩陣 Y 是(2048 × 2048 )的浮點實數(shù)矩陣。
矩陣 Z 是(100 × 2048 )的浮點實數(shù)矩陣。
由于矩陣 Y 的數(shù)據(jù)量很大,所以在多核 DSP 上可以把它拆分成多個子塊,交給多個 DSP 核并行計算。如圖 2 所示。
2.1 基于 OpenEM 的大矩陣乘方案設(shè)計
2.1.1 Memory 使用
評論