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