2010-10-16 9 views
40

Ich erstelle eine Multi-Thread-Anwendung in C mit Linux.Pthreads vs OpenMP

Ich bin nicht sicher, ob ich die POSIX-Thread-API oder die OpenMP-API verwenden sollte.

Was sind die Vorteile & Nachteile der Verwendung von entweder?

Edit:

Könnte jemand klären, ob beide APIs auf Kernel-Ebene oder Benutzerebene Threads erstellen?

+0

Re: Ihre Bearbeitung (Kernel-oder User-Level?) - Es kommt auf die Implementierung an! Eine API ist nur das - eine ** Schnittstelle **. OpenMP ist nicht die Implementierung - [aber das sind einige Implementierungen] (http://en.wikipedia.org/wiki/OpenMP#Implementations). (Es gibt auch ein paar Informationen in [diesem Wikipedia-Artikel] (http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library)). –

+0

Wenn Sie in OpenMP das tun können, was Sie brauchen, sollten Sie es in OpenMP machen. –

+0

OpenMP sollte für Schleifen verwendet werden, die auf allen Kernen berechnet werden müssen. PThread kann das auch, aber das ist eine Menge Arbeit und es ist sehr schwer zu warten, Sie verwenden PThread normalerweise, wenn Sie einen separaten Prozess starten müssen, der den Hauptthread nicht blockieren sollte. Zum Beispiel: Sie haben einen Server, Clients verbinden und müssen die Verbindung mit dem Server halten und sprechen, Sie erstellen einen Thread pro Client und arbeiten mit dem Client in diesem Thread, ohne den Haupt-Thread zu blockieren. Sie erstellen eine neue Anwendung und lassen sie auf dem Betriebssystem laufen, ohne die Hauptanwendung zu belästigen. –

Antwort

50

PThreads und OpenMP repräsentieren zwei völlig verschiedene Multiprocessing-Paradigmen.

Pthreads ist eine sehr Low-Level-API für die Arbeit mit Threads. Somit haben Sie eine extrem feine Kontrolle über das Thread-Management (create/join/etc), Mutexe und so weiter. Es ist ziemlich nackt.

Auf der anderen Seite, OpenMP ist viel Ebene höher, mehr tragbar ist und Sie nicht auf die Verwendung C. begrenzen auch mehr Es ist viel leichter als pThreads skaliert. Ein konkretes Beispiel hierfür sind OpenMP Work-Sharing-Konstrukte, mit denen Sie Ihre Arbeit relativ einfach auf mehrere Threads aufteilen können. (Siehe auch Wikipedia pros and cons list.)

Das heißt, Sie haben wirklich keine Details über das spezifische Programm, das Sie implementieren, oder wie Sie es verwenden planen, so ist es ziemlich unmöglich, eine API über die andere zu empfehlen.

17

Wenn Sie OpenMP verwenden, kann so einfach sein wie das Hinzufügen eines einzelnen Pragma, und Sie werden 90% der Weg zu richtig Multithreading-Code mit linearer Beschleunigung sein. Um den gleichen Leistungsschub mit PThreads zu erzielen, braucht es viel mehr Arbeit.

Aber wie üblich, erhalten Sie mehr Flexibilität mit Pthreads.

Grundsätzlich hängt es davon ab, was Ihre Anwendung ist. Hast du einen trivial-parallelisierbaren Algorithmus? Oder haben Sie einfach viele willkürliche Aufgaben, die Sie gleichzeitig möchten? Wie viel müssen die Aufgaben miteinander sprechen? Wie viel Synchronisation ist erforderlich?

+2

Beantworten von Fragen mit Fragen ... tsk;) Es wäre toll, wenn Sie geklärt, wie die Antworten auf diese Fragen tatsächlich die Entscheidung beeinflussen Verwenden von Pthreads vs OpenMP. –

7

OpenMP hat die Vorteile, plattformübergreifend und für einige Operationen einfacher zu sein. Es behandelt in einer anderen Art und Weise Threading, dass es Ihnen höhere Ebene Threading-Optionen wie Parallelisierung von Schleifen, wie gibt:

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

Wenn Sie daran interessiert sind, und wenn C++ ist eine Option, würde ich auch empfehlen Threading Building Blocks.

Pthreads ist eine API der unteren Ebene zum expliziten Erzeugen von Threads und Synchronisation. In dieser Hinsicht bietet es mehr Kontrolle.

+5

POSIX-Threads, die Teil des POSIX-Standards sind, sind plattformübergreifend. OpenMP, das in keinem bekannten Betriebssystem oder C-Standard vorhanden ist, ist nicht plattformübergreifend, es sei denn, Sie haben eine wirklich seltsame Vorstellung davon, was plattformübergreifend bedeutet. –

+4

@R. - OpenMP ist in der Tat plattformübergreifend, wenn auch nicht formal standardisiert, mit C++ - und C-APIs. vgl. Boost in der C++ - Welt - kein De-jure-Standard, sondern ein De-facto-Standard. –

+0

@R ..: Ich bin mir nicht sicher, was Sie meinen, der OpenMP C API-Standard ist in dieser Spezifikation verfügbar (http://www.openmp.org/mp-documents/cspec20.pdf). Es sei denn du meintest, nicht standardisiert von IEEE/ANSI/ISO? – TechZilla

3

Es hängt von 2 Dingen ab - Ihrer Code-Basis und Ihrem Platz darin. Die wichtigsten Fragen sind: 1) "Haben Sie Code-Basis haben Threads, Threadpools und die Steuerelemente (Sperren, Ereignisse, etc.)" und 2) "Entwickeln Sie wiederverwendbare Bibliotheken oder normale Anwendungen?"

Wenn Ihre Bibliothek Thread-Tools hat (fast immer mit einem gewissen Geschmack von PThread), VERWENDEN SIE DIESE. Wenn Sie ein Bibliotheksentwickler sind, verbringen Sie die Zeit (wenn möglich), um sie zu erstellen.Es lohnt sich - Sie können viel feinkörnigeres, fortschrittlicheres Threading zusammenstellen, als OpenMP Ihnen bietet.

Umgekehrt, wenn Sie auf Zeit gedrückt werden oder nur Apps oder etwas von Drittanbieter-Tools entwickeln, verwenden Sie OpenMP. Sie können es in ein paar Makros verpacken und erhalten die grundlegende Parallelität, die Sie brauchen.

Im Allgemeinen ist OpenMP gut genug für einfaches Multithreading. Sobald Sie an den Punkt kommen, an dem Sie Systemressourcen direkt beim Erstellen von hoch asynchronem Code verwalten, wird der Benutzerfreundlichkeitsvorteil durch Leistungs- und Schnittstellenprobleme verdrängt.