2016-08-29 4 views
0

Мне нужна помощь, чтобы знать, как работать с переменными, определенными за пределами парсов. Я хочу ускорить код, который занимает много времени при использовании большего количества элементов.MATLAB: Использовать переменные (определенные снаружи) внутри цикла 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

Я не вижу, как это может быть распараллелировано. На каждом временном шаге значение y зависит от предыдущего значения y. – drhagen

+0

Спасибо за ответ @drhagen. В точку! Кажется, что мой код зависит. Я хотел бы знать, как преодолеть такие проблемы, есть ли какие-нибудь трюки? Например, в этом коде (аналогично проблеме, с которой я имею дело): 'a = нули (1,10); parfor it = 1:10 a (it) = someFunction (a (it-1)); end' Понятно, что каждая итерация зависит. Но как я могу изменить это, чтобы успешно выполнить код? –

+0

Включите 'parfor' в обычный' for'? – drhagen

ответ

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