首发于 TightBound

[Matlab]parfor

[Matlab入门学习记录]

主要内容:

  1. parfor 原理介绍
  2. parfor 程序设计
  3. parfor 在网格搜索的应用

环境:MatLab2017b/libsvm3.22/Windows10/


1.parfor 原理介绍

  • parfor关键字并行执行for时,会将for循环划分为若干部分,每个部分较有不同的Worker执行。如果任务无法均匀划分,有些Worker会执行较多的循环次数。
  • parfor并行时会占用计算机资源进行必要的数据通信。
  • for执行循环时,根据循环变量的顺序执行;而parfor关键字执行循环时,执行顺序与Matlab Worker数据以及循环在Matlab worker之间的分配顺序等因素相关。
parfor循环

1.1 matlab并行计算池配置

在 预设--> Parallel Computing Toolbox 中设置:

1.2 数据通信的影响

Matlab client 与 Matlab worker 在不同的 Matlab 进程中执行,执行parfor循环时,数据需要从 Matlab client 传输到 Matlab worker 。数据通信需要占用时间核处理器资源,在parfor 程序设计中,需要考虑数据通信问题。

如果数据通信占用的时间相对parfor循环体对应的计算时间高出许多,那么数据通信是parfor执行的关键问题。

2. parfor 程序设计

2.1 简约操作

各次循环对应的循环体操作相互独立时才能使用parfor关键字进行并行;但有一类特殊的循环操作不受此条件限制,此类操作被称为简约操作。
简约操作符操作的对象即简约变量(reduction variable)。
简约变量的重要特征:操作结果与操作顺序无关。
  • 简约操作的执行顺序
  • 简约变量对应的操作符及表达式形式

2.2 parfor循环中的主要变量类型

待补充。

2.3 其他问题

  • 变量名称函数优先。 在parfor循环代码块中,如果变量在循环外没有定义或初始化,则Matlab假定此变量为一函数名。
  • 在parfor中,对所有的变量的使用必须 显式使用 。(evalc,evalin,save,load等函数)
  • parfor与break和return不能嵌套使用,但parfor关键字引导的循环代码段中可以调用包含parfor关键字的函数,同时,parfor关键字引导的代码段中可以调用嵌套函数。

3. parfor 在网格搜索上的应用

以支持向量机RBF核调参为例。

We recommend a “grid-search” on C and \gamma using cross-validation. Various pairs
of (C,\gamma) values are tried and the one with the best cross-validation accuracy is
picked. We found that trying exponentially growing sequences of C and \gamma is a
practical method to identify good parameters。
function [c2,g2,cv] = parGS(trainLabels,trainFeatures,cList,gList)
%并行交叉验证/网格搜索
    %利用libsvm的svmtrain函数进行交叉验证/网格搜索选择最优参数
    %选用的RBF核,对C,gamma两个参数进行选择
    %trainLabels:训练标志,格式同libsvm
    %trainFeatures:训练特征,格式同libsvm
    %cList:参数c
    %gList:参数gamma
len_c = length(cList);
len_g = length(gList);
cvList = zeros(len_c*len_g,1);
totalNum = len_c*len_g;
parfor i = 1:totalNum 
    indc = ceil(i/len_c);
    c2 = cList(indc);
    indg = mod((i-1),len_g)+1;
    g2 = gList(indg);
    cmd = ['-q -v 10 -c ', num2str(2^c2), ' -g ', num2str(2^g2)];        
    cvList(i) = libsvmtrain(trainLabels,trainFeatures, cmd);            
[maxCV,maxIndex] = max(cvList);