广播变量
广播变量是除循环变量或分段变量之外的任何在循环内不会改变的变量。在 parfor
循环开始时,MATLAB® 将任何广播变量的值发送给所有工作进程。在这个例子中,MATLAB 将 A
和 B
的值发送给所有工作进程。
A = 5; B = 10; C = 0; parfor i = 1:10 if i == A C = C + B; end end
性能注意事项
拥有较大的广播变量或许多广播变量可能会导致客户端与其相关工作进程之间的大量通信并增加开销。当广播变量导致的通信开销很大时,请考虑在循环内创建和分配临时变量。相反,如果由于创建和分配临时变量而导致的计算开销很大,请考虑使用广播变量。
有关更多详细信息,请参阅 临时变量 和 决定何时使用 parfor。
注意
当多个 parfor
循环需要访问相同的常量数据集时,您可以使用 parallel.pool.Constant
来提高代码的性能,它仅将数据传输给工作进程一次,而不是在每个 parfor
循环开始时都传输一次。
为了提高代码的性能,请寻找机会减少不必要的广播变量的数量。例如,此代码包含一个广播变量 M
。
M = magic(10); parfor i = 1:numel(M) out(i) = M(i)./numel(M); end
可以重写此代码以在 parfor
循环之前评估 numel(M)
。从 parfor
循环中删除 numel(M)
会阻止 MATLAB 将 M
的所有元素发送给每个工作进程。相反,MATLAB 将 N
的值和分段变量 M
的子集发送给每个工作进程。
M = magic(10); N = numel(M); parfor i = 1:N out(i) = M(i)./N; end