Я очень плохо знаком с параллельными вычислениями MatLab, поэтому мне нужна помощь.
Я пытаюсь распределить массив, который мне нужно рассчитать, по всем моим работникам.
Код, который яя пытаюсь распараллелить lokks следующим образом:
a = (normrnd(1,1,[100000,1]))+5;
i=0;
while i<=10000
b=randperm(length(a),length(a));
a=a(b);
for j=1:length(a)
a(j)=a(j)+1/a(j);
% some more function
end
i=i+1;
end
Теперь я хочу, чтобы внутренний цикл for работал, например, на 1/4 длины a на 4 ядрах. Это не может быть сделано с помощью parfor, потому что когда запускается внутренний цикл, это делает вычисления зависимыми друг от друга
Поэтому я хочу выбрать 4 произвольно выбранных массива одинакового размера из a и распределить их по моим работникам.
То, что я до сих пор делал, выглядит следующим образом
parcomp=parpool;
cores=parcomp.NumWorkers;
ind=0;
while ind<50000
% some serial code
b=randperm(length(a),length(a));
c=rem(length(b),cores);
d=reshape(b(1:end-c),[(length(b)-c)/cores,cores]);
for k=1:c
d((length(a)-c)/cores+1,k)=b((length(a)-c)+k);
end
spmd (cores)
ids = d(:,labindex);
grains=a;
[a]=myfun(ids{labindex},grains{labindex});
%
end
ind=ind+1;
% put a's together in one array for next itteration of while
% some more serial code
end
function[a]=myfun(ids,grains)
ids=ids(ids>0);
a=grains(ids);
for i=1:length(a)
a(i)=a(i)+1/a(i);
end
end
Функция myfun уже существует в моем серийном коде, я просто хочу, чтобы она вычисляла четвертую часть данных от одного, но на четырех рабочихпараллельно.
Каким-то образом я всегда получаю некоторые ошибки, такие как: Ошибка при использовании trypara (строка 19) Ошибка, обнаруженная на рабочих 1 2 3 4.
Причина: Ошибка при использовании trypara (строка 19) Индекс скобкине поддерживается для переменных этого типа.
Так что есть некоторая проблема с данными, когда я передаю их функции, но я понятия не имею, почему.
Может быть, кто-то может помочь мне с этим.
Большое спасибо заранее С уважением, Марк