MATLAB code 加速

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 预分配内存

代码分析器如下图右方显示:

🍊 桔色代表可以进行一些改进,🍏绿色表示代码准备就绪。在这里插入图片描述上图显示: AB 矩阵随迭代次数变化,简单的改进为:为 AB 预分配内存,如代码randGrid_step1.m所示。

tic; randGrid_step1; toc

时间已过 1.180223 秒。

3、step2 使用 MATLAB 探查器

  • 进入探查器:主页 > 运行并计时
    在这里插入图片描述
  • a. 输入脚本名称, b. 点击开始探查,c. 进入函数
  1. 查看代码耗时较多语句:
    在这里插入图片描述
    ​ 显示在随机数分配耗时较多。

  2. 改进随机数分配,见代码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:

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

其他方法

Accelerating MATLAB Algorithms and Applications

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章