Parallele Schleifen in C++
Frage ich mich, ob es gibt ein Licht, geradlinig zu berechnen Schleifen wie for und range-basierte for-Schleifen parallel in C++. Wie würden Sie die Implementierung einer solchen Sache? Von Scala ich kenne die map -, filter-und foreach-Funktionen vielleicht wäre es auch möglich, führen Sie diese parallele? Gibt es eine einfache Möglichkeit, dies zu erreichen in C++.
Meine primäre plattform ist Linux, aber es wäre schön, wenn es funktioniert cross-plattform.
die Verwendung von threads ist eine gute option.
Ist es nicht wirklich teuer zu initialisieren threads?
Da im Vergleich zu den fork () - Aufruf. Threads sind nicht teuer, wie Sie sind, das teilen der Ressourcen aus dem Haupt-thread, außer Sie haben Ihren eigenen PC, Register-und stack.
Sie sind leicht im Gewicht.
Sie haben zu initialisieren threads; wie wäre Sie sonst wollen, um Parallelität zu erreichen? Ok, es gibt auch andere Möglichkeiten, wie z.B. Vektorisierung, aber es ist wahrscheinlich für Sie automatisch von einem compiler, wenn Sie bei der Optimierung baut.
Ist es nicht wirklich teuer zu initialisieren threads?
Da im Vergleich zu den fork () - Aufruf. Threads sind nicht teuer, wie Sie sind, das teilen der Ressourcen aus dem Haupt-thread, außer Sie haben Ihren eigenen PC, Register-und stack.
Sie sind leicht im Gewicht.
Sie haben zu initialisieren threads; wie wäre Sie sonst wollen, um Parallelität zu erreichen? Ok, es gibt auch andere Möglichkeiten, wie z.B. Vektorisierung, aber es ist wahrscheinlich für Sie automatisch von einem compiler, wenn Sie bei der Optimierung baut.
InformationsquelleAutor Exagon | 2016-03-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist deine Plattform? Sie können sich OpenMP, obwohl es nicht Teil von C++. Aber es ist weithin unterstützt von Compilern.
Als für die range-basierte for-Schleifen, siehe, z.B., Mit OpenMP mit C++11-range-basierte for-Schleifen?.
Ich habe auch gesehen, einige Dokumente an http://www.open-std.org, die darauf hindeuten, einige Anstrengungen zu integrieren, und parallel-Konstrukte/algorithmen in Zukunft C++, aber nicht wissen, was Ihren aktuellen status.
UPDATE
Nur das hinzufügen einige Beispiel-code:
Die Anzahl der threads kann zur Laufzeit über die
OMP_NUM_THREADS
Umgebungsvariable.Was sind Sie Durchlaufen? Können Sie Indizes verwenden, für die Schleife?
Es hängt davon ab, in welcher Weise Sie die Einnahme von arbeiten aus Fäden. Sie können Bedingungen in Schleifen, mit denen Sie die Arbeit aufzuteilen.
Ja ich kann nett sein würde, wenn es funktioniert mit range-basiert, aber ich kann auch den Zugriff auf die Daten über Indizes
Mit
RandomAccessIterator
s arbeiten Sie mit den offsets innerhalb der Schleife und dann Zugriff auf Elemente wie*(container.begin()+i)
.InformationsquelleAutor Daniel Langr
Mit den parallelen algorithmen in C++17 wir können nun:
berechnen Schleifen parallel. Der erste parameter gibt die Ausführungsrichtlinie
Intel C++ compiler, wenn Sie ein student sind, können Sie es kostenlos zu bekommen.
ist implementiert in Microsoft VS 2017 15.5, siehe blogs.msdn.microsoft.com/vcblog/2017/12/19/...
gut zu wissen, danke
InformationsquelleAutor Exagon
std::async
vielleicht eine gute Passform hier, wenn Sie glücklich sind, lassen Sie dieC++
runtime Kontrolle der Parallelität.Beispiel aus der cppreference.com:
gibt es eine Dokumentation, wie c++ behandelt die parallelen Aufgaben und asyncs?
Der erste parameter
std::async()
gibt, was die Freiheit, die Sie geben, um die Rahmen (vor allem, ob Sie mit den Vordergrund-thread). Was bedeutet es für den hintergrund - es ist compiler-spezifisch, aber die meisten wahrscheinlich auf die meisten Compiler es wird eine singleton thread-pool mit N=Anzahl der CPU-Kerne auf dem Feld. Beste Nutzung der Dokumentation kam ich cross so weit ist die Parallelität Kapitel aus dem letzten Mayers Buch.Wenn man bedenkt, dass
async
startet einen neuen thread jedes mal, dass diese Lösung nicht so effektiv. Sie laichen 1000 neue threads, jeder hat einen Stapel von 1+ MB-stack ?ob async erstellt einen thread oder nutzt einen hintergrund pool ist die Umsetzung von spezifischen (aber ja, mit GCC tut es spawnen). Niemand sagt, über Laich-1000 von threads, die offensichtlich (wenn auch auf einem Feld mit 1000 CPUs - warum nicht), aber Laich ein paar. läuft mehrere Sekunden in jeder und diese zu beenden, kann sein, das lohnt sich. Es hängt alles von den Besonderheiten des Problems.
InformationsquelleAutor bobah
Diese kann getan werden, mit
threads
speziellpthreads
library-Funktion, die verwendet werden können, um Operationen gleichzeitig.Lesen Sie mehr über Sie hier : http://www.tutorialspoint.com/cplusplus/cpp_multithreading.htm
std::thread kann auch benutzt werden : http://www.cplusplus.com/reference/thread/thread/
Unten ist ein code, in dem ich die thread-id der einzelnen Threads zu split das array in zwei Hälften :
Denken Sie auch daran, während der Kompilierung verwenden Sie den
-lpthread
Flagge.Link zur Lösung auf Ideone : http://ideone.com/KcsW4P
start index
und dieend index
in der Funktion, die Sie verwenden, und ändern Sie es entsprechend für jeden thread zu verwenden.Die
pthread_create
Funktion nimmt in der Seite, die ein argument enthält den Namen der Funktion, die Sie möchten, dass Ihre threads zu verwenden, ändern Sie diese Funktionen Argumente zu erreichen das gewünschte Ergebnis.warum würde er wollen, verwenden pthreads, wenn er
std::thread
?Haim habe ich vorgeschlagen, in der Antwort, dass er auch
std::thread
.InformationsquelleAutor uSeemSurprised
Mit C++11 können Sie parallelisieren, eine for-Schleife mit nur ein paar Zeilen Code.
Dadurch wird eine for-Schleife in kleinere Stücke und ordnen Sie jedem sub-Schleife einen thread:
Oder innerhalb einer Klasse:
Um dies zu tun, müssen Sie nur setzen Sie den folgenden code in eine header-Datei und verwenden Sie es zu werden:
Schließlich könnten Sie ein makro, um eine noch kompaktere Ausdruck:
InformationsquelleAutor arkan
Concurrency::parallel_for (PPL) ist auch eines der schönen opions zu tun, task-Parallelität.
Entnommen C++ Coding Übung – Parallel – Monte-Carlo-PI-Berechnung
InformationsquelleAutor Zhihua Lai