VV游戏

 找回密码
 立即注册
查看: 181|回复: 15

MATLAB程序加速——除了多线程,还有别的办法吗?

[复制链接]

1

主题

6

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2023-3-26 13:16:35 | 显示全部楼层 |阅读模式
更新:有人反映其实多线程是可以提高速度的,但我这里尝试并不行。每个人做的项目,MATLAB版本不一样,正版盗版都有,所以变量难以控制,我们的例子就没有了参考意义。建议运行下面的程序,看看哪个速度快
tic
for i=1:10000
    for j=1:10000
        a(i,j)=i*j;        
    end
end
toc
tic
parfor i=1:10000
    for j=1:10000
        a(i,j)=i*j;        
    end
end
toc会看到这篇文章的你,可能也想解决MATLAB运行大型程序CPU使用率上不去的问题,然后就找到多线程这个方法上来。关于多线程,网上搜索了一圈,发现百度出来的函数很早以前就停用了,新版本matlab不支持matlabpool,已经被删除,用parpool代替,parfor还能用。
个人体验:MATLAB多线程并没有加速。我和其他同学运行的结果,都是速度差距不大。甚至,我用了多线程更慢。版本是2020b,一万块钱的台式机。
如果多线程不行,怎么办?如果你是需要多次运行程序,那告诉你一个简单粗暴的办法:同时运行多个matlab。
比如我这个电脑,由于内存限制,程序运行之后内存占用很大,16g内存不够用,因此不能运行太多个matlab,但是依然可以同时运行四个,再加上第五个处理数据。cpu的使用率并不会很高。
最后,复制粘贴一下我网上搜集到的多线程的信息,侵删。
matlab并行原理:
Matlab的并行计算实质还是主从结构的分布式计算。当你初始化Matlab并行计算环境时,你最初的Matlab进程自动成为主节点,同时初始化多个(具体个数手动设定,详见下文)Matlab计算子节点。Parfor的作用就是让这些子节点同时运行Parfor语句段中的代码。Parfor运行之初,主节点会将Parfor循环程序之外变量传递给计算子节点。子节点运算过程时互不干扰,运算完毕,则应该有相应代码将各子节点得到的结果组合到同一个数组变量中,并返回到Matlab主节点。当然,最终计算完毕应该手动关闭计算子节点。
matlab官方对多线程的说明也很少,等于没有,指望官方文档也不行。
使用多线程之前先看电脑几核:
windows资源管理器和设备管理器里面显示的cpu数量都是线程数,物理核心数得除以2。
然后在matlab设置界面设置核心数量。




每次进行多线程,matlab都需要先启动这个功能,这个等待时间也需要被算进你花费的时间,反正目前我这个情况,是使用多线程时间上很不划算。
“for”循环使用的按照运算顺序,一次一次来迭代循环。而“parfor”使用的是多核同时处理,根据你的CPU核的个数来同时开始,并且不是安装一定的顺序来进行计算的,但两者的计算结果是一样的。
但是并不是所有的“for”循环都可能使用“parfor”来进行并行处理,中间不能有共同的变量,例如每一次循环中都使用同一个变量,但是它在并行处理时只能出现一次,这种情况下Matlab就会报警,不能使用“parfor”并行处理机制。
回复

使用道具 举报

1

主题

6

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2023-3-26 13:17:15 | 显示全部楼层
额,兄弟你把1000改成10000就知道差距了。还有预存好变量a快好几个数量级。然后parfor调用多核心,有几个核用几个核,cpu是能拉满的。
回复

使用道具 举报

1

主题

4

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2023-3-26 13:18:02 | 显示全部楼层
一开始我就是10000算的,真不行。另外核心数量我这电脑是四个,也设置了,CPU依然占用上不去
回复

使用道具 举报

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-3-26 13:18:31 | 显示全部楼层
是因为你这个计算太简单了,多核之间有通信开销,反而慢一些很正常。 我8核10700跑我写的程序用parfor基本上能加速2.5倍样子
回复

使用道具 举报

2

主题

3

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2023-3-26 13:18:39 | 显示全部楼层
matlab这个应该是多进程的并行计算,还有这种并行仅适合计算量大的程序,否则无法体现优势
回复

使用道具 举报

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-3-26 13:18:49 | 显示全部楼层
我是用来仿真,每次要算45分钟
回复

使用道具 举报

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-3-26 13:19:36 | 显示全部楼层
有个例子是算5000*5000的随机矩阵的特征值,用并行计算是不用的数百倍。
回复

使用道具 举报

0

主题

4

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2023-3-26 13:20:12 | 显示全部楼层
您好,可以私信一下具体例子吗,我试试。
回复

使用道具 举报

1

主题

4

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2023-3-26 13:21:02 | 显示全部楼层
这么大矩阵的优化不仅仅是parfor  还有是更加优化的计算和预分配
加入 a = zeros(10000,10000); 预分配就可以节省很多时间了
tic
a = zeros(10000,10000);
for i=1:10000
    for j=1:10000
        a(i,j)=i*j;        
    end
end
toc
Elapsed time is 2.071419 seconds.

抛弃for循环,,, 纯矩阵计算.... 可以下降到
tic
i = [1:10000];
c = i' * i;
toc
Elapsed time is 0.173366 seconds.

如果你还有GPU
可是试试这个
tic;
i = gpuArray([1:10000]);
d = i' * i;
toc;
Elapsed time is 0.015586 seconds.
回复

使用道具 举报

0

主题

6

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-3-26 13:21:19 | 显示全部楼层
当计算复杂度高时,用parfor 的确可以大幅度提升效率
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|VV游戏

GMT+8, 2025-4-8 12:04 , Processed in 0.111323 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表