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

È stato utile?

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

Parforcomes 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 parforon 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top