Paralleles Pipelining

8
%Vor%

Ich möchte, dass dieser Code folgendermaßen funktioniert: Teilen Sie den ursprünglichen Strom in zwei genau in der Mitte; dann für jede Hälfte eine separate Berechnung, die berechnet 3 Dinge: die Länge (d. h. die Anzahl der Zeichen), die Anzahl der Wörter, die Anzahl der Zeilen. Ich möchte jedoch kein Problem haben, wenn Ich spalte fälschlicherweise ein Wort. Das muss sein gesorgt. Die Datei sollte nur einmal gelesen werden.

Wie soll ich die angegebenen Funktionen programmieren und den Operator | & gt; & gt ;? Ist es möglich?

    
Stefan Savev 30.09.2009, 02:35
quelle

1 Antwort

8

Es sieht so aus, als würden Sie nach etwas fragen. Ich überlasse es Ihnen, die String-Manipulation herauszufinden, aber ich werde Ihnen zeigen, wie man einen Operator definiert, der eine Reihe von Operationen parallel ausführt.

Schritt 1: Schreiben Sie eine fuse Funktion

Ihre Sicherungsfunktion scheint einen einzelnen Eingang mit mehreren Funktionen abzubilden, was einfach genug ist, um wie folgt zu schreiben:

%Vor%

Beachten Sie, dass alle Zuordnungsfunktionen denselben Typ haben müssen.

Schritt 2: Definieren Sie den Operator, um Funktionen parallel auszuführen

Die standardmäßige parallele Kartenfunktion kann wie folgt geschrieben werden:

%Vor%

Nach meinem Wissen wird Async.Parallel asynchrone Operationen parallel ausführen, wobei die Anzahl paralleler Tasks, die zu einem gegebenen Zeitpunkt ausgeführt werden, der Anzahl der Kerne auf einer Maschine entspricht (jemand kann mich korrigieren, wenn ich falsch liege). Bei einer Dual-Core-Maschine sollten also höchstens zwei Threads auf dem Rechner laufen, wenn diese Funktion aufgerufen wird. Dies ist eine gute Sache, da wir keine Beschleunigung erwarten, indem mehr als ein Thread pro Kern ausgeführt wird (in der Tat könnte der zusätzliche Kontextwechsel die Vorgänge verlangsamen).

Wir können einen Operator |>> in pmap und fuse definieren:

%Vor%

Also nimmt der Operator |>> eine Menge Eingaben und bildet sie mit vielen verschiedenen Ausgaben ab. Wenn wir das alles zusammenfassen, erhalten wir folgendes (in fsi):

%Vor%

testOutput enthält zwei Elemente, die beide parallel berechnet wurden.

Schritt 3: Aggregieren Sie Elemente zu einer einzigen Ausgabe

Okay, jetzt haben wir Teilergebnisse, die von jedem Element in unserem Array repräsentiert werden, und wir wollen unsere Teilergebnisse zu einem einzigen Aggregat zusammenführen. Ich nehme an, jedes Element im Array sollte die gleiche Funktion zusammengeführt werden, da jedes Element in der Eingabe den gleichen Datentyp hat.

Hier ist eine wirklich hässliche Funktion, die ich für den Job geschrieben habe:

%Vor%

reduceMany nimmt Sequenzen von n-Länge-Sequenzen und gibt ein n-Längen-Array als Ausgabe zurück. Wenn Sie sich eine bessere Möglichkeit vorstellen können, diese Funktion zu schreiben, seien Sie mein Gast:)

Um die Ausgabe oben zu dekodieren:

  • 48 = Summe der Längen meiner beiden Eingabezeichenfolgen. Beachten Sie, dass die ursprüngliche Zeichenfolge 49 Zeichen enthielt, aber auf "|" aß ein Zeichen pro "|".
  • 1 = Summe aller Instanzen von 'J' in meiner Eingabe
  • 4 = Summe aller Instanzen von 'O'.

Schritt 4: Stellen Sie alles zusammen

%Vor%     
Juliet 30.09.2009 18:04
quelle