新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > OpenEM 簡介和基于 OpenEM 的大矩陣乘實現

        OpenEM 簡介和基于 OpenEM 的大矩陣乘實現

        作者: 時間:2018-09-06 來源:網絡 收藏

        摘要

        本文引用地址:http://www.104case.com/article/201809/388587.htm

        OpenEM 的全稱是 Open Event Machine。是 TI 針對嵌入式應用開發的 multicore runtime system library。OpenEM 可以在多核上有效的調度,分發任務。它把任務調度給負載輕的核,進而實現動態的負載平衡。OpenEM 是基于 TI Keystone 系列芯片的 multicore Navigator 構建的,具有開銷小,效率高的特點。本文首先對 OpenEM 的原理做了簡單的介紹。然后結合一個大矩陣乘的演示用例詳細介紹了 OpenEM 的使用。最后通過量化分析這個演示用例的執行cycle 數,總結了 OpenEM 的效率和局限。希望本文能成為學習 OpenEM 的讀者的一個有用的參考。

        1、OpenEM 簡介

        OpenEM 的全稱是 Open Event Machine。它是 TI 開發的可應用于 Keystone 多核 DSP 的multicore runtime system library。OpenEM 的目的是在多核上有效的調度,分發任務,實現動態的負載平衡。基于 OpenEM,用戶可以很容易的把原來的單核應用移植到 Keystone 多核芯片。需要注意的是 OpenEM 目前只能把任務調度分發到同一個 DSP 的多個核上,不能跨 DSP 調度分發。 OpenEM不依賴于 BIOS。它可以在芯片上裸跑,代碼精簡,效率高。而且,OpenEM不同于業界已經有 OpenMP 和 OpenCL 等開放式的 multi-core runtime systems。它是針對嵌入式系統的設計,更能滿足嵌入式設計的實時性要求。TI 的 keystone 架構多核芯片中有 Multicore Navigator。它由 Queue Manager(簡稱為 QMSS)和一系列 Packet DMA engine 構成。OpenEM就是基于這套硬件系統構建的。例如,OpenEM 的 scheduler 是運行在 QMSS 的 PDSP(QMSS內部的 RISC 處理器)上的。OpenEM的 preload 功能是通過 QMSS 的 packet DMA 實現的。熟悉QMSS 的編程對學習 OpenEM 很有幫助。OpenEM 是 MCSDK 的一個組件。它還在不斷的發展改進中。本文對 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 是一個軟件對象關系圖,顯示出了表 1 中列舉的軟件對象。定義了 2 個 queue group,5 個queue 和 3 個 execution object。Queue group1 的 core mask 對應核 0 和 1。所以來自 queue1,2,3,4 的 event 只能在核 0 和核 1 上執行,因為這些 queue 屬于 queue group1。Queue group2 的 core mask 對應核 2 和 3。所以來自 queue5 的 event 只能在核 2 和核 3 上執行,因為queue5 屬于 queue group2。execution object 1 和 queue 1,2,3 映射關聯。execution object 2 和queue 4 映射關聯。execution object 3 和 queue 5 映射關聯。圖中的藍線表示了 event 的行徑,紅線表示 command 的行徑。圖中的 SD queue 是 hardware queue,它不是一個軟件對象而是OpenEM內部的組件。

        1.2 OpenEM 的兩個重要概念

        OpenEM中有兩個容易混淆的重要概念:prefetch 和 preload。

        • Prefetch 是指每個 DSP 核向 scheduler 發命令,告訴 scheduler“本核已經空閑了,可以分配新的工作給本核了”。只有收到一個核的 prefetch 命令,scheduler 才會調度新的 event 給這個核。如果 DSP 核不發出 prefetch 命令,它就不會被分派任務。這是 OpenEM 的 scheduler的基本調度原則。

        • Preload 和 event 的屬性有關。通常,event 的數據是位于 DDR 的。如果 DSP 核直接訪問DDR 效率會比較低。所以,OpenEM 可以把 event 的數據通過 QMSS 的 packet DMA 搬到DSP 核的 local L2。這個搬移的過程就是 preload。每個 event 的數據是否做 preload 是可配的。每個 event 在創建的時候都可以指定一個 preload 屬性。Event 的 preload 屬性可以是:

        – Preload disable, 即不做預搬移

        – Preload up to sizeA,即做預搬移,但是最多只搬 sizeA bytes

        – Preload up to sizeB,即做預搬移,但是最多只搬 sizeB bytes

        – Preload up to sizeC,即做預搬移,但是最多只搬 sizeC bytes

        – 其中 SizeA,SizeB 和 SizeC 是常數,在 OpenEM 初始化的時候可以配置。

        1. 3 OpenEM 的常用 API cycle 數

        OpenEM的附帶開銷是應用最關注特性之一。所以我們實測了 OpenEM 常用 API 的 cycle 數如表2。需要注意的是:由于 OpenEM會負責 cache 一致性的維護,而有些 API 的處理過程中含有cache 一致性的維護操作。所以這些 API 的調用 cycle 數很大程度上取決于它對多大的數據緩沖區做了 cache 一致性的維護。本文測試這些 cycle 的場景使用的數據緩沖區的大小是是 4096 words(32bit)。

        2、基于 OpenEM 的大矩陣乘實現

        大矩陣相乘的目的是計算 X*Y = Z

        矩陣 X 是(100 × 2048 )的浮點實數矩陣。

        矩陣 Y 是(2048 × 2048 )的浮點實數矩陣。

        矩陣 Z 是(100 × 2048 )的浮點實數矩陣。

        由于矩陣 Y 的數據量很大,所以在多核 DSP 上可以把它拆分成多個子塊,交給多個 DSP 核并行計算。如圖 2 所示。

        2.1 基于 OpenEM 的大矩陣乘方案設計

        2.1.1 Memory 使用


        上一頁 1 2 3 4 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 白水县| 盘锦市| 凤山市| 碌曲县| 吉林市| 北宁市| 龙门县| 绥化市| 阿拉尔市| 中牟县| 云浮市| 双流县| 泾源县| 盐山县| 陈巴尔虎旗| 阜新市| 化隆| 新余市| 徐州市| 太谷县| 乐平市| 扶绥县| 丽水市| 时尚| 景谷| 化州市| 宁城县| 中山市| 浦东新区| 静宁县| 邵武市| 锦州市| 修武县| 达孜县| 安平县| 南通市| 宣汉县| 镇巴县| 黔南| 大同市| 昔阳县|