2014-09-02 1 views
1

Я пытаюсь выполнить параллельную обработку matlab, и во время этого я попытался применить эту вещь к своему коду. Ниже приведен код.Получение ошибки в parfor, но не в for-loop в matlab

matlabpool open 2 
pop = create_population(match_matrix,PopSize); 
ftns = zeros(PopSize,1); 
parfor i=1:PopSize 
    ftns(i) = get_fitness(pop{i}); 
end 
matlabpool close 

Ошибка я получаю следующее

Error using parallel_function (line 589) 

In an assignment A(I) = B, the number of elements in B and I must be the same. 

Error stack: 
SWIFTga>(parfor body) at 127 

Error in SWIFTga (line 126) 
    parfor i=1:PopSize 

Я не подвожу никаких ошибок, если я заменю parfor с для. Пожалуйста, предложите, что может произойти неправильно ....

+0

Эта ошибка предполагает, что результат get_fitness не является скалярным значением. Трудно сказать, в чем проблема, не видя кода в get_fitness и create_population. –

+0

get_fitness дает скалярные значения, я проверил вручную, установив точку останова непосредственно перед parfor. Даже это не дает никакой ошибки, когда я реализую его в цикле for. После цикла for все элементы заполняются скалярными значениями. –

+0

В parfor попробуйте сделать: test = get_fitness (pop {i}); disp (тест); , чтобы доказать, что вы получаете то, что ожидаете. –

ответ

1

Я так много пробовал и, наконец, нашел проблему. На самом деле я обращался к глобальным переменным в функции, называемой внутри тела parfor. Из документации Matlab было обнаружено, что мы не можем обращаться к глобальным переменным в parfor, поскольку есть проблемы синхронизации. Я должен изменить код от глобальных переменных до передачи аргументов. Спасибо всем тем, кто задал мне некоторое время.