Programmierung für Multi-core-Prozessoren
Soweit ich weiß, die multi-core-Architektur in einem Prozessor hat keine Auswirkungen auf das Programm. Die eigentliche Befehlsausführung erfolgt in eine niedrigere Schicht.
meine Frage ist,
Gegeben, dass Sie eine multicore-Umgebung Kann ich mit jeder beliebigen Programmier-Praktiken zu nutzen die verfügbaren Ressourcen effektiver zu nutzen? Wie sollte ich ändern, um meinen code zu gewinnen, mehr Leistung in multicore-Umgebungen?
Ein multi-core-CPU sieht nur aus wie mehrere CPUs für ein Programm, so lange, wie Sie die Nutzung von threads voll, dann gibt es nichts mehr zu tun. Es sei denn, du suchst Tipps, wie Sie verbessern Sie Ihre multi-threaded code?
Bedeutet es, die Nutzung der höheren Anzahl von threads, die zur Verbesserung der Leistung in multicore-Architekturen?
es bedeutet, dass ein multi-core-Architektur ausführen kann, die gleiche Anzahl von threads, wie es Kerne (hyper-threading sieht aus wie zwei Kerne) in der gleichen Zeit. So, nachdem eine Anzahl von threads > 1 ist ratsam, die Kerne.
mit mehr Fäden und/oder-Prozesse ermöglichen Ihnen, die Vorteile der Kerne, aber es ist nicht garantiert, um die Dinge schneller... nur wenn die Arbeit aufgeteilt und koordiniert intelligent.
Multicore-Systeme sind interessante Leistungsmerkmale durch cache teilen.
Bedeutet es, die Nutzung der höheren Anzahl von threads, die zur Verbesserung der Leistung in multicore-Architekturen?
es bedeutet, dass ein multi-core-Architektur ausführen kann, die gleiche Anzahl von threads, wie es Kerne (hyper-threading sieht aus wie zwei Kerne) in der gleichen Zeit. So, nachdem eine Anzahl von threads > 1 ist ratsam, die Kerne.
mit mehr Fäden und/oder-Prozesse ermöglichen Ihnen, die Vorteile der Kerne, aber es ist nicht garantiert, um die Dinge schneller... nur wenn die Arbeit aufgeteilt und koordiniert intelligent.
Multicore-Systeme sind interessante Leistungsmerkmale durch cache teilen.
InformationsquelleAutor Chathuranga Chandrasekara | 2010-03-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist richtig. Ihr Programm wird nicht schneller (außer der Tatsache, dass der Kern ist der Umgang weniger andere Prozesse, weil einige der Prozesse auf den anderen core), es sei denn, Sie beschäftigen Parallelität. Wenn Sie verwenden Parallelität, obwohl mehr Kerne verbessert die tatsächliche Parallelität (mit weniger Kernen, die Parallelität verschachtelt ist, in der Erwägung, dass mit mehr Kernen, können Sie bekommen echte Parallelität zwischen threads).
Programme effizient Auger ist keine einfache Aufgabe. Wenn schlecht getan, so dass Ihr Programm die gleichzeitige ihn tatsächlich langsamer! Zum Beispiel, wenn Sie verbringen viel Zeit mit dem laichen threads (thread-Konstruktion ist wirklich langsam), und arbeiten, die auf eine sehr kleine chunk-Größe (so dass der overhead der thread-Konstruktion dominiert die eigentliche Arbeit), oder wenn Sie Häufig Ihre Daten synchronisieren, was nicht nur Kräfte, Vorgänge laufen nacheinander, sondern hat auch ein sehr hoher Aufwand), oder wenn Sie Häufig schreiben, um die Daten in der gleichen cache-Zeile zwischen mehreren threads (das kann dazu führen, die gesamte cache-Zeile als ungültig erklärt einer der Kerne), dann können Sie ernsthaft Schaden nehmen, die Leistung mit der gleichzeitigen Programmierung.
Es ist auch wichtig zu beachten, dass, wenn Sie haben, N Kerne, das bedeutet NICHT, dass Sie sich ein speedup von N. das ist die theoretische Grenze für den speedup. In der Tat, vielleicht mit zwei Kernen sind es doppelt so schnell, aber mit vier Kernen könnte es etwa drei mal so schnell, und dann mit acht Kernen es ist etwa dreieinhalb mal so schnell, etc. Wie gut Ihr Programm ist tatsächlich in der Lage zu nutzen, diese Kerne nennt Sie die parallele Skalierbarkeit. Oft Kommunikations-und Synchronisations-overhead verhindern, dass ein linearer speedup, obwohl im ideal, wenn Sie vermeiden, Kommunikation und Synchronisation, so viel wie möglich, Sie können hoffentlich bekommen die in der Nähe linear.
Wäre es nicht möglich, eine vollständige Antwort auf das schreiben effizienter paralleler Programme auf StackOverflow. Das ist wirklich das Thema von mindestens einem (wahrscheinlich mehrere) computer science Kurse. Ich schlage vor, dass Sie sich für einen solchen Kurs oder ein Buch kaufen. Ich würde empfehlen ein Buch für Sie, wenn ich wusste, dass eine gute, aber die paralell algorithmen natürlich nahm ich nicht ein lehrbuch für den Kurs. Das könnte Sie auch interessieren schriftlich eine Handvoll von Programmen mit einer seriellen Implementierung, eine parallele Umsetzung mit multithreading (regelmäßig threads, thread-pools, etc.), und eine parallele Implementierung mit message-passing (wie mit Hadoop, Apache Spark, Cloud-Datenströme, asynchrone RPCs, etc.), und dann die Messung Ihrer performance, die Variation der Anzahl der Kerne, die im Falle der parallelen Implementierungen. Dies war der Großteil der Arbeit natürlich für meine parallele algorithmen Kurs und kann sehr einfühlsam. Einige Berechnungen, die Sie könnten versuchen, die Parallelität umfassen computing Pi mit der Monte-Carlo-Methode (dies ist trivial parallelisierbare, vorausgesetzt, Sie können erstellen einen Zufallszahlen-generator, wo die Zufallszahlen generiert, die in verschiedenen threads unabhängig sind), darstellende matrix-Multiplikation, Berechnung der row echelon form einer matrix, summieren mit dem Quadrat der Zahl 1...N für einige sehr große Anzahl von N, und ich bin sicher, Sie können sich an andere zu denken.
Jacinto, wie das ist, Verschieden von dem, was ich gesagt habe?
nur einen Fehler, ist alles :). Sie sagte N ist die theoretische Grenze, aber es gibt ein wenig mehr zu der Geschichte. Sie antwortete in Ordnung, imo.
Jacinto: Wenn Sie pingelig sind, können Sie auch superlinear speedup auf multicores also bezogen auf die naive theoretische Vorhersage, die als "die Grenze" ist auch falsch.
InformationsquelleAutor Michael Aaron Safyan
Ich weiß nicht, ob es der bestmögliche Ort, um zu starten, aber ich habe ein Abo auf den Artikel-feed von Intel Software Network vor einiger Zeit und fand eine Menge interessante Sache gibt es, in ziemlich einfache Weise. Finden Sie einige sehr grundlegende Artikel über die grundlegenden Konzepte des parallel computing, wie diese. Hier Sie haben eine schnelle Tauchen Sie ein in openMP, ist ein möglicher Ansatz, um zu starten Parallelisierung der langsamsten Teile der Anwendung, ohne den rest. (Wenn die Teile vorhanden Parallelität, natürlich.) Überprüfen Sie auch Intel Leitfaden für die Entwicklung von Multithread-Anwendungen. Oder gehen Sie einfach und suchen die Artikel-Sektion, die Artikel sind nicht zu viele, so können Sie schnell herausfinden, was Ihnen am besten passt. Sie haben auch ein forum und einen wöchentlichen webcast, nennt man Parallele Programmierung Sprechen.
InformationsquelleAutor Vasily Korolev
Ja, einfach das hinzufügen von mehr Kerne auf einem system ohne änderung der software ergeben würde Sie keine Resultate (mit Ausnahme der Betriebssystem wäre in der Lage zu planen, mehrere gleichzeitige Prozesse auf separaten Kernen).
Haben Ihr Betriebssystem nutzen mehrere Kerne, müssen Sie eines von zwei Dingen tun: erhöhen Sie die Anzahl der Threads pro Prozess, oder erhöhen Sie die Anzahl der Prozesse, die gleichzeitig laufen (oder beides!).
Nutzung der Kerne effektiv, jedoch ist ein Tier von einer anderen Farbe. Wenn Sie verbringen zu viel Zeit Synchronisation gemeinsamer Daten-Zugriff zwischen threads/Prozesse, Ihr Niveau der Parallelität wird ein Treffer als threads warten gegenseitig auf. Dies setzt auch Voraus, dass man ein problem/Berechnung kann relativ leicht parallelised, da die parallele version des Algorithmus ist oft viel komplexer ist, als die sequentielle version davon.
Sagte, vor allem für CPU-gebundene Berechnungen mit Einheiten, die voneinander unabhängig sind, werden Sie wahrscheinlich sehen, ein linearer speed-up, wie Sie werfen mehr threads zu dem problem. Wie Sie die Seriennummer hinzufügen-Segmente und die synchronisation blockiert, dieses speed-up wird dazu neigen, zu verringern.
I/O-Intensive Berechnungen, die normalerweise Kost das Schlimmste in einer multi-threaded Umgebung, da der Zugriff auf den physischen Speicher (vor allem, wenn es auf dem gleichen controller, oder der gleichen Medien) ist auch Seriell, in dem Fall threading wird mehr nützlich in dem Sinne, dass es macht Ihren anderen threads weiter mit Benutzer-Interaktion-oder CPU-basierenden Operationen.
InformationsquelleAutor slyfox
Könnten Sie die Verwendung von Programmiersprachen entworfen für die gleichzeitige Programmierung. Erlang und Go in den Sinn kommen.
InformationsquelleAutor Kevin Little