Frage

Die CPU-Architekturlandschaft hat sich verändert, mehrere Kerne sind ein Trend, der die Art und Weise verändern wird, wie wir Software entwickeln müssen.Ich habe Multithread-Entwicklung in C, C++ und Java durchgeführt, ich habe Multiprozess-Entwicklung mit verschiedenen IPC-Mechanismen durchgeführt.Herkömmliche Ansätze zur Verwendung von Threads scheinen es dem Entwickler nicht einfach zu machen, Hardware zu verwenden, die ein hohes Maß an Parallelität unterstützt.

Welche Sprachen, Bibliotheken und Entwicklungstechniken sind Ihnen bekannt, die dazu beitragen, die traditionellen Herausforderungen bei der Erstellung gleichzeitiger Anwendungen zu lindern?Ich denke dabei natürlich an Themen wie Deadlocks und Rennbedingungen.Designtechniken, Bibliotheken, Tools usw.sind auch interessant, die dabei helfen, die verfügbaren Ressourcen tatsächlich zu nutzen und sicherzustellen, dass sie genutzt werden – das Schreiben einer sicheren, robusten Thread-Anwendung allein stellt nicht sicher, dass sie alle verfügbaren Kerne nutzt.

Was ich bisher gesehen habe, ist:

  • Erlang:Prozessbasiertes Message-Passing-IPC, das „Akteursmodell der Parallelität“.
  • Dramatis:Schauspieler-Modellbibliothek für Ruby und Python
  • Scala:funktionale Programmiersprache für die JVM mit etwas zusätzlicher Parallelitätsunterstützung
  • Clojure:funktionale Programmiersprache für die JVM mit einer Akteursbibliothek
  • Termite:eine Portierung des Prozessansatzes und der Nachrichtenweitergabe von Erlang an Scheme

Was wissen Sie sonst noch, was hat für Sie funktioniert und was ist Ihrer Meinung nach interessant anzusehen?

War es hilfreich?

Lösung

Ich würde vorschlagen, zwei Paradigmenwechsel:

Software Transactional Memory

Sie können einen Blick auf das Konzept von Software Transactional Memory (STM) zu nehmen. Die Idee ist, zu verwenden, Parallelität : jede Operation, die zu anderen parallel läuft versuchen, seinen Job in einer isolierten Transaktion abzuschließen; wenn irgendwann eine andere Transaktion begangen wurde, die Daten, auf denen entkräftet diese Transaktion arbeitet, funktioniert die Transaktion entfernt throwed und die Transaktion erneut aus.

Ich denke, die erste weithin bekannte Umsetzung der Idee (wenn nicht die Proof-of-Concept und ersten) ist die in Haskell: Aufsätze und Vorträge über Transaktionsspeicher in Haskell . Viele andere Implementierungen finden Sie auf Wikipedias STM Artikel .

Event-Loops und verspricht

