Gibt es ein Paradigma, das Ihnen eine andere Denkweise gibt oder eine andere Sicht auf das Schreiben von Multi-Thread-Anwendungen hat? Vielleicht etwas, das sich sehr unterschiedlich anfühlt wie prozedurale Programmierung für die Programmierung von Funktionen.Gewindeparadigma?
Antwort
Nebenläufigkeit hat viele verschiedene Modelle für verschiedene Probleme. Die Wikipedia-Seite für concurrency listet ein paar Modelle und es gibt auch eine Seite für concurrency patterns, die einen guten Ausgangspunkt für verschiedene Arten der Annäherung an Gleichzeitigkeit hat.
Die Vorgehensweise, die Sie treffen, hängt stark von dem Problem ab. Verschiedene Modelle lösen verschiedene Probleme, die bei konkurrierenden Anwendungen auftreten können, und einige basieren auf anderen.
In Klasse I wurde gelehrt, dass Nebenläufigkeit mutual exclusion und synchronization zusammen verwendet, um Nebenläufigkeitsprobleme zu lösen. Einige Lösungen erfordern nur eine, aber mit beiden sollten Sie in der Lage sein, alle Nebenläufigkeitsprobleme zu lösen.
Für ein ganz anderes Konzept könnten Sie Unveränderlichkeit und Gleichzeitigkeit betrachten. Wenn alle Daten unveränderlich sind, sind die herkömmlichen Zugänge zur Nebenläufigkeit nicht einmal erforderlich. This article erkundet dieses Thema.
Ich verstehe nicht wirklich die Frage, aber wenn Sie anfangen zu tun einige Codierung mit CUDA geben Sie eine andere Denkweise über Multithreading-Anwendungen.
Es unterscheidet sich von allgemeinen Multithreading-Techniken wie Semaphoren, Monitoren usw., da Sie Tausende von Threads gleichzeitig haben. Das Problem der Parallelität in CUDA besteht also eher darin, Ihre Daten zu partitionieren und die Datenblöcke später zu mischen.
Nur ein kleines Beispiel für ein vollständiges Umdenken eines allgemeinen seriellen Problems ist der SCAN Algorithmus. Es ist so einfach wie:
- eine SET {a, b, c, d, e}
Ich mag folgenden Satz Gegeben:
{a, a + b, a + b + c, a + b + c + d, a + b + c + d + e}
Wo das Symbol '+' in diesem Fall ist ein Commutattive-Operator (nicht nur Plus, können Sie auch Multiplikation tun).
Wie geht das parallel? Es ist ein komplettes Überdenken des Problems, es wird in diesem paper beschrieben.
Viele weiteren Implementierungen verschiedenen Algorithmen in CUDA in der NVIDIA website
Nun, ein sehr konservativen Paradigmenwechsel von Thread-centric Concurrency (teilt alles) in Richtung prozessorientierte Gleichzeitigkeit (Adressraum Trennung gefunden werden). Auf diese Weise kann eine unbeabsichtigte gemeinsame Nutzung von Daten vermieden werden, und es ist einfacher, eine Kommunikationsstrategie zwischen verschiedenen Subsystemen durchzusetzen.
Diese Idee ist alt und wurde (unter anderem) von der Micro-Kernel OS Community propagiert, um zuverlässigere Betriebssysteme zu bauen. Interessanterweise zeigt der OS-Prototyp Singularity von Microsoft Research, dass traditionelle Adressräume nicht einmal benötigt werden, wenn mit diesem Modell gearbeitet wird.
Die relativ neue Idee, die mir am besten gefällt, ist transactional memory: Vermeiden Sie Nebenläufigkeitsprobleme, indem Sie sicherstellen, dass Updates immer atomar sind.
Werfen Sie einen Blick auf OpenMP für eine interessante Variante.