2016-08-29 137 views
0

我需要幫助來了解如何使用在parfor循環之外定義的變量。我想加快代碼的使用時間,但需要花費很多時間。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 = zeros(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