Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

C++: Multithreading

Aufgabe zu std::async

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Hier bekommen Sie eine Übungsaufgabe, die Parallelisierung eines Programms zur Berechnung eines Skalarprodukts.
04:50

Transkript

Damit kommen wir schon zur Aufgabe von std::async. In der Aufgabe geht es darum, das Programm dot.Product als Grundlage zu nehmen und das zu parallelisieren. Durch vier asynchrone Funktion-Aufrufen in dot.Product berechne ich das Kreuzprodukt und das Skalarprodukt zweier Vektoren der Länge 100 Millionen, die mit zufälligen Werten gefüllt sind. Wird es dann natürlich interessant, die Performance von den Singlethreaded- versus die Multithreaded- Ausführungszeiten zu vergleichen. Und hier sieht man Link zu weiterführender Information zu std::async. Nun aber zur Aufgabe. Am Anfang möchte ich das Single-Thread entfalten. Das ist die Funktion, die mich interessiert. Insbesondre interessiert mich, wie lange es dauert, bis die Funktion ausgeführt wurde. Ich habe hier Vektoren, v und w. Und mich interessiert das Skalarprodukt dieser zwei Vektoren, v und w. Gut. Initialisieren Durchschnitt mit der Null. Und hier sehen Sie schon das, was für C++ 14 spezifisch ist. Das sind so genannte Digital Separatoren. Die können Sie in C++14 verwenden. Und das Schöne dann ist, dass ich sehr einfach sehe, wie groß die Zahl tatsächlich ist. So dann weiter am Text. Nun bin ich in der Hauptfunktion, der Main-Funktion. Hier initialisiere ich den Generator. Das ist ein Generator, der Zufall-Zahlen erzeugt. Und da die zufällig sein sollen, setze ich hinein seed(), das sicherstellt, dass der Generator jedes Mal mit anderen Zufall-Zahlen startet. Den Zufall-Zahlen Generator kombiniere ich mit der Verteilung. Das sehen Sie hier. Die gleiche Verteilung zwischen Null und Hundert. Und wenn ich das hier mache, kriege ich Zufallszahlen zwischen Null und Hundert gleich verteilt. In dieser Schleife hier geschieht sehr viel Arbeit. Hier laufe ich von Null bis Hundert Millionen und schiebe den Wert auf v und schiebe den Wert auf w drauf. Und sind meine Vektoren mit zufälligen Werten initialisiert. Was jetzt noch fehlt, ist das tatsächliche Rechnen. Zuerst bestimme ich den aktuellen Zeitpunkt über std::chrono::system_clock::now(). Dann führe ich die teure Skalar-Produkt-Multiplikation aus. Danach bestimme ich noch mal den aktuellen Zeitpunkt und ziehe den Start-Zeitpunkt davon ab. Und die Differenz ist natürlich die Zeit, die ich benötigt habe, in Sekunden-Auflösung. Das war der singlethreaded Fall. Das gleiche jetzt noch mal für den multithreaded Anwendungsfall. Der größte Unterschied ist die Funktion getDotProduct hier. In diesem Fall habe ich wieder Vektoren v und w. Aber, ich teile meine 100 Millionen Elemente in 25 Millionen-Happen. Das ist der erste Happen von 0. bis 25. Millionen Element, 25. Millionen zum Element 50 Millionen, und so weiter. Das Produkt, std::inner_product, wird jeweils in std::async Funktion berechnet. Und wenn Sie das hier genauer anschauen, sehen Sie, das ist eine Lambda-Funktion. Also std::async, das ich mit der Lambda-Funktion parametrisiere, die auf v und w per Reference zugreift. Hier habe ich std::future, mit dem ich das Ergebnis meines std::async-Aufrufes abholen kann. Abholen tu ich genau hier future1.get(), future2.get(),future3.get() und future4.get(). Und wenn ich vier Ergebnisse zusammen addiere, habe ich natürlich die Gesamtsumme. Jetzt fehlt nur noch, dass ich die Zeit messe. Das tu ich genau hier. Und da ändert sich nicht zum singlethreaded Fall. Die Logik ist an dieser Funktion hier drin. Und es muss ich eigentlich nur ausführen. Erst mal den singlethreaded Fall, die meiste Zeit benötigt tatsächlich das Allokieren des Vektors und das Befühlen des Vektors. Die Multiplikation ist relativ schnell. Na ja, wir sind zum Rand von 1,7 Sekunden. Das Gleiche noch mal in multithreaded Fall, mit vier std::async Aufrufen. Und tatsächlich bin ich jetzt um den Faktor vier schneller. Ich muss aber ehrlich sagen, ich habe dieses Programm jetzt ohne Optimierung gesetzt. Das ist sozusagen unoptimierter Code. Von da sind die Ergebnisse ein bisschen mit Vorsicht zu genießen. Daher der Optimierer zur Gunsten der sequenziellen Ausführen noch einiges rausholen wird.

C++: Multithreading

Lernen Sie die High-Level Threading-Schnittstelle in C++ kennenb und nutzen, die Sie in Form von Threads, Tasks, Locks und Bedingungsvariablen zur Anwendung bringen.

2 Std. 40 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:16.08.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!