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