Multicore-Programmierung: was ist notwendig, es zu tun?
Ich habe einen quadcore Prozessor und ich würde wirklich gerne, profitieren Sie von all diesen Kernen, wenn ich laufen gehe schnellen Simulationen. Das problem ist, ich bin nur vertraut mit den kleinen Linux-cluster haben wir im Labor und ich bin mit Vista zu Hause.
Welche Art von Dingen ich tun möchte, zu schauen, für die multicore-Programmierung mit C oder Java? Was ist die Sprache, die ich will google?
Danke für die Hilfe.
- Dulicate: stackoverflow.com/questions/363341/..., stackoverflow.com/questions/1321615/...
- Eigentlich lese ich über diese beiden Fragen vor der Buchung und meinte, Sie habe keine Antwort auf meine konkrete Frage: Was ist die notwendige lingo benötigt für mich in die multicore-Programmierung....
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Stichwort ist "threading" - würde nicht funktionieren in einem cluster, aber es wird gut in einem einzigen multicore-Maschine (eigentlich auf jede Art von Windows viel im Allgemeinen besser als Laich mehrere Prozesse -- Windows-Prozesse' sind ziemlich schwer-Gewicht im Vergleich zu Linux sind). Nicht ganz so einfach in C, sehr leicht in Java-zum Beispiel, starten Sie hier!
Sie wollen, Threads und AkteurInnen
Guter Punkt ... man kann nicht google, es sei denn, Sie wissen, ein paar keywords.
C: google pthread, kurz für Posix-Thread, obwohl die native win32-Schnittstelle ist nicht-posix, siehe Erstellen von Threads auf der MSDN-Website.
Java: Sehen Klasse Thread
Schließlich, Sie sollten Lesen, ein bisschen auf die funktionale Programmierung, Schauspieler, Parallelität und unveränderliche Objekte. Es stellt sich heraus, dass die Verwaltung von Parallelität in plain old shared memory ist ziemlich schwer, aber das message-passing und funktionale Programmierung können Sie Stile verwenden, die sind von Natur aus viel sicherer und vermeiden Parallelität Probleme. Java erlaubt Ihnen, alles zu tun, die harte Weise, wo die Daten veränderlich shared memory und Sie verzweifelt versuchen, manuell interlock gemeinsamen staatlichen Strukturen. Sie können aber auch mit einem erweiterten Stil von in java. Vielleicht beginnen Sie mit dieser JavaWorld-Artikel: Akteure auf der JVM.
Lesen Sie in diesem Buch: Java Concurrency in Practice
Ich denke, Sie sollten prüfen, Clojure, zu. Es läuft auf der JVM und hat gute Java-Interoperabilität. Als Lisp, unterscheidet es sich von dem, was Sie verwendet, um mit C und Java, so dass es möglicherweise nicht Ihre Tasse Tee ist, aber es lohnt sich, einen Blick auf die Themen von Clojure sowieso, da die Konzepte sind wertvoll, unabhängig davon, welche Sprache Sie benutzen. Überprüfen Sie heraus dieses video, und dann, wenn Sie so geneigt sind, die clojure Website, der hat einige links zu anderen guten Filme mehr, speziell über Clojure in der oberen rechten Ecke.
Es hängt davon ab, was Ihre bevorzugte Sprache ist, um den job zu erledigen.
Neben der threading-Lösungen, Sie können auch betrachten
MPI als eine Möglichkeit von Java-und C - sowie von Python oder R oder was auch immer Sie mögen.
DeinoMPI scheint beliebt zu sein unter Windows, und OpenMPI gerade begonnen, mit Unterstützung auch für Windows in der aktuellen Version 1.3.3.
Viele Leute haben darüber gesprochen, threading, das ist ein Ansatz, aber betrachten Sie einen anderen Weg, es zu tun. Was, wenn Sie hatte mehrere JVM ' s gestartet, mit dem Netzwerk verbunden, und warten auf Arbeit zu kommen, Ihren Weg? Wie würden Sie eine Anwendung Programmieren, so dass Sie es nutzen könnten all diese JVMs ohne zu wissen, ob oder nicht Sie sind auf der gleichen CPU?
Auf einer quadcore Maschine, Sie sollten in der Lage sein zu laufen, 12 oder mehrere JVMs zu arbeiten. Und wenn Sie nähern sich dem problem aus diesem Winkel, Skalierung bis zu mehreren Computern ist relativ einfach, obwohl Sie haben zu prüfen, höhere Netzwerk-Latenzen, wenn Ihre Kommunikation über ein reales Netzwerk.
Hier ist eine gute Quelle von Informationen über threading in C#.
Müssen Sie zum erstellen von Multithread-Programmen. Java-multi-threading wird unterstützt out of the box (obwohl ältere JVMs liefen alle threads auf einem Kern). Für C, müssen Sie die Verwendung plattformspezifischer code zum erstellen und Bearbeiten von threads (pthread* für Linux, CreateThread und Unternehmen für Windows). Alternativ möchten Sie vielleicht, um Ihre einfädeln von C++, wo es eine ganze Reihe von Bibliotheken (z.B. Boost::threads), um das Leben ein wenig einfacher und erlauben portablen code.
Wenn Sie möchten, dass code, werden portabel auf einem einzelnen Computer mit mehreren Kernen UND einem cluster könnte man in MPI. Es ist wirklich gedacht für die cluster-situation, wurde aber portiert, arbeiten auf einer Maschine mit mehreren Prozessoren oder mehreren Kernen -- obwohl nicht als effizient wie code geschrieben spezifisch für eine einzelne Maschine.
So, das ist eine sehr umfassende Frage. Sie können Experimentieren mit Multithread-Programmierung mit den verschiedensten Programmiersprachen wie C oder Java. Wenn Sie wollte, dass ich einen für Sie auswählt, dann würd ich pick C. 🙂
Sie suchen möchten, in Windows-threads, POSIX-threads (oder multithreading in Java, wenn es das ist, Sprache). Vielleicht möchten Sie versuchen zu finden, einige Probleme damit zu Experimentieren. Ich würde vorschlagen, ausprobieren-matrix-Multiplikation; beginnen Sie mit einer sequenziellen version und dann versuchen, zu verbessern die Zeit, die Verwendung von threads.
Auch, OpenMP ist für Windows verfügbar und bietet eine ganz andere Ansicht, wie man Multithread-Programmierung.
Obwohl Sie gefragt, speziell für C oder Java, Erlang ist keine schlechte Wahl der Sprache, wenn dies nur eine Lernübung
Ermöglicht es Ihnen zu tun Multiprozess-Stil der Programmierung sehr sehr leicht und es hat eine große Reihe von Bibliotheken, mit denen Sie Tauchen bei fast jeder Ebene, die Sie mögen.
Es wurde gebaut für die verteilte Programmierung in einer sehr pragmatischen Art und Weise. Wenn Sie sind komfortabel mit java, der übergang sollte nicht allzu schwierig sein.
Wenn Sie interessiert sind, würde ich empfehlen, das Buch "Programming Erlang" von Joe Armstrong.
(als Hinweis: es gibt auch andere Sprachen entwickelt, um laufen auf hoch parallelen Umgebungen wie Haskell. Erlang gerade sind, ist eher pragmatisch als Sprachen wie Haskell, die Ihre Wurzeln mehr in der Theorie)
Wenn Sie möchten, dass zu tun, einfach einfädeln, wie parallele Schleifen, empfehle ich check-out .NET 4.0 Beta (C# in VS2010 Beta).
Buch Kapitel Joe verbunden ist eine sehr gute ich selbst benutze und empfehlen, aber nicht für die neuen parallel extensions für das .NET framework.
ja viele threads , aber wenn die threads greifen auf die gleiche position im Speicher nur ein thread wird ausgeführt,
müssen wir multi-Speicher-cores
Bei weitem der einfachste Weg, dies zu tun multicore-Programmierung unter Windows zu verwenden .NET 4 und C# oder F#. Hier ist ein einfaches Beispiel, in dem ein parallel-Programm (aus dem shootout) 7× kürzer in F# als Java und genauso schnell.
.NET-4 bietet eine Menge neue Infrastruktur für die parallele Programmierung und es ist wirklich einfach zu bedienen.
Dass Sie sagen, "nutzen" klingt für mich wie etwas mehr als nur multi-threading. Simulationen in meinem Buch sind rechenintensiv und ist in dieser Hinsicht die effizienteste Sprache ist C. Einige würden sagen, der Montage, aber es gibt sehr wenige x86 Assembler-Programmierer, die schlagen kann, einen modernen C-compiler.
Für die Windows-NT-Motor (NT4, 2000, XP, Vista und 7) die Mechanismen, die Sie in Aussehen sollte, sind threads, kritische Abschnitte und die E/A-Abschluss ports (iocp). Threads sind schön, aber Sie müssen in der Lage sein, zu synchronisieren, die Sie unter sich und mit I/O, die ist, wo die cs-und iocps kommen. Um sicherzustellen, dass Ihr Rang auch noch das Letzte Quäntchen Leistung aus Ihrem code, den Sie brauchen, um zu Profil, analysieren, Experimentieren/re-konstruieren. Viel Spaß, aber sehr zeitaufwendig.
Können mehrere threads existieren, in einem einzigen Prozess. Die threads, die gehören zum gleichen Prozess teilen sich den gleichen Speicher Bereich (Lesen und schreiben auf die gleichen Variablen, und können sich gegenseitig stören). Im Gegenteil, die verschiedenen Prozesse, die Leben in verschiedenen Speicherbereiche, und jeder von Ihnen hat seine eigenen Variablen. Um zu kommunizieren, Prozesse zu verwenden, andere Kanäle (Dateien, pipes oder sockets).
Wenn Sie möchten, zu parallelisieren, eine Berechnung, sind Sie wahrscheinlich gehen zu müssen, multithreading, weil Sie wahrscheinlich wollen, dass die threads zu kooperieren, die auf den gleichen Speicher.
Sprechen über performance, threads sind schneller zu erstellen und zu verwalten als Prozesse (denn das OS muss nicht reservieren, eine ganz neue virtuelle memory area) und die inter-thread-Kommunikation ist in der Regel schneller als inter-Prozess-Kommunikation. Aber threads sind schwieriger zu Programmieren. Threads können sich gegenseitig stören, und schreiben kann jeder andere Speicher, aber die Art und Weise dies geschieht, ist nicht immer offensichtlich (aufgrund von mehreren Faktoren ab, vor allem Unterricht Neuordnung und Arbeitsspeicher-caching), und so sind Sie gehen zu müssen synchronisierungsprimitiven, um den Zugriff auf Ihre Variablen.
Entnommen diese Antwort.