MATLAB code 加速
文章目錄
實驗平臺:聯想小新air13 2018款,CPU-i5 8265U 4核心
參考視頻鏈接: How to speed up MATLAB code.mp4
利用探查器對腳本語句進行改進
1、查看腳本運行時間
使用tictoc
命令:
tic; randGrid_start; toc
時間已過 100.763126 秒。
2、step1 預分配內存
代碼分析器如下圖右方顯示:
🍊 桔色代表可以進行一些改進,🍏綠色表示代碼準備就緒。上圖顯示: A
,B
矩陣隨迭代次數變化,簡單的改進爲:爲 A
,B
預分配內存,如代碼randGrid_step1.m
所示。
tic; randGrid_step1; toc
時間已過 1.180223 秒。
3、step2 使用 MATLAB 探查器
- 進入探查器:主頁 > 運行並計時
- a. 輸入腳本名稱, b. 點擊
開始探查
,c. 進入函數
-
查看代碼耗時較多語句:
顯示在隨機數分配耗時較多。 -
改進隨機數分配,見代碼
randGrid_step2.m
對
randGrid_step2.m
進行探查
4、step3 使用邏輯數組改進判斷語句:
使用MATLAB邏輯索引進行向量化操作,見代碼randGrid_step3.m
使用邏輯數組 idx
, 滿足條件即賦值。
使用多核心並行運算
1、 查看腳本運行時間
腳本randGridEig_start.m
,計算矩陣的最大特徵向量
tic; randGridEig_start; toc
時間已過 882.065692 秒。
大部分時間花在計算循環中特徵值的部分,沒法改進循環的可能性。
2、 利用多個核心進行計算
這種情況下,利用計算機的多個核心,分別計算每個循環迭代任務,然後合併結果。
使用Parallel Computing Toolbox
來完成。
在命令行窗口輸入:
>> parpool
創建MATLAB worker
的並行池。
Starting parallel pool (parpool) using the ‘local’ profile …
connected to 4 workers.ans =
Pool - 屬性:
Connected: true NumWorkers: 4 Cluster: local AttachedFiles: {} AutoAddClientPath: true IdleTimeout: 30 minutes (30 minutes remaining) SpmdEnabled: true
本機爲4核心處理器。
將for
循環改爲parfor
循環:
查看運行時間:
tic; randGridEig_step1; toc
時間已過 731.125419 秒。
notes:
- 執行並行任務會帶來時間損失,例如通信開銷和並行池設置,建議進行一些時間測試,以確保使用並行計算是值得的;
- 所有的串行代碼不一定適宜並行化