Hier erkläre ich mit einigen Beispielen
Parallelität
Eine GPU verwendet die Parallelverarbeitung, um denselben Codeblock (AKA- Kernel ) auf Tausenden von physischen und logischen Threads zu verarbeiten. Im Idealfall beginnt und endet der Prozess für alle Threads gleichzeitig. Ein einzelner CPU-Kern ohne Hyperthreading kann keine parallele Verarbeitung durchführen.
Hinweis: Ich sagte im Idealfall, dass beim Ausführen eines Kernels mit einer Größe von 7 Millionen Aufrufen auf einer Hardware mit 6 Millionen Threads zweimal derselbe Code auf allen 6 Millionen Threads parallel ausgeführt werden muss, während jedes Mal alle 6 Millionen Threads verbraucht werden.
- Ein Kernel (ein Stück Code) wird auf mehreren Prozessoren ausgeführt
- gleichzeitig
- mit einer einzigen Ausführungssequenz (ein Kernel muss in allen Threads dasselbe tun, daher werden "Verzweigungen" oder "Wenn" vermieden, da sie die Ressourcen drastisch verbrauchen, indem sie viele NOPs (No-Operations) erstellen, um alle Threads zu synchronisieren).
- erhöht die Geschwindigkeit im Wesentlichen drastisch
- schränkt drastisch ein, was Sie tun können
- hängt stark von der Hardware ab
Hinweis: Die Parallelität ist nicht auf die GPU beschränkt.
Parallelität
Ein Webdienst empfängt viele kleine Anfragen in Echtzeit und muss jede dieser Anfragen jederzeit und unabhängig von anderen Anfragen oder internen Jobs unterschiedlich behandeln. Sie möchten jedoch, dass der Webdienst jederzeit betriebsbereit ist, ohne den Datenstatus oder den Systemzustand zu beeinträchtigen.
Stellen Sie sich vor, ein Benutzer aktualisiert einen Datensatz und ein anderer Benutzer löscht denselben Datensatz gleichzeitig.
- Viele Aufgaben werden ausgeführt
- in Echtzeit (oder wann immer eine Anfrage kommt)
- mit unterschiedlichen Ausführungssequenzen (im Gegensatz zum Kernel in der Parallelverarbeitung können gleichzeitige Aufgaben unterschiedliche Aufgaben ausführen, die Sie höchstwahrscheinlich in die Warteschlange stellen oder priorisieren müssen).
- Verbessert im Wesentlichen die durchschnittliche Antwortzeit, da Aufgabe 2 nicht auf den Abschluss von Aufgabe 1 warten muss
- Im Wesentlichen wird die Rechenzeit geopfert, da viele Aufgaben gleichzeitig ausgeführt werden und nur begrenzte Ressourcen zur Verfügung stehen
- muss gemeinsam genutzte Ressourcen ordnungsgemäß verwalten, damit keine Deadlocks auftreten oder die Daten beschädigt werden.
Hinweis : Diese Anforderungen verbrauchen normalerweise einige wichtige Ressourcen wie Speicher, Datenbankverbindung oder Bandbreite. Sie möchten jedoch, dass der Webdienst jederzeit reagiert. Asynchronität ist der Schlüssel, um darauf zu reagieren , nicht auf Parallelität
Asynchron
Ein schwerer Prozess (wie eine E / A-Operation) kann die GUI leicht blockieren, wenn sie auf dem GUI-Thread ausgeführt wird. Um die Reaktionsfähigkeit der Benutzeroberfläche zu gewährleisten , kann ein schwerer Prozess asynchron ausgeführt werden. Es ist besser , ähnlich Asynchron - Operationen auszuführen einen nach dem anderen . Beispielsweise können mehrere E / A-gebundene Vorgänge erheblich langsamer sein, wenn sie gleichzeitig ausgeführt werden. Es ist daher besser, sie zum Starten in die Warteschlange zu stellen
- Eine Aufgabe oder ein Stapel von Aufgaben wird in einem anderen Thread ausgeführt
- einmal
- Wenn es eine Aufgabe gibt, gibt es keine Sequenz, also warten Sie entweder, bis sie beendet ist, oder Sie feuern und vergessen
- Wenn es sich um eine Reihe von Aufgaben handelt, können Sie entweder alle gleichzeitig abfeuern und vergessen, warten, bis alle abgeschlossen sind, oder jede Aufgabe ausführen, um zu beginnen
- reduziert im Wesentlichen die Leistung aufgrund des Overheads
- Bietet Reaktionsfähigkeit auf einen anderen Thread (wirksam gegen das Blockieren des UI-Threads oder anderer wichtiger Threads)
Hinweis: Eine asynchrone Operation, die gleichzeitig ausgeführt wird (dh mehr als einmal gleichzeitig), ist eine gleichzeitige Operation.
Hinweis: Parallelität und Asynchronität werden häufig miteinander verwechselt. Parallelität bezieht sich auf verschiedene Teile des Systems, die zusammenarbeiten, ohne sich gegenseitig zu stören (diese Probleme werden häufig mit Sperren, Semaphoren oder Mutexen gelöst). Durch Asynchronität erreichen Sie Reaktionsfähigkeit (z. B. Threading).
* Hinweis: Asynchronität und Multithreading werden häufig miteinander verwechselt. Asynchroner Code beinhaltet nicht unbedingt einen neuen Thread. Es kann sich um eine Hardware-Operation handeln oder, wie Stephan es nennt, um eine reine Operation. Lesen Sie dies
Beispiel: Im folgenden WPF + C # -Code await Task.Run(()=> HeavyMethod(txt))
wird ein Asynchronitätsproblem gelöst, während textBox.Dispatcher.Invoke
ein Parallelitätsproblem gelöst wird:
private async void ButtonClick(object sender, RoutedEventArgs e)
{
// run a method in another thread
await Task.Run(()=> HeavyMethod(txt));
// modify UI object in UI thread
txt.Text = "done";
}
// This is a thread-safe method. You can run it in any thread
internal void HeavyMethod(TextBox textBox)
{
while (stillWorking)
{
// use Dispatcher to safely invoke UI operations
textBox.Dispatcher.Invoke(() =>
{
// UI operations outside of invoke will cause ThreadException
textBox.Text += ".";
});
}
}