matlab并行运算(parallel computing)

上网搜了好多关于并行计算的东西,现在我就稍微总结下我的一些感受吧。

先区分下并行计算还有分布式计算:

我的理解是:我们本电脑熵进行并行计算,就是多开启几个线程(当然是在多核心的计算机上效果才明显。)

分布式则是:用于多计算机协同工作,即一个主机作为server分配job,其他得到job的client根据主机的要求进行计算,最后将结果传递给server.


首先是了解matlabpool这个线程池(或者说是matlab的工作池),原来我们只启动一个matlab主程序的时候只有一个client在工作,当我们开启这个工作池了以后,会添加多个worker到池子里工作。


首先给大家推荐一个英文的教程:http://people.sc.fsu.edu/~jburkardt/m_src/matlab_parallel/matlab_parallel.html  感觉更全面。

parallel被称作本地并行运算,这种本地的并行运算需要工具箱:MATLAB Parallel Computing Toolbox的支持(查看方法 输入ver命令即可查看)

当然matlab也支持用多台机器进行分布式计算,被称作远程的并行计算。除了上述工具箱外,还需要MATLAB Distributed Computing Server支持。具体关于分布式的计算我没用到,也就不谈了。这里主要说下本地进行并行计算的方法。

环境:至少MATLAB version 2008a or later. 计算机最好核心数大于1的哈,不然所谓的并行就只是并发了。。

首先正常启动matlab,我们所启动的这个matlab进程被称作client,待会将要被开启的多个lab(实验室,我们姑且叫子进程哈)则被称作workers。

所以并行运算其实就是主线程和子线程的一个任务分配和汇总的实现。这种实现过程需要三个基本步骤:

1、需要创建几个workers

2、把任务划分,然后分配给workers

3、整合结果,释放workers


这个过程用matlab写出来就是(这里matlabpool开启的时候我遇到了 java.net.UnknownHostException的错误,本文后面给出解决方案。 )

matlabpool open local 4

your_programme

matlabpool close

记住限制是4,最好就是有几个核心就开几个,这样效率比较高。

并行运算最基本的用法就是采用parfor循环代替for循环,这种循环代替有几点说明:

1、使用parfor前提必须开启matlabpool 否则等于for

2、parfor不能像for一样多层内嵌。。

3、parfor不能调用与上一个循环结果相关的变量,否则就等与for了

total = 0.0;
        big = - Inf;
        for i = 1 : n
          total = total + x(i);
          big = max ( big, x(i) );
        end

for i = 1 : n
          angle = ( i - 1 ) * pi / ( n - 1 );
          t(i) = cos ( angle );
        end

上面都可以把for循环改成parfor

但是下面这种依赖前一个循环的结果则不能转换成parfor

还有有用到break continue return 这些类型都不能使用parfor

 dx = 0.25;
        x = zeros (1,n);
        for i = 2 : n
          x(i) = x(i-1) + dx;
        end

经过本人验证,速度确实提升一倍至少。。

这也是我这个学渣最近搞“科研”时没办法遇到的问题,处理一副图像,用了很多算法,最后综合,运行下来三分钟(你妹),已经用了很多优化方法了,然后用线程优化,哈哈哈哈半分钟,已经和别人的一样了。。。

------------------------------------------------------------------------

废话不多说,我在使用matlabpool open 的时候遇到问题:

matlabpool Java exception occurred: java.net.UnknownHostException:  Your_Host_Name  at java.net.InetAddress.getLocalHost(Unknown Source)

