2013-04-19 4 views
1

Я пытаюсь запустить этот цикл как parfor петли:Parfor в Matlab

correlations = zeros(1,N); 
parfor i = 1:(size(timestamps,1)-1) 
    j = i+1; 
    dts = timestamps(j) - timestamps(i); 
    while (dts < T) && (j <= size(timestamps,1)) 
     if dts == 0 && detectors(i) ~= detectors(j) 
      correlations(1) = correlations(1) + 2; 
     elseif detectors(i) ~= detectors(j) 
      dts = floor(dts/binning)+1; 
      correlations(dts) = correlations(dts) + 1; 
     end 
     j = j + 1; 
     if j <= size(timestamps,1) 
      dts = timestamps(j) - timestamps(i); 
     end 
    end 
end 

Matlab дает мне следующую ошибку:

Error: File: correlate_xcorr.m Line: 18 Column: 17 
The variable correlations in a parfor cannot be classified. 
See Parallel for Loops in MATLAB, "Overview". 

линии 18 является следующее:

correlations(1) = correlations(1) + 2; 

Я не могу понять, почему это не должно быть возможным. Конечное значение корреляций не зависит от порядка, в котором выполняется цикл, а только dts и детекторов. Я нашел аналогичные примеры в документации, которые работают нормально.

Почему Matlab не выполняет этот код и как его исправить?

+0

исправление немецкого текста будет оценено :) – fpe

+0

Извините, я немного перепутал. – Stein

+0

Я не против, но оставаться с англичанами будет лучше :) – fpe

ответ

1

Я нашел следующее решение и, похоже, работает. Программа выглядит иначе, но имеет ту же форму. Таким образом, Matlab вынужден думать, что x/корреляции являются редукционной переменной.

X = zeros(1,5); 
parfor i= 1:1000 
    a = zeros(1,5); 
    dts = randi(10)-1; 
    if dts == 0 
     a(1) = (a(1) + 2); 
    elseif dts <= 5 
     a(dts) = a(dts) +1; 
    end 
    X = X + a; 
end 
2

MATLAB не может определить, что ваш цикл независим от заказа из-за того, что вы получаете доступ к корреляциям (1) из нескольких итераций цикла PARFOR. Похоже, что это значение каким-то образом является «особенным», оно должно работать, чтобы сделать «редукционную» переменную, т. Е. Заменить correlations(1) на correlations_1 или что-то в этом роде.

Следующая проблема, с которой вы столкнулись, заключается в том, что вы не правильно «нарезаете» оставшуюся часть correlations. Чтобы MATLAB анализировал цикл PARFOR, он должен иметь возможность сказать, что каждая итерация цикла записывает только его «срез» выходных переменных. На практике это означает, что вы должны индексировать выходы, используя буквально индекс цикла.

Подробнее о PARFOR переменной классификации здесь: http://www.mathworks.com/help/distcomp/advanced-topics.html#bq_of7_-1

EDIT:

Если вы хотите correlations вести себя строго как редукционной переменной, как я полагаю, вы подразумеваете в комментариях, вы должны дать PARFOR подсказку, что это что вы имеете в виду: в частности, вам нужно каждый раз добавлять во всю переменную. Другими словами, что-то больше похоже:

parfor ... 
    dummyVec = zeros(1, N); 
    dummyVec(elementToIncrement) = 1; 
    correlations = correlations + dummyVec; 
end 

Согласен, это неочевидно. См. http://blogs.mathworks.com/cleve/2012/11/26/magic-squares-meet-supercomputing/ для получения дополнительной информации.

+0

Да, это решит проблему в строке 18, но она просто задерживается до строки 21: корреляции (dts) = корреляции (dts) + 1; Здесь решение выходит из строя, поскольку корреляции здесь должны быть массивом и не могут быть заменены переменной. – Stein

+0

Да, вот почему я сказал, что вы неправильно нарезаете «корреляции». – Edric

Смежные вопросы