MATLAB parfor è più lento di per - ciò che è sbagliato?
-
02-10-2019 - |
Domanda
il codice ho a che fare con i loop ha come le seguenti:
bistar = zeros(numdims,numcases);
parfor hh=1:nt
bistar = bistar + A(:,:,hh)*data(:,:,hh+1)' ;
end
per le piccole nt (10).
Dopo cronometraggio, in realtà è 100 volte più lento che utilizzare il ciclo normale !!! So che può fare parfor somme parallele, quindi non sono sicuro perché questo non sta funzionando.
corro
matlabpool
con le configurazioni out-of-the-box prima di eseguire il mio codice.
Sono relativamente nuovo a MATLAB, e appena iniziato a utilizzare le funzioni parallele, quindi per favore non scontato che io non sto facendo qualcosa di stupido.
Grazie!
PS:. Io corro il codice su un quad core quindi mi sarei aspettato di vedere alcuni miglioramenti
Soluzione
Portando il partizionamento e raggruppando i risultati (overhead nel dividere il lavoro e la raccolta dei risultati dei vari fili / core) è alto per piccoli valori di nt
. Questo è normale, non si farebbe dati della partizione per compiti semplici che possono essere eseguite rapidamente in un semplice ciclo.
Eseguire sempre qualcosa di impegnativo all'interno del ciclo che vale l'overhead di partizionamento. Ecco un bel introduzione alla programmazione parallela .
I fili vengono da un pool di thread così il sovraccarico di creare filettature non dovrebbe essere lì. Ma per creare i risultati parziali n
matrici dalla dimensione bistar
deve essere creato, tutti i risultati parziali calcolato e quindi tutti questi risultati parziali devono essere aggiunti (ricombinazione). In un ciclo retta, questo è con un'alta probabilità fatte sul posto, senza assegnazioni avvengono.
La dichiarazione completa nella guida (grazie per il tuo link di seguito) è:
Se il tempo di calcolo f, g, h ed è grande , parfor sarà significativamente più veloce del corrispondente dichiarazione, anche se n è relativamente piccolo.
Quindi, vedete significano esattamente la stessa cosa voglio dire, l'overhead per n valori piccoli vale solo la pena se ciò che si fa nel circuito è complesso consumando abbastanza tempo /.
Altri suggerimenti
Parfor
comes con un po 'di overhead. Così, se nt
è davvero piccolo, e se il calcolo del ciclo è fatto molto rapidamente (come un'aggiunta), la soluzione parfor
è più lento. Inoltre, se si esegue parfor
on un quad-core, aumento della velocità sarà vicino a lineare per 1-3 core, ma meno se si utilizza 4 core, dall'ultima nucleo deve anche eseguire processi di sistema.
Per esempio, se parfor dotato 100ms di overhead, e il calcolo nel ciclo prende 5ms, e se assumiamo che il guadagno velocità è fino lineare a 4 core con un coefficiente di 1 (vale a dire utilizzando 4 core rende il calcolo 4 volte più veloce), nt
deve essere di circa 30 per voi per raggiungere un guadagno di velocità con parfor
(150ms con for
, 132ms con parfor
). Se si dovesse eseguire solo 10 iterazioni, parfor
sarebbe più lento (50ms con for
, 112ms con parfor
).
È possibile calcolare il carico sulla vostra macchina confrontando il tempo di esecuzione con 1 lavoratore vs 0 lavoratori, ed è possibile stimare il guadagno di velocità facendo una forma di linea attraverso i tempi di esecuzione da 1 a 4 lavoratori. Allora saprete quando è utile utilizzare parfor
.
Oltre alla cattiva performance a causa del sovraccarico di comunicazione (vedi altre risposte), c'è un altro motivo per non utilizzare parfor
in questo caso. Tutto ciò che viene fatto all'interno della parfor
in questo caso utilizza built-in multithreading . Assumendo che tutti i lavoratori sono in esecuzione sullo stesso PC non v'è alcun vantaggio perché una singola chiamata già utilizza tutti i core del processore.