MathWorks信號(hào)處理系統(tǒng)設(shè)計(jì)往往涉及復(fù)雜的算法或者數(shù)據(jù)密集型應(yīng)用,因此通常具有較高的計(jì)算復(fù)雜度。構(gòu)建和仿真這些復(fù)雜系統(tǒng)可能相當(dāng)耗時(shí)。Simulink 中的數(shù)據(jù)流執(zhí)行域功能是減少模型仿真時(shí)間的方法之一。該功能可以對(duì) Simulink 模型自動(dòng)分區(qū),然后使用主機(jī)上閑置的 CPU 內(nèi)核并行執(zhí)行各分區(qū),從而加速仿真。本文說明如何通過三個(gè)簡單步驟來設(shè)置數(shù)據(jù)流。然后,我們用無線電模型作為示例來演示數(shù)據(jù)流的實(shí)際運(yùn)用,并比較啟用和未啟用數(shù)據(jù)流的模型仿真時(shí)間。此示例中使用的模型可以直接點(diǎn)擊文末“閱讀原文”下載。
數(shù)據(jù)流使用的并行機(jī)制類型
為進(jìn)行模型分區(qū)和并行執(zhí)行,數(shù)據(jù)流會(huì)采用以下數(shù)據(jù)和任務(wù)并行機(jī)制組合之一(圖 1):
顯式并行機(jī)制通過不同算法處理不同數(shù)據(jù)集。
展開并行機(jī)制通過同一算法處理一個(gè)數(shù)據(jù)流的連續(xù)幀。
管道并行機(jī)制通過不同算法處理同一數(shù)據(jù)的不同部分。
設(shè)置數(shù)據(jù)流
要在 Simulink 模型中啟用數(shù)據(jù)流執(zhí)行域,首先要實(shí)現(xiàn)子系統(tǒng)。實(shí)現(xiàn)方式取決于您的具體設(shè)計(jì)進(jìn)度。如果您的設(shè)計(jì)剛剛開始,請(qǐng)使用 DSP System Toolbox 中的 Dataflow Subsystem 模塊(圖 2)。該模塊經(jīng)過預(yù)配置,可以直接使用。您只需將它拖到 Simulink 模型中,然后在其中填充算法組件。 如果您的設(shè)計(jì)模型已構(gòu)建完畢,請(qǐng)將表示要并行化的算法的模塊放在子系統(tǒng)中,并按如下方式設(shè)置數(shù)據(jù)流:
選擇您剛剛創(chuàng)建的子系統(tǒng)。
在屬性檢查器的“執(zhí)行”選項(xiàng)卡下,勾選設(shè)置執(zhí)行域復(fù)選框。
將域選項(xiàng)設(shè)置為數(shù)據(jù)流。
在子系統(tǒng)內(nèi)部,左下角的 》 圖標(biāo)表示子系統(tǒng)設(shè)置為數(shù)據(jù)流執(zhí)行域。數(shù)據(jù)流執(zhí)行域首先通過在單線程上運(yùn)行模型來分析模型,然后自動(dòng)進(jìn)行子系統(tǒng)分區(qū)以用于多線程執(zhí)行。
數(shù)據(jù)流的實(shí)際運(yùn)用
該示例模型對(duì)無線電發(fā)射機(jī)和接收機(jī)進(jìn)行仿真。它包含數(shù)字上變頻器和下變頻器來調(diào)整信號(hào)頻率,并實(shí)現(xiàn)調(diào)制器和解調(diào)器(圖 3)。輸入是以 8 kHz 采樣的錄制語音。輸出是兩個(gè)頻譜分析儀和一個(gè)音頻接收端。
首先,我們測量在不啟用數(shù)據(jù)流的情況下仿真該模型所需的時(shí)間1。我們可以注釋掉輸出模塊,以便專注于仿真算法,而不受運(yùn)行示波器和音頻輸出所需的固定時(shí)長的限制。(1. 所有仿真都在 Windows 桌面計(jì)算機(jī)上運(yùn)行,該計(jì)算機(jī)采用 Intel Xeon CPU W-2133 @ 3.6 GHz 6 核 12 線程處理器。)我們使用 tic-toc 命令測量仿真時(shí)間:
modelname = ‘mono_radiomodel’;
tic;
simData = sim(modelname);
t = toc
運(yùn)行該模型的執(zhí)行時(shí)間為 3.67 秒。現(xiàn)在我們引入數(shù)據(jù)流。我們將表示算法的模塊放入子系統(tǒng)中,并將域設(shè)置為數(shù)據(jù)流(圖 4)。
助手建議的更改之一是添加延遲。當(dāng)數(shù)據(jù)流發(fā)現(xiàn)并行機(jī)制可能增大吞吐量時(shí),通常會(huì)向模型添加延遲。沿信號(hào)線添加的延遲用 z-n 標(biāo)簽表示。我們接受更改,并將啟用了數(shù)據(jù)流的模型保存為 mono_radiomodel_dataflow。然后,我們使用與之前相同的 tic-toc 命令來測量新子系統(tǒng)的執(zhí)行時(shí)間。
modelname = ‘mono_radiomodel_dataflow’;
tic;
simData2 = sim(modelname);
t_Dataflow = toc
啟用數(shù)據(jù)流后的執(zhí)行時(shí)間為 2.5 秒,比正常的單線程執(zhí)行速度快 1.7 倍。加速得益于編譯器優(yōu)化、模型設(shè)置更改和數(shù)據(jù)流添加的延遲。然而,該模型僅在單線程上執(zhí)行,加速并不顯著。這是因?yàn)榇蟛糠钟?jì)算負(fù)載都集中在上下變頻器模塊中。當(dāng)計(jì)算負(fù)載分散在整個(gè)模型中時(shí),數(shù)據(jù)流效果最佳,因?yàn)檫@為創(chuàng)建并行線程提供了更多機(jī)會(huì)。在下一節(jié)中,我們將擴(kuò)展模型,展示數(shù)據(jù)流的實(shí)現(xiàn)如何進(jìn)一步提高仿真性能。
處理大型模型
我們通過引入多通道音頻輸入信號(hào)來增大模型的計(jì)算復(fù)雜度。這會(huì)使需要處理的數(shù)據(jù)量倍增,也為數(shù)據(jù)流提供了更多優(yōu)化仿真性能的機(jī)會(huì)。圖 6 顯示經(jīng)過修改、采用立體聲音頻輸入的模型,運(yùn)行時(shí)間為 18.6 秒。通過啟用信號(hào)維度信息疊加,我們可以看到信號(hào)輸入確實(shí)有兩個(gè)音頻通道。
在啟用數(shù)據(jù)流并重新運(yùn)行模型后,我們觀察到模型在 5 個(gè)并發(fā)線程上運(yùn)行,執(zhí)行時(shí)間為 4.5 秒,幾乎實(shí)現(xiàn)了 4 倍加速(圖 7)。
使用數(shù)據(jù)流的多線程代碼生成數(shù)據(jù)流支持使用 Simulink Coder 和 Embedded Coder 的單核和多核 C/C++ 代碼生成。首先在 Simulink 模型的“求解器”窗格中啟用允許任務(wù)在目標(biāo)上并發(fā)執(zhí)行參數(shù),然后使用 Ctrl + B 生成代碼。為桌面目標(biāo)生成的代碼通過 OpenMP 實(shí)現(xiàn)多線程化。為 Embedded Coder 目標(biāo)生成的代碼通過 POSIX 實(shí)現(xiàn)多線程化。圖 8 顯示基于以上無線電模型生成的 OpenMP C 代碼,包括由數(shù)據(jù)流創(chuàng)建的并發(fā)任務(wù)。
數(shù)據(jù)流的限制
雖然數(shù)據(jù)流有助于加速大多數(shù)仿真,但它對(duì)有些模型可能并不適用,例如較小的模型、不太復(fù)雜的模型,或者計(jì)算負(fù)載集中在少數(shù)幾個(gè)模塊中的模型。在這些情況下,數(shù)據(jù)流實(shí)現(xiàn)的速度提升不會(huì)抵消在并行線程上同步和執(zhí)行模型所需的開銷。如無線電模型示例所示,當(dāng)計(jì)算負(fù)載在模型中均勻分布時(shí),數(shù)據(jù)流效果最佳,因?yàn)榫鶆蚍植嫉呢?fù)載意味著有更多機(jī)會(huì)進(jìn)行模型分區(qū)和并行執(zhí)行。就建模限制而言,從版本 2020b 開始,數(shù)據(jù)流不支持連續(xù)模塊、可變大小信號(hào)或虛擬 Simulink 總線的多線程仿真。
小結(jié)
通過數(shù)據(jù)流執(zhí)行域,您可以在 Simulink 模型中識(shí)別可以分布到多個(gè)線程中并行執(zhí)行的建模模式。這種方法可利用主機(jī) CPU 上閑置的處理能力,優(yōu)化吞吐量,并減少模型仿真時(shí)間。數(shù)據(jù)流執(zhí)行域最適合計(jì)算負(fù)載分散在整個(gè)模型中的情形(此時(shí)可引入并行機(jī)制),并且只能處理離散信號(hào)。
責(zé)任編輯:haq
-
仿真
+關(guān)注
關(guān)注
50文章
4097瀏覽量
133701 -
信號(hào)
+關(guān)注
關(guān)注
11文章
2794瀏覽量
76850 -
模型
+關(guān)注
關(guān)注
1文章
3255瀏覽量
48902
原文標(biāo)題:加速 Simulink 模型中的信號(hào)處理算法仿真
文章出處:【微信號(hào):MATLAB,微信公眾號(hào):MATLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論