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:
- 执行并行任务会带来时间损失,例如通信开销和并行池设置,建议进行一些时间测试,以确保使用并行计算是值得的;
- 所有的串行代码不一定适宜并行化