Парфор в Матлаб

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

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;

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

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

2 ответа

Решение

Я нашел следующее решение, и оно, кажется, работает. Программа выглядит несколько иначе, но имеет одинаковую форму. Таким образом, 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

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

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

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

РЕДАКТИРОВАТЬ:

Если ты хочешь 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/ для получения дополнительной информации.

Другие вопросы по тегам