MATLAB:在parfor循环中使用变量(在外部定义)

时间:2016-08-29 10:21:11

标签: matlab loops parallel-processing parfor

我需要帮助才能知道如何使用parfor循环外定义的变量。我想加快使用更多元素时花费很多时间的代码。

我将尝试用一个例子来解释它。让我们假设最初我有一系列元素会在循环内随机移动,并且会根据元素的位置进行一些计算。

以下是代码示例:

% Variables
nElements = 5000; Ly = 2; vmax = 1;
time = 0.1:0.1:20;
x = -0.5+rand(nElements,1);
y = -Ly + Ly*rand(nElements,1);
zx = [];
zy = [];
rate = zeros(1,length(time));
vel = zeros(nElements,1);
vz = [];

% Loop
parfor ii=1:length(time)
nTimes = ii;                   % counter
vel = vmax.*(1-(y./Ly).^2)     % elements will move according to this velocity profile
x = x + vel + randn(nElements,1);
y = y + vel + randn(nElements,1);

nZ = length(zx);
if ~isempty(zx) && ~isempty(zy)
   vz = vmax.*(1-(zy./Ly).^2)
   zx = zx + vz + randn(nZ,1);
   zy = zy + vz + randn(nZ,1);
end


[x,y,zx,zy] = f(x,y,zx,zy); % function that uses the variables x and y; and if some conditions are met, creates a z element   
rate(ii) = nZ;
end

我遇到了在parfor循环之外设置的变量的问题,也因为使用了变量的方式。我想知道的是如何在parfor循环中使用变量(在外部定义)以及如果在每个循环中更新变量,如何在函数中使用它们。

谢谢!

1 个答案:

答案 0 :(得分:1)

随着时间的推移(或每个步骤的值取决于前一个值的任何系统)的并行化是不可能的,不仅在Matlab中,而且从根本上说。

幸运的是,Matlab将使用built-in multithreading来显示此处显示的大部分代码,因为您的代码可以沿nElements维度进行矢量化。矢量化操作已在内部并行化。这个特定代码的缓慢部分是randn,这个函数计算成本高且通常是顺序的。如果我删除它并查看处理器使用情况,我会看到正在使用多个核心:

% Variables
nElements = 1000000; Ly = 2; vmax = 1;
time = linspace(0,1,100000);
x = -0.5+rand(nElements,1);
y = -Ly + Ly*rand(nElements,1);
vel = zeros(nElements,1);

% Loop
for ii=1:length(time)
    vel = vmax.*(1-(y./Ly).^2);
    x = x + vel;
    y = y + vel;
end
相关问题