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ł?