我google下,在大连理工的BBS上找到了这个问题的解决办法(http://bbs.dlut.edu.cn/nforum/article/LinuxUnix/54089):其实就是local主机名无法识别,我们一般都是用localhost的

我的电脑是Linux 64位,在/etc/hosts这个文件里增加一行我们本地ip和主机名即可:观察上面的错误提示(Your_Host_Name这个每个人电脑都不同)

只要在hosts这个文件加上

127.0.0.1   Your_Host_Name
就可以了。。例如我的提示是Lab001:Lab001我就加入

127.0.0.1   Lab001

然后重启下网络即可:

/etc/init.d/network restart





### Matlab 并行运算启用失败的可能原因及解决方案 #### 1. **并行计算工具箱未正确安装** 如果Matlab并行计算工具箱(Parallel Computing Toolbox, PCT)未正确安装,则可能导致并行运算无法正常运行。可以通过以下方式验证PCT是否已安装: ```matlab ver; ``` 此命令会显示当前Matlab环境中所有已安装的工具箱列表。如果没有看到“Parallel Computing Toolbox”,则需要重新安装或激活该工具箱。 此外,确保Matlab Distributed Computing Server (MDCS)[^1] 已经配置完成,并且能够访问远程集群资源。 --- #### 2. **并行池初始化失败** 当尝试创建并行池时出现问题,可能是由于以下几个原因之一: - **本地worker数量不足** 默认情况下,Matlab会在本地计算机上启动一定数量的工作进程(workers)。这些工作进程的数量通常受限于系统的CPU核心数。如果系统资源有限或者存在其他占用大量内存的任务,可能会导致并行池初始化失败。可以手动调整最大可用worker数量: ```matlab parpool('local', NumberOfWorkers); ``` - **网络连接问题** 如果使用的是分布式计算服务器(Distributed Cluster Profile),那么需要确认客户端与服务器之间的网络连通性良好。例如,检查防火墙设置以及端口开放情况[^1]。 - **权限问题** 在某些操作系统下,特别是Linux或Unix类平台,可能存在文件读写权限不足的情况。这会影响临时目录的创建以及其他必要的操作过程。因此建议以管理员身份运行Matlab应用程序。 --- #### 3. **代码逻辑错误** 即使硬件和软件环境都满足条件,但如果编写不当也可能引发错误。比如下面这段关于`parfor`循环的例子展示了如何正确实现累加随机数组的操作[^3]: ```matlab % 初始化参数 n = 5; % 实验次数 m = 1e4; % 随机矩阵大小 p = gcp(); % 获取当前并行池对象 % 使用parfor进行并行化处理 tic; resultParfor = zeros(n,1); parfor i = 1:n resultParfor(i) = sum(rand(m)); end timeParfor = toc; % 使用parfeval异步调用任务 tic; futures = repmat(parallel.FevalFuture, p.NumWorkers, 1); resultsParfeval = zeros(p.NumWorkers,1); for j = 1:p.NumWorkers futures{j} = parfeval(@()sum(rand(m)), 0); end wait(futures); for k = 1:length(futures) resultsParfeval(k) = fetchOutputs(futures{k}); end timeParfeval = toc; % 利用SPMD同步多个节点间的数据交换 tic; spmdResult = zeros(1,n); for l = 1:n spmd myPart = rand(m); totalSum = gplus(myPart, 1); % 将局部结果汇总到第一个实验室 end spmdResult(l) = totalSum{1}; end timesSpmd = toc; ``` 注意以上三种方法各有优缺点,在实际应用过程中可以根据具体需求选择合适的方式。 --- #### 4. **路径配置问题** 有时因为自定义脚本或其他第三方库干扰到了默认行为也会造成麻烦。按照引用中的指导修改搜索顺序有助于排除此类隐患[^4]: 1. 打开“Set Path”对话框; 2. 定位到个人文档夹下的MATLAB子目录; 3. 提升其优先级至顶部位置; 4. 应用更改后再重启程序实例做最终检验。 --- #### 总结 针对Matlab并行运算无法启用的问题,可以从四个方面入手排查:一是核查相关组件是否存在缺失现象;二是关注物理资源配置状况及其兼容程度;三是审查源码结构设计合理性;四是优化全局加载机制减少冲突可能性。只有综合考虑各方面因素才能有效定位根源所在进而采取针对性措施加以修复。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值