本人主要做一些,磁共振图像处理方面的工作,记录一些跑代码的时候遇到的问题,分享给大家,让大家少踩些坑,少掉点头发!!

开启parpool的代码

CoreNum=8; %设定机器CPU核心数量
if isempty(gcp('nocreate')) %如果并行未开启
    parpool(CoreNum);

关闭parpool的代码

delete(gcp) % 关闭并行池

如果不写开启和关闭,可以直接运行parfor ,会按照小于local max 核心 && 小于 Parallel Preference 中设置的number 自动运行。

一次性并行

如若spm软件只支持一次性核心运行(即每次运行完毕之后,并行池中还有数据存在,影响第二次并行)可以每次parfor后关闭并行池一次,到下次parfor自动开启。代码示例如下:

parfor  j = 1:10
    Spdcm_Estimate(j,start_path,path,spdcmpath)
  delete(gcp) % 关闭并行池
parfor  j = 11:20
    Spdcm_Estimate(j,start_path,path,spdcmpath)
  delete(gcp) % 关闭并行池
parfor  j = 21:30
    Spdcm_Estimate(j,start_path,path,spdcmpath)
  delete(gcp) % 关闭并行池

parfor的封装函数中,如果有cd到某一路径

cd到某一路径可能引发一次性并行,因此我们不能只cd进二级(相对级别)目录,还要cd回一级(相对级别)。要不并行的时候可能卡在二级目录出不来,例如并行了1-8,这8个是分别进行的,没有任何问题,但是第9个就会在二级目录开始运行,因为8进入了二级目录没出来,所以9无法找到所需文件。当然如果parfor循环的第一行为cd到二级目录,该情况理论上会避免。

parfor中的建议直接循环函数

这里建议,所有的parfor循环的是函数(将计算体封装为函数,传入值为for循环的i值),这样可以减少错误的发生,因为parfor的要求非常多样。这里的Spdcm_Estimate()为一个函数,括号内的值是将会在函数内部用到的,可以随意传输,没有太多限制。传输前记得在类main中定义即可

parfor  j = 1:10
    Spdcm_Estimate(j,start_path,path,spdcmpath)

parfor循环的函数(以下简称parfunc)中出现save

save保存对结构体有要求,save中不能含有构建字符串结构的过程,可以通过传入上一行已经提前构建好的变量,来传入结构字符串。以下为代码示例:

path = [spdcmpath,'\DCM_',pathn(j).name];
save(path,'DCM');

parfor中遇到continue会出现循环错误

例如你第二次运行时需要覆盖第一次运行的结果,命令行中会出现stop和continue选项,此时要是有多个结果文件夹需要被覆盖,那么parfor是就会报错。解决方法:运行前,清空前一次结果

例:以下这个问题就是func中原先已存在glm,解决方案,把原先的glm删掉,再运行程序

用心记录代码生活本人主要做一些,磁共振图像处理方面的工作,记录一些跑代码的时候遇到的问题,分析给大家,让大家少踩些坑,少掉点头发!!开启parpool的代码CoreNum=8; %设定机器CPU核心数量if isempty(gcp('nocreate')) %如果并行未开启 parpool(CoreNum);end关闭parpool的代码delete(gcp) % 关闭并行池如果不写开启和关闭,可以直接运行parfor ,会按照小于local max 核心 ..
一个非常资源高效的 Matlab 类,用于在“parfor”循环期间进行进度监控,显示每个工人的剩余时间和可选进度。 它支持分布式工作池(即不仅适用于本地池)。 用法: % 'numIterations' 是一个整数,包含循环的总迭代次数。 % 随意增加这个甚至更高,看到其他进度监视器失败。 numIterations = 100000; % 然后构造一个 ParforProgressbar 对象: ppm = ParforProgressbar(numIterations); parfor i = 1:numIterations % 做一些并行计算暂停(100/numIterations); % 递增计数器以跟踪进度ppm.增量(); 结尾 % 在 parfor 循环完成时删除进度句柄(否则不断更新进度的计时器可能不会停止)。 删除(ppm); 可选参数: ppm = Par
matlab计算量很大,重复独立的循环计算很多的时候,我们可以使用matlab的并行计算,这里我先试验了parfor并行计算。以下代码仅适合新版的matlab,改编自《实战matlab之并行程序设计》。 启动代码: function [pool] = startmatlabpool(size)pool=[];isstart = 0;if isempty(gcp('nocreate'))==1
Matlabparfor并行编程 通常消耗最多计算资源的程序往往是循环。把循环并行化。或者优化循环代码是最经常使用的加快程序执行速度的思路。Matlab提供了parforkeyword,能够非常方便的在多核机器或集群上实现并行计算。 parforkeyword的使用 由forkeyword引导的循环通常为串行运行。假设改为parfor则能够由多个worker以并行方式...
parfor 是并行循环计算多重循环的嵌套,只能在其一层循环使用parfor并行计算,因为parfor就是让几个worker同时干活,比如一个循环,i=1:30,那么一个worker做i=1:5,一个做i=6:10····不同的循环变量之间完全独立,所以当然可以一起干活,在里面在嵌套parfor,相当于把里面的工作还要分给6个人,很容易混乱不清,出现问题,如果再继续嵌套就更没法独立地界限清晰地并行工作了。 在命令行输入ver查看是否有“并行计算工具包”, 里面有Parallel Computin
最近要使用matlab对数据集进行处理,由于数据集很大,matlab串行处理效率很低。 在网上查到可以使用parfor循环代替原本的for循环来实现matlab的并行循环parfor要求循环的数据没有上下依赖,每个循环之间相互独立,这样才能在多个处理器上运行并行任务。 在使用parfor时,总是出现各种问题,最后直接用parpool启动matlab并行计算,把原来for循环的内容单独放到一个函数,在parpool间调用,成功实现并行处理 但是这样做,每次都要重新开启和关闭进程池,.
MATLAB 的解决方案不同,变量与其变量名称一起保存。 您必须为要保存的每个变量调用此函数,但该函数不会覆盖以前的 mat 文件。 函数解析(fname,数据) var_name=genvarname(inputname(2)); eval([var_name '=data']) 尝试保存(fname,var_name,'-append') 抓住保存(fname,var_name) 结尾
用于监视 parfor 循环进度的类并行工作程序为每次迭代写入一个公共文件,并通过计算文件的行数来确定已完成迭代的总数。 pp = ParforProgress; parfor kk = 1:100 做一点事; 迭代次数=步骤(pp,kk); fprintf('已完成 %d 次迭代,共 %d\n', 迭代次数, kk); 结尾 根据并行工作人员完成的顺序,这些数字可能不会完全按顺序排列,但它们会足够接近,因此您可以了解自己的位置。 使用单个文件存储迭代信息的技术受到启发通过此文件交换实用程序: http://www.mathworks.com/matlabcentral/fileexchange/32101-progress-monitor--progress-bar--that-works-with-parfor
matlab 作为一款强大的理工科科研神器,并行计算当然也是需要了解的,毕竟可以大大节省我们的时间。 parfor 相关 1、使用 parfor可以并行执行代码; 如下图红框所示,默认时选的,也就是当使用parfor的时候,matlab会自动创建parallel pool; 2、注意: 不建议parfor内执行的内容包含有全局变量,尤其是会对全局变量进行修改的操作,否则会带来意想不到的错误。建议进行传参。 此外,parfor 并行执行的基础是for循环前后两次迭代是不相关的;也就是后一次的迭代不