2012-12-07 6 views
6

Non sono sicuro di cosa significhi che le iterazioni di un ciclo parallelo per essere indipendenti. Il seguente è un esempio di due loop paralleli validi? Scrivono e leggono la stessa matrice, ma gli indici delle matrici sono unici per ogni iterazione.Può un parallelo per scrivere in loop su una matrice comune?

X = zeros(64); 
parfor i = 1:64^2 
    X(i) = i; 
end 
parfor i = 1:64 
    X(i,:) = X(i,:) .* randn(1,64); 
end 
+0

Matlab emette un errore se non è un loop parallelo valido. Quindi, devi solo eseguirlo in MATLAB e avrai subito la risposta. – Oli

+2

Questa citazione dai documenti sembra indicare che Matlab non avvisa sempre: "Nota A causa dell'indipendenza dell'ordine di iterazione, l'esecuzione di parfor non garantisce risultati deterministici." – Andreas

+1

Significa solo che l'iterazione può essere eseguita in qualsiasi ordine. Ciò non ha alcuna influenza sul tuo caso. – Oli

risposta

4

Per quanto concerne parfor, i seguenti tre istruzioni possono essere considerate equivalenti:

1) Le iterazioni di un ciclo parfor devono essere indipendenti.

2) Nessuna iterazione di un ciclo parfor può dipendere dal risultato di qualsiasi altra iterazione.

3) Le iterazioni di un ciclo parfor devono essere in grado di essere eseguiti in qualsiasi ordine (da @Oli)

modo queste affermazioni confronta con un ciclo regolare? In un tipico loop da 1 a 8, la quarta iterazione, ad esempio, può dipendere dalle iterazioni 1, 2 e 3, poiché il software può essere certo che queste iterazioni siano già avvenute al momento in cui raggiungiamo il numero di iterazione 4. NON deve dipende dalle iterazioni 5, 6, 7 e 8, poiché il software può essere certo che queste iterazioni non si siano verificate.

In un ciclo parfor, come gli stati @Oli, i loop possono verificarsi in qualsiasi ordine. Possono verificarsi nel seguente ordine, ad esempio 7 3 4 1 2 5 8 6. O qualsiasi permutazione di questi 8 numeri. Ciò implica qualcosa di molto importante: Non c'è modo di sapere prima del fatto che l'iterazione si verificherà per prima. Per vedere questo, basta chuck un fprintf('Up to iteration %d of %d\n', t, T) all'interno del ciclo parfor, dove t è l'indice del ciclo e T è il limite superiore del ciclo.

La dichiarazione di cui sopra implica immediatamente la seguente conclusione: Poiché qualsiasi iterazione potrebbe verificarsi per prima, è fondamentale che nessuna iterazione dipenda dal risultato di un'altra iterazione. Concludo la risposta con alcuni esempi:

X = ones(8, 8) 
parfor n = 1:8 
    X(:,n) = X(:,n) .* (3 * ones(8,1)); 
end 

In questo esempio, (3 * ones(8,1)) chiaramente non dipende da qualsiasi altra iterazione - essendo costante rispetto al contatore del ciclo. Allo stesso modo X(:, n) non dipende da alcuna iterazione all'infuori dell'ennesimo. MODIFICA: In precedenza utilizzavo lo randn nell'esempio sopra: vedere la discussione nei commenti fornita da @AndrewJanke per il motivo per cui questa era una cattiva idea. Che dire di questa situazione:

X = ones(8, 8); 
parfor n = 1:8 
    X(:,n) = X(:,n) + (n + 1); 
end 

Anche questo è perfettamente valido. Sebbene nell'espressione esista un numero n + 1, non è lo stesso a seconda del numero di iterazione n + 1. Piuttosto, assegna semplicemente il valore intero del numero di iterazione corrente, più 1, a X.

Infine, si consideri:

X = ones(8, 1); 
parfor n = 2:8 
    X(n, 1) = X(n-1, 1) + 1; 
end 

questo sarebbe perfettamente valido in un ciclo regolare, dal momento che il numero di iterazione n-1 avverrà sempre prima iterazione n (assumendo che stiamo eseguendo un ciclo in avanti). Ma in un ciclo parfor, ciò causerà un errore, poiché il numero di iterazione n potrebbe verificarsi prima del numero di iterazione n-1.Il linguaggio che Matlab usa per descrivere il problema qui è chiamato "slicing". Immaginate che X sia affettato dalle iterazioni del ciclo. Quindi, nell'ennesimo iterazione, puoi sempre fare riferimento all'ennesima porzione di X.

Un ultimo punto, se mai avessi dubbi su un ciclo parfor, ho letto la sezione nella documentazione intitolata: "Parallelo per loop in Matlab - panoramica" (mi dispiace, non riesco a trovare la pagina web corrispondente - insolita per Matlab documentazione) Descrive tutte le possibili classificazioni variabili all'interno dei loop e le restrizioni che un loop parfor inserisce in ciascuna classificazione. Quello che ho discusso in questa risposta è in realtà solo la punta dell'iceberg. Ad esempio, dichiarazioni come n = n + 1 non sono valide in un ciclo parfor, poiché n è la variabile di ciclo e le assegnazioni alla variabile di ciclo non sono consentite.

+1

Hmmm. Sai, 'randn' potrebbe essere un cattivo esempio per questo, perché ha un effetto collaterale sullo stato globale di Matlab. È un PRNG e ogni sessione di Matlab inizia con lo stesso seme casuale; ogni chiamata 'randn' lo anticipa. Quindi il suo output dipende dalle precedenti iterazioni del ciclo; l'output di 'randn' è una funzione di quante volte è stato chiamato in quella sessione. Ogni lavoratore è una sessione, quindi i risultati di questo codice dipenderanno direttamente da quanti lavoratori ci sono, da quale ordine vengono eseguiti i loop, e cos'altro ha influenzato lo stato 'rng' di quelle sessioni. –

+1

Cioè, penso che l'uso di 'randn' viola il" è fondamentale che nessuna iterazione dipenda dal risultato di qualsiasi altra iterazione "regola, perché parte del risultato di un'iterazione che chiama' randn' è che 'rng' è avanzato e questo è un input nascosto per 'randn'. Questo è un nondeterminismo che il controllo 'parfor' non può catturare, quindi un programmatore umano deve o evitare o garantire che il non-determinismo" non abbia importanza ". La cosa "giusta" da fare qui è probabilmente quella di generare l'intero blocco di rands prima di 'parfor', e quindi suddividerlo in iterazioni di loop; allora avrai la riproducibilità. –

+0

@AndrewJanke Non ci avevo pensato! Molto intelligente! Ho adeguato la risposta di conseguenza per rimuovere 'randn'. Penso che sarebbe solo confuso il lettore per incorporare una discussione sul determinismo intrinseco della maggior parte dei generatori di numeri casuali nella risposta di cui sopra. –

Problemi correlati