2010-10-16 22 views
40

Sto creando un'applicazione multithreading in C utilizzando Linux.Pthreads vs. OpenMP

Non sono sicuro se utilizzare l'API del thread POSIX o l'API OpenMP.

Quali sono i pro & svantaggi dell'utilizzo di entrambi?

Edit:

Qualcuno potrebbe chiarire se entrambe le API creano kernel-level o utente di livello discussioni?

+0

Re: la tua modifica (kernel o livello utente?) - dipende dall'implementazione! Un'API è proprio questo: un'interfaccia ** **. OpenMP non è l'implementazione - [ma queste sono alcune implementazioni] (http://en.wikipedia.org/wiki/OpenMP#Implementations). (C'è anche un po 'di informazioni in [questo articolo di Wikipedia] (http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library)). –

+0

Fondamentalmente, se puoi fare ciò che ti serve in OpenMP, dovresti farlo in OpenMP. –

+0

OpenMP deve essere usato per i loop che devono essere calcolati su tutti i core. PThread può farlo anche se questo è molto lavoro ed è molto difficile da mantenere, di solito usi PThread se hai bisogno di avviare un processo separato che non dovrebbe bloccare il thread principale. Ad esempio: si dispone di un server, i client si connettono e devono mantenere la connessione con il server e parlare con esso, si crea un thread per client e si lavora con il client in quel thread senza bloccare il thread principale. È come se creasse una nuova applicazione e la lasciasse funzionare sul sistema operativo senza disturbare l'applicazione principale. –

risposta

50

Pthreads e OpenMP rappresentano due paradigmi di multiprocessing completamente diversi.

Pthreads è un'API di livello molto basso per lavorare con i thread. Quindi, avete un controllo estremamente dettagliato sulla gestione dei thread (create/join/etc), mutex e così via. È piuttosto scheletrico.

D'altra parte, è OpenMPmolto di più alto livello, è più portabile e non ti limitare a utilizzare C. E 'anche molto più facilmente in scala di pthreads. Un esempio specifico di questo è il costrutto di condivisione del lavoro di OpenMP, che consente di dividere il lavoro su più thread con relativa facilità. (Vedi anche Wikipedia pros and cons list.)

Detto questo, in realtà non hai fornito dettagli sul programma specifico che stai implementando o su come prevedi di usarlo, quindi è quasi impossibile consigliare una API rispetto all'altra.

17

Se si utilizza OpenMP, lo può essere semplice come aggiungere un singolo pragma e si otterrà il 90% del modo per codificare correttamente il codice con velocità lineare. Per ottenere lo stesso incremento di prestazioni con pthreads richiede molto più lavoro.

Ma come al solito, si ottiene una maggiore flessibilità con i pthread.

Fondamentalmente, dipende da quale è l'applicazione. Hai un algoritmo banalmente parallela? O hai solo un sacco di compiti arbitrari che ti piacerebbe contemporaneamente? Quanto devono essere necessarie le attività per parlare tra loro? Quanta sincronizzazione è richiesta?

+2

Rispondere alle domande con domande ... tsk;) Sarebbe bello se chiarissi in che modo le risposte a tali domande influenzano effettivamente la decisione usare pthreads vs OpenMP. –

7

OpenMP presenta i vantaggi di essere multipiattaforma e più semplice per alcune operazioni. Gestisce threading in modo diverso, nel senso che ti dà le opzioni di più alto livello di threading, come ad esempio la parallelizzazione di loop, come ad esempio:

#pragma omp parallel for 
for (i = 0; i < 500; i++) 
    arr[i] = 2 * i; 

Se questo vi interessa, e se C++ è un'opzione, mi piacerebbe anche raccomandare Threading Building Blocks.

Pthreads è un'API di livello inferiore per la generazione esplicita di thread e sincronizzazione. A tale riguardo, fornisce più controllo.

+5

I thread POSIX, che fanno parte dello standard POSIX, sono multipiattaforma. OpenMP, non essendo presente in alcun sistema operativo o standard di linguaggio C che conosco, non è multipiattaforma, a meno che non si abbia una strana idea di cosa significhi la piattaforma multipiattaforma. –

+4

@R. - OpenMP è infatti multipiattaforma, anche se non formalmente standardizzata, con API C++ e C. cf. Amplia il mondo del C++, non uno standard de iure, ma uno standard de facto. –

+0

@R ..: Non sono sicuro di cosa intendi, lo standard API OpenMP C è disponibile in questa specifica (http://www.openmp.org/mp-documents/cspec20.pdf). A meno che non intendessi, non standardizzato da IEEE/ANSI/ISO? – TechZilla

3

Dipende da 2 cose: la base del codice e il proprio posto all'interno. Le domande chiave sono: 1) "Il codice base ha thread, threadpool e le primitive di controllo (serrature, eventi, ecc.)" E 2) "Stai sviluppando librerie riutilizzabili o app ordinarie?"

Se la libreria dispone di strumenti di thread (quasi sempre basati su alcuni aspetti di PThread), UTILIZZARLI. Se sei uno sviluppatore di librerie, dedica il tempo (se possibile) a costruirle.Ne vale la pena: puoi mettere insieme più threading a grana fine e avanzati di quelli che OpenMP ti offre.

Al contrario, se si preme per tempo o semplicemente lo sviluppo di app o qualcosa di diverso da strumenti di terze parti, utilizzare OpenMP. Puoi racchiuderlo in poche macro e ottenere il parallelismo di base di cui hai bisogno.

In generale, OpenMP è sufficiente per il multi-threading di base. Una volta che si arriva al punto che si sta gestendo risorse di sistema direttamente sulla costruzione di un codice altamente asincrono, il vantaggio della facilità d'uso si affievolisce per le prestazioni e problemi di interfaccia.