risposta

32

La programmazione multithread è parallela, ma la programmazione parallela non è necessariamente multithread.

A meno che il multithreading non si verifichi su un singolo core, nel qual caso è solo simultaneo.

+2

AFAIK, su un processore single core, la filettatura non è parallela. È concomitante, ma non parallelo. –

+0

@Ionut: http: //thesaurus.reference.com/browse/concurrent <- Se si guarda sotto l'intestazione 'Sinonimi' del primo risultato. –

+5

la differenza che faccio tra concomitante e parallelo è che il parallelo è veramente simultaneo, mentre il simultaneo sembra essere simultaneo. Il passaggio tra i thread è così veloce da sembrare parallelo, ma non lo è. Forse ci sono altri termini che lo designano, ma è quello che capisco. –

28

Non necessariamente. È possibile distribuire lavori tra più processi e persino più macchine: non lo classificherei come programmazione "multi-thread" poiché ogni processo può utilizzare solo un singolo thread, ma è sicuramente una programmazione parallela. Certo, si potrebbe quindi affermare che con più processi ci sono più thread all'interno del sistema nel suo insieme ...

In definitiva, definizioni come questa sono utili solo all'interno di un contesto. Nel tuo caso particolare, che differenza farà? O è solo per interesse?

+1

Dovremmo anche considerare la SIMD come programmazione parallela? Stiamo eseguendo le stesse operazioni su più dati in parallelo, ma non so se questo è considerato come una micro-parallelizzazione da includere in una definizione di programmazione parallela. –

+0

Direi che SIMD era più design hardware parallelo, ma credo che a un certo livello si debba considerare il lato programmazione di avere hardware parallelo dedicato, ad es. che dire della programmazione per una GPU? –

26

No. La programmazione multithread indica che si dispone di un singolo processo e questo processo genera una serie di thread. Tutti i thread sono in esecuzione allo stesso tempo, ma sono tutti nello stesso spazio del processo: possono accedere alla stessa memoria, avere gli stessi descrittori di file aperti e così via.

La programmazione parallela è un po 'più "generale" come definizione. in MPI, si esegue la programmazione parallela eseguendo lo stesso processo più volte, con la differenza che ogni processo ottiene un diverso "identificatore", quindi se lo si desidera, è possibile differenziare ogni processo, ma non è necessario. Inoltre, questi processi sono indipendenti l'uno dall'altro e devono comunicare tramite pipe o socket di rete/unix. Le librerie MPI forniscono funzioni specifiche per spostare i dati avanti e indietro dai nodi, in stile sincrono o asincrono.

Al contrario, OpenMP realizza la parallelizzazione tramite multithreading e memoria condivisa. Specificate direttive speciali per il compilatore e automaticamente esegue automaticamente l'esecuzione parallela.

Il vantaggio di OpenMP è che è molto trasparente. Hai un ciclo per parallelizzare? basta aggiungere un paio di direttive e il compilatore si divide in pezzi e assegnare ogni parte del loop a un processore diverso. Sfortunatamente, per questo hai bisogno di un'architettura a memoria condivisa. I cluster con architettura basata su nodo non sono in grado di utilizzare OpenMP a livello di cluster. MPI ti consente di lavorare su un'architettura basata su nodo, ma devi pagare il prezzo di un utilizzo più complesso e non trasparente.

+0

ow, quindi è media 1 processo viene elaborato da n processo non 1 processo viene elaborato da n thread –

+0

Mi sembra di ricordare che il lavoro _è stato fatto su parallelizzazione in stile OpenMP per architetture multiprocesso ... Non riesco a ricordare se fa parte di OpenMP stesso o qualcos'altro? –

+1

@Eko: non esattamente. MPI avvia n istanze dello stesso programma, ognuna con un numero id diverso in una variabile speciale (cerca MPI_Comm_Rank). Che cosa fare con queste istanze dipende da te. –