我需要帮助才能知道如何使用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循环中使用变量(在外部定义)以及如果在每个循环中更新变量,如何在函数中使用它们。
谢谢!
答案 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