2014-04-23 12 views
6

Esistono diversi modi per implementare il multithreading. std::thread è stato infine portato dallo standard C++ 11, ma invece è possibile utilizzare efficacemente lo boost::thread. Ogni tecnologia ha una sintassi specifica e roba, ma - approssimativamente - utilizzata per la programmazione parallela della CPU. Ma hanno un effetto diverso. So che, ad esempio, MPI e OpenMP sono utilizzati per diversi modelli di memoria.Come correlare i thread OpenMP, MPI, POSIX, std :: thread, boost :: thread?

So anche che la scelta di una tecnologia non è in realtà esclusiva, quindi è possibile utilizzarne un'altra (ancora, MPI e OpenMP). Come mai vengono usati per effetti diversi ma funzionano ancora con la stessa fonte (CPU)?

Quale sarebbe la differenza (dal punto di vista del sistema operativo e dell'hardware) se compilo un programma C++ con parallelismo basato su ciascuna di queste tecnologie? Ad esempio, OpenMP o std::thread utilizza i thread POSIX? In tal caso, in che modo i thread di C++ 11 funzionano su Windows? O ognuna di queste tecnologie lavora direttamente con la CPU tramite linguaggio assembly o qualcosa del genere?

+2

Miscelare OpenMP con un altro paradigma di threading, ad es. 'std :: thread', non è un comportamento specificato. Non è esplicitamente vietato nelle specifiche. ma ancora se funziona o meno è molto specifico per l'implementazione. La combinazione di MPI con OpenMP o altri paradigmi di threading va bene, a condizione che MPI sia inizializzato correttamente con il supporto per i thread. –

risposta

9

Il sistema operativo fornisce thread (syscalls per creare nuovi thread, servizi di pianificazione).

Unix libc ha wrapper attorno ai thread del sistema operativo con molte funzioni utili (come mutex, cond vars, ecc.). Di solito interfaccia esterna di tali librerie di sistema è "thread POSIX" (funzioni denominate pthread_*): http://en.wikipedia.org/wiki/POSIX_Threads

di Windows ha una propria API difficile da usare threading (CreateThread di WINAPI, ecc). Ma ci sono involucri intorno API di Windows per ottenere qualcosa di simile thread POSIX API (ad esempio, non v'è tali librerie per mingw32 e Cygwin, controllare wikipedia section)

C++ 11 std::thread, spinta di boost::thread sono solo moderni involucri OS-indipendente intorno threading sistema API. Vengono utilizzati per creare programmi portatili che possono essere compilati su qualsiasi piattaforma supportata, senza creare l'inferno #ifdef e/o la scrittura di propri wrapper personalizzati attorno alla libreria di threading del sistema. Se stai creando un nuovo programma, considera di utilizzare in questo modo.

Esistono diversi altri avvolgitori per filettatura, ad es. incluso in librerie grafiche come QT o GTK +.

Le implementazioni OpenMP dispongono di una libreria di supporto interna (ad esempio, gcc ha libgomp) che utilizza le API di thread di sistema/libc, ad esempio libgomp utilizza i thread POSIX. Alcune implementazioni possono anche includere la commutazione del thread dello spazio utente tramite assembly (modello di threading M: N).

MPI non contiene alcuna libreria di thread. MPI viene utilizzato per creare diversi processi e impostare la comunicazione tra di loro. Ma quando MPI viene usato in programmi multithread, userà alcune API di threading per fare la sincronizzazione. Ad esempio, MPICH utilizzerà pthread su Unix.