Multi-Core-Programmierung. Erhöhung der MPI, OpenMP, TBB, oder etwas anderes?
Ich bin Total ein Anfänger in Multi-Core-Programmierung, aber ich weiß, wie man das Programm C++.
Nun, ich bin auf der Suche rund um für Multi-Core-Programmierung Bibliothek. Ich möchte nur, es zu versuchen, nur zum Spaß, und jetzt habe ich vor 3 APIs, aber ich bin nicht sicher, welche sollte ich stick mit. Jetzt sehe ich Schub ' s MPI, OpenMP und TBB.
Für alle, die erlebt haben, mit diesen 3 API (oder einer anderen API), könnten Sie mir bitte sagen, der Unterschied zwischen diesen? Gibt es irgendwelche Faktor zu berücksichtigen, wie AMD-oder Intel-Architektur?
- Lesen Sie boost::thread-Dokumentation und versuchen Sie einige Beispiele. Dies ist wahrscheinlich der nützlichste Weg, um zu lernen. Blick auf Dr. dobbs website: drdobbs.com/cpp/184401518
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unter der Haube OpenMP ist multi-threaded Programmierung, sondern auf einer höheren Ebene der Abstraktion als TBB und seine ilk. Die Wahl zwischen den beiden, für die parallele Programmierung auf einem multi-core-computer, ist ungefähr das gleiche wie die Wahl zwischen höheren und niedrigeren Ebene der software innerhalb der gleichen Domäne: es gibt einen trade-off zwischen Ausdrucksstärke und Kontrollierbarkeit.
Intel vs AMD ist irrelevant, denke ich.
Und Ihre Wahl sollte davon abhängen, was Sie versuchen zu erreichen; zum Beispiel, wenn Sie lernen wollen, TBB dann TBB ist definitiv der Weg zu gehen. Aber wenn Sie wollen parallelise ein bestehendes C++ - Programm in einfachen Schritten, dann OpenMP ist wohl eine bessere erste Wahl; TBB immer noch bestehen, um für Sie später zu bekämpfen. Ich würde wahrscheinlich meiden MPI auf den ersten, es sei denn ich war sicher, dass ich wäre die übertragung von shared-memory-Programmierung (das ist meist, was Sie tun, auf einer multi-core) zu distributed-memory-Programmierung (in Clustern oder Netzwerken). Wie immer , die Technologie, die Sie wählen sollten, hängt von Ihren Anforderungen.
Als Startpunkt würde ich vorschlagen, dass OpenMP. Mit diesem können Sie sehr einfach drei grundlegende Arten von Parallelität: Schleifen, Abschnitte, und Aufgaben.
Parallele Schleifen
Diese ermöglichen es Ihnen, split-loop-Iterationen über mehrere threads. Zum Beispiel:
Wenn Sie wurden unter Verwendung von zwei threads, dann der erste thread wäre, der Durchführung der ersten Hälfte der iteration. Der zweite thread würde in die zweite Hälfte.
Abschnitte
Diese ermöglichen die statische partition, die Arbeit über mehrere threads. Dies ist nützlich, wenn es offensichtlich ist Arbeit, die parallel ausgeführt werden können. Aber es ist nicht eine sehr flexible Vorgehensweise.
Aufgaben
Aufgaben sind der flexibelste Ansatz. Diese werden dynamisch erstellt und deren Ausführung erfolgt asynchron, entweder durch den thread, der Sie erstellt hat, oder von einem anderen thread.
Vorteile
OpenMP hat mehrere Dinge, die für es.
Richtlinie-basiert: der compiler übernimmt die Arbeit für das erstellen und synchronisieren der threads.
Inkrementelle Parallelität: Sie können den Fokus nur auf die region-code, den Sie brauchen, um parallelise.
Einer Hand Basis für seriellen und parallelen code: Die OpenMP-Direktiven werden nur vom compiler erkannt, wenn Sie es starten mit einem flag (
-fopenmp
für gcc). So können Sie mit der gleichen source-Basis zu generieren, die sowohl für seriellen und parallelen code. Dies bedeutet, dass Sie können schalten Sie die Flagge, um zu sehen, wenn Sie das gleiche Ergebnis von der seriellen version des Codes, oder nicht. Auf diese Weise können Sie isolieren Parallelität von Fehlern von Fehlern im Algorithmus.Finden Sie das gesamte OpenMP-spec auf http://www.openmp.org/
Ich würde vorschlagen, Sie spielen mit MapReduce für irgendwann. Sie können die Installation von mehreren virtuellen Maschinen-Instanzen auf der gleichen Maschine, auf jeder läuft ein Hadoop Instanz (Hadoop ist eine Yahoo! open-source-implementation von MapReduce). Es gibt eine Menge von online-tutorials für das einrichten von Hadoop.
btw, MPI und OpenMP sind nicht das gleiche. OpenMP für shared-memory-Programmierung, die in der Regel bedeutet, multi-core-Programmierung, parallel-Programmierung auf mehrere Maschinen.
Hängt von Ihrem Fokus. Wenn Sie hauptsächlich daran interessiert, die multi-threaded-Programmierung gehen Sie mit TBB. Wenn Sie mehr Interesse an Prozess-Ebene Parallelität dann MPI ist der Weg zu gehen.
Eine weitere interessante Bibliothek ist OpenCL. Im Grunde können Sie alle Ihre hardware (CPU, GPU, DSP, ...) in der besten Weise.
Es hat einige interessante features, wie die Möglichkeit zu schaffen, Hunderte von threads ohne Leistungseinbußen.