2015-03-15 3 views
0

У меня нет большого опыта работы с распараллеливания в MATLAB (< 2 недель сделай сам), еще я получил работу цикла parfor, похожее на это:MATLAB parfor и классификация/использование переменных

N = 11; 
var1 = zeros(N, 2); 

parfor n=1:N 
    a = zeros(3, 3); 
    b = zeros(3, 3); 

    [a, b] = myfun(<arguments>); 

    var1(n, :) = [sum(sum(a,1),2) sum(sum(b,1),2);] 

end 

<portion of non parallelized code that makes use of var1 contents> 

Если я понял документацию/примеры до сих пор, «var1» классифицируется как срезанная переменная и «a» и «b» в качестве временных переменных. Я использую «var1» таким образом, потому что мне нужно использовать его содержимое после выполнения цикла parfor.

Я также хотел использовать переменные 'a' и 'b' в качестве срезанных переменных, чтобы избежать повторной инициализации/ненужного перераспределения памяти (?)/Увеличения параллельной производительности.

Я пытался что-то подобное для переменной «A»:

N = 11; 
var1 = zeros(N, 2); 
**a = zeros(3, 3, N);** 

parfor n=1:N 
    b = zeros(3, 3); 

    [**a(:,:,n)**, b] = myfun(<arguments>); 

    var1(n, :) = [sum(sum(**a(:,:,n)** ,1),2) sum(sum(b,1),2);] 

end 

<another portion of non parallelized code that makes use of var1 contents> 

с целью создания рабочих использовать части одного и того же региона в памяти, но я получаю ошибку «переменная а в parfor не может быть классифицированным ".

Итак, почему он не может быть классифицирован и использован как отрезанная переменная, например var1?

спасибо.

ответ

0

Что вы пытаетесь сделать, это не очень хорошая идея. Пересекаемая переменная означает связь, потому что первичный экземпляр отправляет ее работнику и получает ее оттуда. Это также означает использование двойной памяти, потому что основной экземпляр сохраняет переменную и (в срезах) рабочих.

Ваша первая версия в порядке. Вы можете удалить строки a = zeros(3, 3);b = zeros(3, 3);.

Вот как это будет выглядеть с нарезанным переменной a

N = 11; 
var1 = zeros(N, 2); 
a = zeros(3, 3,N); 
parfor n=1:N 

    [a(:,:,n), b] = myfun(2); 

    var1(n, :) = [sum(sum(a(:,:,n),1),2) sum(sum(b,1),2);] 
end 

Это код, который я рекомендовал бы:

N = 11; 
var1 = zeros(N, 2); 
parfor n=1:N 

    [a, b] = myfun(2); 

    var1(n, :) = [sum(a(:)) sum(b(:))] 
end