Eine weitere sehr unterschiedliche Art und Weise mit Gleichzeitigkeit des Umgangs in der [E Programmiersprache] umgesetzt ( http://en.wikipedia.org/wiki/E_ (programming_language% 29) .

Beachten Sie, dass seine Art und Weise mit Gleichzeitigkeit des Umgangs, sowie andere Teile der Sprache Design, stark auf die Schauspieler-Modell basiert.

Andere Tipps

Sie haben erwähnt, Java, aber Sie nur Threads erwähnen. Haben Sie in Java gleichzeitige Bibliothek geschaut? Es kommt mit Java 5 gebündelt und darüber.

Es ist eine sehr schöne Bibliothek mit ThreadPools, CopyOnWriteCollections sehr wenige zu nennen. Schauen Sie sich die Dokumentation auf der Java Tutorial . Oder wenn Sie es bevorzugen, der Java docs .

habe ich Verarbeitung für Python verwendet. Es ahmt die API des Threading Modul und ist somit sehr einfach zu benutzen.

Wenn Sie passieren map/imap oder ein Generator / Liste Verständnis verwenden, Ihr Code-Umwandlungs-processing zu verwenden ist einfach:

def do_something(x):
    return x**(x*x)

results = [do_something(n) for n in range(10000)]

kann mit parallelisiert werden

import processing
pool = processing.Pool(processing.cpuCount())
results = pool.map(do_something, range(10000))

, die jedoch viele Prozessoren verwenden, werden Sie die Ergebnisse berechnen müssen. Es gibt auch faul (Pool.imap) und asynchrone Varianten (Pool.map_async).

Es gibt eine Warteschlange Klasse, die Queue.Queue und Arbeiter, die ähnlich sind für Gewinde verwenden.

Gotchas

processing basiert auf fork(), die auf Windows emuliert werden muss. Die Objekte werden über pickle / unpickle übertragen, so müssen Sie sicherstellen, dass das funktioniert. Forking ein Prozess, es funktioniert Ressourcen bereits vielleicht nicht, was Sie wollen (man denke an Datenbankverbindungen), aber im Allgemeinen erworben hat. Es funktioniert so gut, dass es zu Python 2.6 auf der Überholspur hinzugefügt wurde (vgl PEP -317 ).

Intel Threading Building Blocks für C ++ sieht für mich sehr interessant. Es bietet eine viel höhere Abstraktionsebene als roher Faden. O'Reilly hat ein sehr schönes Buch wenn Sie wie tote Baum-Dokumentation. Siehe auch ? .

Ich würde sagen:

Modelle:Threads + gemeinsamer Zustand, Akteure + Nachrichtenübermittlung, Transaktionsspeicher, Zuordnen/Reduzieren?Sprachen:Erlang, IO, Scala, Clojure, Reia -Bibliotheken:Retlang, Jetlang, Kilim, Cilk++, fork/join, MPI, Kamaelia, Terrakotta

Ich betreibe einen Parallel-Link-Blog über Dinge wie diesen (Erlang, Scala, Java-Threading, Akteurmodell usw.) und stelle täglich ein paar Links ein:

http://concurrency.tumblr.com

Ich bin jetzt seit fast 20 Jahren in Ada gleichzeitige Programmierung gemacht habe.

Die Sprache selbst (nicht einige auf Bibliothek gehefteten) unterstützt ( „Tasks“), mehrere Planungsmodelle und mehrere Synchronisations Paradigmen Threading. Sie können sogar Ihre eigenen Synchronisationsschemata mit dem eingebauten in Primitiven bauen.

Sie können denken Sie an Adas Rendezvous als eine Art ein verfahrensorientierte Synchronisation Anlage, während geschützt Objekte sind mehr objektorientiert. Rendezvous sind ähnlich wie das alte CS-Konzept der Monitore , aber viel leistungsfähiger. Geschützte Objekte sind spezielle Typen mit Synchronisations Primitive, die es Ihnen ermöglichen, die Dinge zu bauen genau wie OS Schlösser, Semaphore, Veranstaltungen, etc. Es ist jedoch stark genug, dass Sie können auch Ihre eigenen Arten von Sync-Objekte erfinden und schaffen, je nach Ihren genauen Bedarf .

Die Frage Was heute parallele Programmierung empfehlen Sie die Vorteile der Manycore-Prozessoren von morgen zu nehmen? bereits gestellt. Ich gab die folgende Antwort auch dort.

Kamaelia ist ein Python-Framework für das Bauwesen mit vielen Kommunikation Prozesse.

  

Kamaelia - Concurrency gemacht nützlich, Spaß

     

In Kamaelia bauen Sie Systeme von einfachen Komponenten, die miteinander reden . Dies beschleunigt die Entwicklung, massiv unterstützt Wartung und auch bedeutet, dass Sie bauen natürlich gleichzeitig Software . Es ist beabsichtigt, von jeder Entwickler, einschließlich Novizen zugänglich zu sein. Es macht es auch Spaß :)

     

Welche Art von Systemen? Netzwerk-Server, Clients, Desktop-Anwendungen, pygame basierte Spiele, Transcodierungssysteme und Rohrleitungen, digitale TV-Systeme, Spam Lockerer, Lehrmittel und eine angemessene Menge mehr :)

Hier ist ein Video von PyCon 2009. Es beginnt mit Kamaelia Twisted und Parallel Python zu vergleichen und gibt dann eine praktische Demonstration von Kamaelia.

Einfache Concurrency mit Kamaelia - Teil 1 (59:08)
Einfache Concurrency mit Kamaelia - Teil 2 (18.15)

Ich kenne Reia - eine Sprache, die auf Erlang basiert aber sieht mehr wie Python / Rubin.

OpenMP .

Es behandelt Themen für Sie so dass Sie nur Sorgen darüber, welche Teile Ihrer C ++ Anwendung, die Sie parallel ausgeführt werden sollen.

zB.

#pragma omp parallel for
for (int i=0; i < SIZE; i++) 
{
// do something with an element
}

Der obige Code wird die for-Schleife auf, wie viele Threads laufen, wie Sie die openmp Laufzeit gesagt haben zu verwenden, so dass, wenn SIZE 100 ist, und Sie haben eine Quad-Core-Box, die für Schleife 25 Elemente auf jedem Lauf Kern.

Es gibt ein paar andere parallele Erweiterungen für verschiedene Sprachen, aber die, die ich am meisten interessiert bin, sind diejenigen, die auf Ihrer Grafikkarte ausgeführt werden. Das ist echte parallele Verarbeitung :) (Beispiele: GPU ++ und libSh )

C ++ 0x mehr als eine Mutex std::lock Funktionen bieten zusammen zu verriegeln. Dies wird helfen, Deadlock zu lindern aufgrund out-of-order-Verriegelung. Außerdem wird die C ++ 0x Thread-Bibliothek hat Versprechen, Futures und verpackt Aufgaben, die ein Gewinde ermöglichen das Ergebnis einer Operation auf einem anderen Thread ohne User-Level-Sperren durchgeführt, um zu warten.

multiprocessing ist eine Python-Bibliothek, die Multi-Core-Programmierung vereinfacht, wie in einer anderen Antwort erwähnt.

Programm mit Python multiprocessing geschrieben wird, kann leicht Arbeit auf der Wolke zu versenden modifiziert werden, anstatt auf lokale Kerne. piCloud nutzt, dass große bereitzustellen, On-Demand-Rechenleistung in der Cloud: Sie nur 2 ändern müssen Zeilen Code.

So, hier ist das Mitnehmen: wenn eine Bibliothek für Multi-Core-Auswahl, kann man, ob ein Cloud-Ansatz auch Sinn machen würde fragen wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top