2011-07-16 51 views
5

在並行模式下運行時,全局變量會發生什麼?MATLAB:在並行模式下運行時,全局變量會發生什麼?

我有一個全局變量「to_be_optimized_pa​​rameterIndexSet」,它是一個應該使用gamultiobj進行優化的索引向量,我只在主腳本(無處)中設置了它的值。

我的代碼在串行模式下正常工作,但當我切換到並行模式(使用「matlabpool open」併爲'gaoptimset'設置適當的值)時,所提到的全局變量在適應函數中變爲空(= [])這個錯誤:

??? Error using ==> parallel_function at 598 
Error in ==> PF_gaMultiFitness at 15 [THIS LINE: constants(to_be_optimized_parameterIndexSet) = individual;] 
In an assignment A(I) = B, the number of elements in B and 
I must be the same. 

Error in ==> fcnvectorizer at 17 
     parfor (i = 1:popSize) 

Error in ==> gamultiobjMakeState at 52 
     Score = 
     fcnvectorizer(state.Population(initScoreProvided+1:end,:),FitnessFcn,numObj,options.SerialUserFcn); 

Error in ==> gamultiobjsolve at 11 
state = gamultiobjMakeState(GenomeLength,FitnessFcn,output.problemtype,options); 

E rror in ==> gamultiobj at 238 
[x,fval,exitFlag,output,population,scores] = gamultiobjsolve(FitnessFcn,nvars, ... 

Error in ==> PF_GA_mainScript at 136 
[x, fval, exitflag, output] = gamultiobj(@(individual)PF_gaMultiFitness(individual, initialConstants), ... 

Caused by: 
    Failure in user-supplied fitness function evaluation. GA cannot continue. 

我檢查了所有的代碼,以確保我沒有改變這個全局變量在其他地方。

我有一個四核處理器。

錯誤在哪裏?任何建議?

編輯1:在主腳本中的MATLAB代碼:

clc 
clear 
close all 

format short g 
global simulation_duration % PF_gaMultiFitness will use this variable 
global to_be_optimized_parameterIndexSet % PF_gaMultiFitness will use this variable 
global IC stimulusMoment % PF_gaMultiFitness will use these variables 

[initialConstants IC] = oldCICR_Constants; %initialize state 
to_be_optimized_parameterIndexSet = [21 22 23 24 25 26 27 28 17 20]; 
LB = [ 0.97667  0.38185  0.63529  0.046564  0.23207  0.87484  0.46014 0.0030636 0.46494  0.82407 ]; 
UB = [1.8486  0.68292  0.87129  0.87814  0.66982  1.3819  0.64562  0.15456 1.3717  1.8168]; 
PopulationSize = input('Population size? ') ; 
GaTimeLimit = input('GA time limit? (second) '); 
matlabpool open 
nGenerations = inf; 
options = gaoptimset('PopulationSize', PopulationSize, 'TimeLimit',GaTimeLimit, 'Generations', nGenerations, ... 
    'Vectorized','off', 'UseParallel','always'); 

[x, fval, exitflag, output] = gamultiobj(@(individual)PF_gaMultiFitness(individual, initialConstants), ... 
    length(to_be_optimized_parameterIndexSet),[],[],[],[],LB,UB,options); 

matlabpool close 

some other piece of code to show the results... 

的健身功能, 「PF_gaMultiFitness」 的MATLAB代碼:

function objectives =PF_gaMultiFitness(individual, constants) 
global simulation_duration IC stimulusMoment to_be_optimized_parameterIndexSet 
%THIS FUNCTION RETURNS MULTI OBJECTIVES AND PUTS EACH OBJECTIVE IN A COLUMN 

constants(to_be_optimized_parameterIndexSet) = individual; 
[smcState , ~, Time]= oldCICR_CompCore(constants, IC, simulation_duration,2); 
targetValue = 1; % [uM]desired [Ca]i peak concentration 
afterStimulus = smcState(Time>stimulusMoment,14); % values of [Ca]i after stimulus 
peak_Ca_value = max(afterStimulus); % smcState(:,14) is [Ca]i 

if peak_Ca_value < 0.8 * targetValue 
    objectives(1,1) = inf; 

else 
    objectives(1, 1) = abs(peak_Ca_value - targetValue); 
end 

pkIDX = peakFinder(afterStimulus); 
nPeaks = sum(pkIDX); 
if nPeaks > 1 
    peakIndexes = find(pkIDX); 
    period = Time(peakIndexes(2)) - Time(peakIndexes(1)); 
    objectives(1,2) = 1e5* 1/period; 

elseif nPeaks == 1 && peak_Ca_value > 0.8 * targetValue 
    objectives(1,2) = 0; 
else 
    objectives(1,2) = inf; 

end 


end 

回答

6

全局變量沒有得到從MATLAB客戶端傳遞到執行PARFOR循環體的工人。發送到循環體的唯一數據是程序文本中發生的變量。 This blog entry可能會有所幫助。

+0

它說:「另外,你不能在parfor循環體內定義全局變量或持久變量,我還建議小心使用全局變量,因爲工作變量全局值不會自動反映到局部全局值中。 「然而,我並不是在par-for循環中「定義全局變量」,而且我也沒有改變worker中全局變量的值。我在客戶端定義了全局變量,並在工作人員中使用它們。 –

+0

順便說一下,在修改全局變量以便它們被明確地傳遞之後,問題得到了解決,但它沒有在MATLAB中編寫,它幫助您不能通過全局變量向工作人員發送信息。 –

+0

如何修改代碼以明確傳遞它們?我有一個全局配置(無論是編程圖,是否將文件寫入文件系統)存儲在全局結構中,我只想讀取工作人員,這就是爲什麼我問。 – Ronny

2

這真的取決於類型你需要看到更多的代碼來指出這個缺陷,但總的來說,避免假設複雜的變量會傳遞給每個工作者是一種很好的做法。換句話說,在平行例程中可能需要重新初始化任何更多的原語,或者可能需要特定的函數調用(如使用feval函數句柄)。

我的建議是:RTM

+0

謝謝。我已經添加了代碼。 –

+1

我打算壓抑我最初所說的......雖然我不是100%確定的,但我的理解是parfor循環存在於他們自己的小世界中,並且全球價值根本沒有通過(我想我回想起在很多月前處理這個事實),所以這些值只是空的...因此,你需要重寫你的函數來明確地傳遞這些參數。 – Rasman

+1

謝謝你的回答和評論,但我希望你沒有使用「RTFM」這個詞。 –

相關問題