Jak zagnieździć wiele pętli parfor

parfor to wygodny sposób dystrybucji niezależnych iteracji intensywnych obliczeń wśród kilku „pracowników”. Jednym z istotnych ograniczeń jest toparfor-loops nie może być zagnieżdżony i zawsze jest to odpowiedź na podobne pytaniatam itam.

Dlaczego równoległość między granicami pętli jest tak pożądana

Rozważmy następujący fragment kodu, w którym iteracje zajmują bardzo zmienną ilość czasu na maszynie, która pozwala 4 pracownikom. Obie pętle iterują ponad 6 wartości, wyraźnie trudnych do podzielenia między 4.

for row = 1:6
    parfor col = 1:6
        somefun(row, col);
    end
end

Dobrym pomysłem jest wybór wewnętrznej pętliparfor ponieważ indywidualne połączenia dosomefun są bardziej zmienne niż iteracje zewnętrznej pętli. Ale co, jeśli czas uruchomienia dla każdego połączeniasomefun jest bardzo podobny? Co jeśli istnieją trendy w czasie wykonywania i mamy trzy zagnieżdżone pętle? Te pytania pojawiają się regularnie, a ludzie idą doskrajności.

Wzór potrzebny do łączenia pętli

Idealnie,somefun jest uruchamiany dla wszystkich parrow icol, a pracownicy powinni być zajęci niezależnie od tego, które z nich są zróżnicowane. Rozwiązanie powinno wyglądać

parfor p = allpairs(1:6, 1:6)
    somefun(p(1), p(2));
end

Niestety, nawet gdybym wiedział, która funkcja wbudowana tworzy macierz ze wszystkimi kombinacjamirow icol, MATLAB narzekałby na błądZakres instrukcji parfor musi być wektorem wiersza. Jeszcze,for nie będzie narzekać i ładnie iterować po kolumnach. Łatwym obejściem byłoby utworzenie tej macierzy, a następnie jej indeksowanieparfor:

p = allpairs(1:6, 1:6);
parfor k = 1:size(pairs, 2)
    row = p(k, 1);
    col = p(k, 2);
    somefun(row, col);
end

Jaka jest wbudowana funkcja zamiastallpairs czego szukam? Czy jest wygodnywzór idiomatyczny że ktoś wymyślił?

questionAnswers(3)

yourAnswerToTheQuestion