13

Gibt es eine R5RS-oder-höhere Scheme-Implementierung, die eine Parallelisierung durchführt? wenn ich sage, zum Beispiel zu tun:Gibt es eine Scheme-Implementierung, die parallelisiert?

(map (lambda (x) 
     (pure-functional-stuff x)) 
    '(1 3 5 7 11 13)) 

es verarbeitet 1, 3, 5 und 7 gleichzeitig, wenn die Maschine es tun kann? Das sollte einer der großen Vorteile der funktionalen Programmierung sein, aber ich finde kein gepflegtes, aktuelles Schema, das es tut. Mir würde es gut gehen, wenn ich nicht behaupte, dass die Funktion keine Nebenwirkungen hat.

+1

Automatische Parallelisierung wird immer noch selten gesehen. Wenn ein FP-Enthusiast sagt, FP-Sprachprogramme seien "besser parallelisierbar", dann meint er/sie wahrscheinlich "du", der Programmierer. –

Antwort

5

Ich bin ein Entwickler von Schemik und ich denke, dass es das Schema ist, das Sie suchen. Das Projekt wird noch entwickelt und gewartet. Anfang dieses Jahres habe ich eine Version veröffentlicht, die die Kompatibilität mit R5RS verbessert. Leider ist Schemik ein Forschungsprojekt, das sich auf den Prozess der Expressionsbewertung konzentriert, daher ist seine Standardbibliothek noch relativ klein. Gibt es bestimmte Funktionen, die Sie in Schemik vermissen?

+0

Ich graben jetzt rein. Ich weiß es noch nicht sicher, aber es sieht vielversprechend aus. – JasonFruit

+0

Es tut, was ich gerade brauche --- danke! Ich wollte etwas ausprobieren, das so funktioniert. – JasonFruit

2

Ich habe gerade Schemik

http://schemik.sourceforge.net/

, die mindestens 2009 beibehalten zu sein scheint, obwohl ich weiß nicht, ob es R5RS ist.

+0

Es verwirrt mich, dass es behauptet, ein "Dialekt von Scheme und Common Lisp" zu sein. Meinten sie "ein Dialekt von Lisp"? – JasonFruit

+0

Es nähert sich R5RS, obwohl ich Commit-Kommentare durchforsten musste, um das herauszufinden. Im Allgemeinen ernsthaft unterdokumentiert, und es hat einen Busfaktor von 1, aber es hat Potenzial. – JasonFruit

3

Racket hat futures, die etwas sehr ähnliches tun, und wird auch einen zweiten Ansatz für die Parallelität in naher Zukunft haben (die "Orte" genannt werden).

+0

Ich werde über Rackets Zukunft nachlesen. Ich hatte sie nicht bemerkt. – JasonFruit

3

Es stellt sich heraus, dass Sie nicht wirklich wollen, der Compiler versuchen alles parallelisieren, weil dann Sie Zeit zu koordinieren Bemühungen sogar am Ende verschwenden, wenn so etwas einfach tun,

(map add1 '(1 2 3)) 

, die schneller sein würde, nur auf einen Thread tun. Viele funktionale Sprachen machen es Ihnen jedoch heutzutage leicht, diese Parallelität herzustellen, wenn "add1" tatsächlich "wirklich lange Berechnung" ist. Jede Sprache hat ihren eigenen Ansatz, aber ich würde empfehlen, die Vorteile mehrerer Kerne im Racket mit Futures zu nutzen.

Während der Compiler die Dinge automatisch für Sie entscheidet, ist es kein schlechter Kompromiss, eine "Map" zu einer "Pmap" zu ändern, wo Sie denken, dass es helfen könnte, anstatt mit Verlangsamungen an anderen Stellen umzugehen ehrgeizig.

etwas so Grundlegendes wie

(define (pmap f xs) 
    (map touch (map (λ(x) (future (λ() (f x)))) xs))) 

können Sie ziemlich weit kommen, wenn umsichtig verwendet, aber Sie sollten mit Chunking Ihre Daten experimentieren, um zu füttern Threads parallel.