使用带有选项的 parfor 来并行化代码
Using parfor with options to parallelize code
我有以下 MATLAB 代码:
n_part = 5; %count the participants
options.params.cutoff=1;
options.params.lags=0;% use zero, to set n=0 as in eq 4 in the paper, otherwise you will include historical values in the model (one connectivity matrix per historical value)
options.params.autocorrelation=0; % to exclude self dependancies, since we have already take care of this. This makes the diagonal values equal to zero in the model
options.params.concurrent=1; % must be one to include the concurrent information
options.params.pass_th=0;
options.perc=[0.7 0.3]; % First argument is the partition size to calculate SV, second argument is the size of the test sample
options.rep_svd=10; % how many times to repeat the svd decomposition to maximize out of sample data predictions
options.rep_model=1; % if number of frames not empty, how many times recalculate the model based on the minimum required frames
parfor i=1:n_part
display(['Running participant ' num2str(i)])
options.min_frames=size(signal,1); %how many frames to include in the model
options.SV=SV; %assign SV to options
end
我想优化 for
循环,因为每次迭代都是独立的。所以,首先,我尝试了这个:
parfor i=1:n_part
.
.
.
end
这给了我这个错误:
Error: The variable options in a parfor cannot be classified.
错误发生在这一行:
parfor i=1:n_part
然后我尝试了这个:
parpool(2);
parfor i=1:n_part
display(['Running participant ' num2str(i)])
y=TC{i};
TC_no_AC_LS{i}=remove_autocorrelation(y,n_ar);
frameSV(i).signal=TC_no_AC_LS{i}; % pick the signal with no autocorrelation
[SV, R]=model_tsvd(signal,options); %calculate the SVD
frameSV(i).min_frames = size(frameSV(i).signal, 1);
frameSV(i).SV = SV;
end
for i = 1 : n_part
options.min_frames= frameSV(i).min_frames; %how many frames to include in the model
options.SV = frameSV(i).SV; %assign SV to options
signal = frameSV(i).signal;
m(:,:,i) = make_model_tsvd(signal, options); % calculate the model
end
但是出现这个错误:
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 2).
Error using connectotyping_example2>(parfor supply)
Undefined function 'frameSV' for input arguments of type 'double'.
Error in connectotyping_example2 (line 27)
parfor i=1:n_part
有没有办法解决这个问题,使循环迭代可以运行并行?
问题是以下两行:
options.min_frames=size(signal,1); %how many frames to include in the model
options.SV=SV; %assign SV to options
Parfor 循环必须确保每个循环迭代独立于下一个。在上面的代码中,看起来 options
在每次迭代中都会更新,然后在下一次迭代中使用更新的结构。这不能使用 parfor 来完成,因为 技术上 不能保证迭代 i 和 i+1将在同一台机器上完成。
如果 min_frames
和 SV
不需要成为选项结构的一部分,您可以以数据独立的方式在每次迭代中存储它们的值:
parfor i=1:n_part
% ...
frameSV(i).min_frames = size(signal,1);
frameSV(i).SV = SV;
end
% Do some calculation with frameSV to get the data you need, after the loop
这将创建一个 1 x n_part
结构数组,其中独立存储每个循环迭代的 min_frames
和 SV
的值。
同样,这都是假设 options
的值 不需要 在一次迭代中更新并在下一次迭代中使用。
我有以下 MATLAB 代码:
n_part = 5; %count the participants
options.params.cutoff=1;
options.params.lags=0;% use zero, to set n=0 as in eq 4 in the paper, otherwise you will include historical values in the model (one connectivity matrix per historical value)
options.params.autocorrelation=0; % to exclude self dependancies, since we have already take care of this. This makes the diagonal values equal to zero in the model
options.params.concurrent=1; % must be one to include the concurrent information
options.params.pass_th=0;
options.perc=[0.7 0.3]; % First argument is the partition size to calculate SV, second argument is the size of the test sample
options.rep_svd=10; % how many times to repeat the svd decomposition to maximize out of sample data predictions
options.rep_model=1; % if number of frames not empty, how many times recalculate the model based on the minimum required frames
parfor i=1:n_part
display(['Running participant ' num2str(i)])
options.min_frames=size(signal,1); %how many frames to include in the model
options.SV=SV; %assign SV to options
end
我想优化 for
循环,因为每次迭代都是独立的。所以,首先,我尝试了这个:
parfor i=1:n_part
.
.
.
end
这给了我这个错误:
Error: The variable options in a parfor cannot be classified.
错误发生在这一行:
parfor i=1:n_part
然后我尝试了这个:
parpool(2);
parfor i=1:n_part
display(['Running participant ' num2str(i)])
y=TC{i};
TC_no_AC_LS{i}=remove_autocorrelation(y,n_ar);
frameSV(i).signal=TC_no_AC_LS{i}; % pick the signal with no autocorrelation
[SV, R]=model_tsvd(signal,options); %calculate the SVD
frameSV(i).min_frames = size(frameSV(i).signal, 1);
frameSV(i).SV = SV;
end
for i = 1 : n_part
options.min_frames= frameSV(i).min_frames; %how many frames to include in the model
options.SV = frameSV(i).SV; %assign SV to options
signal = frameSV(i).signal;
m(:,:,i) = make_model_tsvd(signal, options); % calculate the model
end
但是出现这个错误:
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 2).
Error using connectotyping_example2>(parfor supply)
Undefined function 'frameSV' for input arguments of type 'double'.
Error in connectotyping_example2 (line 27)
parfor i=1:n_part
有没有办法解决这个问题,使循环迭代可以运行并行?
问题是以下两行:
options.min_frames=size(signal,1); %how many frames to include in the model
options.SV=SV; %assign SV to options
Parfor 循环必须确保每个循环迭代独立于下一个。在上面的代码中,看起来 options
在每次迭代中都会更新,然后在下一次迭代中使用更新的结构。这不能使用 parfor 来完成,因为 技术上 不能保证迭代 i 和 i+1将在同一台机器上完成。
如果 min_frames
和 SV
不需要成为选项结构的一部分,您可以以数据独立的方式在每次迭代中存储它们的值:
parfor i=1:n_part
% ...
frameSV(i).min_frames = size(signal,1);
frameSV(i).SV = SV;
end
% Do some calculation with frameSV to get the data you need, after the loop
这将创建一个 1 x n_part
结构数组,其中独立存储每个循环迭代的 min_frames
和 SV
的值。
同样,这都是假设 options
的值 不需要 在一次迭代中更新并在下一次迭代中使用。