OpenEM 簡(jiǎn)介和基于 OpenEM 的大矩陣乘實(shí)現(xiàn)
2.3.2 基于 OpenEM 的性能測(cè)試結(jié)果
基于 OpenEM的演示用例實(shí)現(xiàn)過程中,DSP 代碼中嵌入了少量測(cè)試代碼收集運(yùn)行的 cycle 信息。每個(gè)核把自己處理每個(gè) event 的起始和結(jié)束時(shí)間記錄在內(nèi)存(我們通過一個(gè)全局 timer 來保證所有DSP 核記錄的時(shí)間戳在時(shí)間軸上是同步的)。這些時(shí)間戳用 CCS 存到主機(jī)做后處理分析。通過分析,我們可以得到 8 個(gè) DSP 核并行處理消耗的時(shí)間。還可以分析每個(gè) DSP 核的忙/閑區(qū)間。
測(cè)試結(jié)果是,從第一個(gè) event 開始處理到最后一個(gè) event 處理完,總時(shí)間是 31,433,438 cycle,也就是 31.4ms。也就是說,通過 OpenEM把單 DSP 核的工作負(fù)載平衡到 8 個(gè) DSP 核上能達(dá)到的DSP 核利用率是 190,574,214/(31,433,438*8)= 76%。
通過對(duì)時(shí)間戳的處理我們得到下面的運(yùn)行圖,“-”表示 receiver 函數(shù)處理 event 的區(qū)間,本文稱之為有效時(shí)間。“#”表示 receiver 之外的區(qū)間(也就是代碼在 dispatcher 中執(zhí)行的區(qū)間),本文稱之為調(diào)度開銷。每個(gè)“-”和“#”刻度表示 100,000 CPU cycle。
從上面的執(zhí)行圖看,調(diào)度開銷不小,占了大約 15~20%的時(shí)間。但是這只是表面的現(xiàn)象。實(shí)際上,調(diào)度開銷的大部分時(shí)間里,Dispatcher 是在查詢 hardware queue,等待新的 event。這是因?yàn)閜reload 沒能及時(shí)完成導(dǎo)致的。因?yàn)橥瑫r(shí)給 8 個(gè)核做 preload 需要很大的數(shù)據(jù)搬移的流量。根據(jù)以往的測(cè)試結(jié)果。使用 QMSS 的 packet DMA 從 DDR3 輸入數(shù)據(jù)到 local L2 的流量大約是 4G bytes 每秒。那么 preload 8 個(gè) event 總的數(shù)據(jù)量是 4byte * 2048 rows * 16 columns * 8 core = 1M bytes,需要的時(shí)間是 1/4 ms。因?yàn)槊總€(gè)“-”和“#”刻度表示 100,000 CPU cycle,運(yùn)行圖中紅線長(zhǎng)度就代表 preload 8 個(gè) event 的時(shí)間,它非常接近 250,000 cycle。理論計(jì)算和實(shí)際值基本吻合,所以我們認(rèn)為調(diào)度延遲是 packet DMA 的傳輸流量不足導(dǎo)致的。
我們也測(cè)試了不使用 pre-load 的場(chǎng)景。觀測(cè)到 scheduler 調(diào)度一個(gè) event 的延遲大約是 1200 個(gè)C66 CPU cycle。但是 DSP 核處理一個(gè) event 的耗時(shí)增大到原來的 10 倍。所以,pre-load 雖然會(huì)導(dǎo)致 QMSS packet DMA 流量不足成為凸顯的瓶頸,但是從總體效率來看還是非常必要的。
細(xì)心的讀者可能會(huì)發(fā)現(xiàn) 76% + 20% = 96%,并不是 100%。我們分析時(shí)間戳發(fā)現(xiàn),8 個(gè) DSP 核同時(shí)運(yùn)行的場(chǎng)景下,每個(gè)核處理一個(gè) 100*2048 × 2048*16 的矩陣乘的時(shí)間比只有一個(gè) DSP 核運(yùn)行的場(chǎng)景下的時(shí)間稍長(zhǎng)。原因是: 我們的演示用例中 X 矩陣和 Z 矩陣是存儲(chǔ)在 shared L2 的, 8 個(gè)核同時(shí)運(yùn)行就會(huì)同時(shí)讀寫這兩個(gè) buffer,導(dǎo)致產(chǎn)生 shared L2 的 bank 沖突。 所以性能下降了。
3、總結(jié)
OpenEM具有使用簡(jiǎn)單,功能實(shí)用,執(zhí)行高效的特點(diǎn)。能在 KeyStone 多核 DSP 上實(shí)現(xiàn)動(dòng)態(tài)的負(fù)載平衡。它一方面提供了強(qiáng)大的功能,另一方面也給應(yīng)用留出了很大的靈活性。例如,通過讓應(yīng)用初始化 free pool 方便了 buffer 的管理。OpenEM 的現(xiàn)有功能已經(jīng)能夠支持基本的應(yīng)用。隨著版本更新功能還將不斷完善。
Reference
Ref[1] ti.openem.white.paper.pdf 位于 OpenEM 安裝目錄
評(píng)論