Matlab 与for循环相比,parfor循环没有显示出明显的加速
我正在尝试将此回归循环作为parfor循环运行:Matlab 与for循环相比,parfor循环没有显示出明显的加速,matlab,parfor,Matlab,Parfor,我正在尝试将此回归循环作为parfor循环运行: load dataq.mat % load 'A_Data' and 'A_ref' matrix k=length(A_ref); theta=zeros(k,5); % preallocation b_ref=zeros(k,1); poolobj = parpool(8); parfor i=1:k % regression W = sqrt( ... exp( ... -( ... ( ( A_Data(
load dataq.mat % load 'A_Data' and 'A_ref' matrix
k=length(A_ref);
theta=zeros(k,5); % preallocation
b_ref=zeros(k,1);
poolobj = parpool(8);
parfor i=1:k % regression
W = sqrt( ...
exp( ...
-( ...
( ( A_Data(:,2)-A_ref(i,2) ) / 0.6 ).^2+ ...
( ( A_Data(:,3)-A_ref(i,3) ) / 0.6 ).^2+ ...
( ( A_Data(:,4)-A_ref(i,4) ) / 0.6 ).^2+ ...
( ( A_Data(:,5)-A_ref(i,5) ) / 0.6 ).^2 ...
) /2 ...
) ...
);
theta(i,:)=regress(W.*b_Data,repmat(W,1,5).*A_Data);
b_ref(i,1)=A_ref(i,:)*theta(i,:)';
end
delete(poolobj);
它运行良好,没有错误,但与for-loop相比,它并没有显示出明显的速度提升
我得到了这个警告信息:
整个数组('A_Data','A_ref')是一个广播变量。这可能会导致不必要的通信开销
我如何处理这个问题
请注意:
A_数据:1710203x5双,
A_ref:5760x5 doubleParfor循环在每个迭代独立于其他迭代时非常有用,因此循环只需要访问循环索引给出的行或列。请注意,
Parfor
旨在将计算分散到集群中的计算节点上。这不是共享内存并行parfor
将启动多个MATLAB会话,并在它们之间传输数据。只有当每个循环迭代中的计算量很大时,这才是有效的。现在可以将并行计算工具箱配置为使用线程而不是单独的MATLAB进程,请尝试parpool('threads')
。查看了解在基于线程的并行会话中可以做什么和不能做什么。另一方面,使用a_数据
和a_ref
进行多个计算是不必要的。您可以将其缩短为:sqrt(exp(-sum((A_data(:,2:5)-A_ref(i,2:5))/0.6.^2,1))
。您可能会从a_data(:,2:5)-a_ref(i,2:5)
中获得轻微的速度提升,尽管这会使代码更难阅读。