Warum wird der Fehler "Kann Ausdruck GHC.Prim.Int # nicht vektorisieren" in DPH-Programmen ungültig?

9

Ich habe versucht, das NQUEEN-Problem mit DPH zu implementieren, aber ich endete damit, dass ich den GHC.Prim.Int # -Fehler nicht vektorisieren konnte. Als ich nach dem Fehler gegoogelt habe, habe ich einen GHC Bug gefunden, der über vektorisierende Literale spricht, die für die Mustererkennung verwendet werden (http://haskell.1045720.n5.nabble.com/GHC-5702-Can-t-vectorise-pattern-matching-on -numeric-literals-td5076659.html). Ich bin mir nicht sicher, ob das der gleiche Fehler ist. Mein Code ist wie folgt,

%Vor%

Bitte lassen Sie mich wissen, wenn ich etwas falsch mache. Ich benutze GHC 7.4.1.

Vielen Dank im Voraus.

    
prasannak 19.08.2012, 11:18
quelle

1 Antwort

1

Ja, das scheint mit dem Fehler zu tun zu haben, auf den Sie sich bezogen haben. Der Fehler stammt von dieser Zeile:

%Vor%

Anscheinend können Sie n-Muster nicht mit -fvectorise enabled verwenden. Lassen Sie uns diese Zeile manuell entfernen, um das n-Muster zu entfernen:

%Vor%

Wir haben uns jetzt mit einer kryptischen Fehlermeldung beschäftigt. Das bedeutet nicht, dass wir fertig sind, denn die nächste Fehlermeldung erscheint genauso kryptisch:

%Vor%

Das Problem mit isSafe (glaube ich) ist, dass Sie viele Datentypen und Variablen verwenden, die nicht mit -fvectorise kompiliert wurden. Dies bedeutet, dass Sie nicht nur verknüpfte Listen ( Tycon not vectorised: [] ), Prelude.fst , Prelude.snd oder Prelude.zip verwenden können, es sei denn, Sie definieren diese Strukturen in Ihrem Modul neu. (Ärgerlich genug, ich kann (.) nicht einmal verwenden, ohne es neu zu definieren.)

Wir müssen isSafe umschreiben. Schauen wir uns die erste Zeile an:

%Vor%

Wir können Prelude.zip nicht verwenden, aber wir könnten stattdessen zipP verwenden, was bedeutet, dass wir q nicht mehr konvertieren müssen. Unsere abnehmende Liste sollte jedoch mit DPH-Kombinatoren umgeschrieben werden. Dumm genug, enumFromThenToP existiert nicht, also sagen wir stattdessen mapP (n I.-) (enumFromToP 0 (n I.- 1)) , um das parallele Äquivalent von [n, n I.- 1..1] zu erhalten. Also wird diese Zeile:

%Vor%

Jetzt für isSafeHelper :

%Vor%

Da Prelude.fst und Prelude.snd nicht verfügbar sind, können Sie dies beheben, indem Sie nur diese Teile des Tupels im Muster selbst extrahieren:

%Vor%

Aber natürlich wird es immer noch nicht kompiliert: Ihr Argument wird eine parallele Liste sein, keine verlinkte Liste im Prelude-Stil. Um dies zu umgehen, werden wir dies in einem funktionaleren Stil umschreiben, indem wir die Funktion all :

%Vor%

all funktioniert immer noch in verknüpften Listen, aber beachten Sie, dass Sie die Liste nicht manuell in Ihrer eigenen Funktion dekonstruieren. Wäre es nicht schön, wenn es für parallele Listen ein allP gäbe? Es würde, aber es ist nicht. Es ist jedoch nicht schwer, es zu schreiben:

%Vor%

Wenn Sie alles zusammenfügen, können Sie isSafe wie folgt schreiben:

%Vor%

nqueens_wrapper scheint in Ordnung zu sein. Dein Code sollte jetzt kompilieren.

Einige Anmerkungen:

  • Ich weiß nicht, ob es funktioniert (ich bekomme *** Exception: crossMapP: not implemented und weiß nicht, wie ich es beheben kann), aber es sieht so aus.
  • Das Umschreiben von isSafe funktioniert andersherum nicht. Wenn Sie versuchen, mit Prelude numbers in Prelude lists zu arbeiten, erhalten Sie die Beschwerde über Int# erneut. Ich denke, das liegt daran, dass isSafe von mindestens einer vektorisierten Funktion nqueens verwendet wird.
  • Geben Sie Data.Array.Parallel.Prelude nicht ein. Die Modulbeschreibung sagt so:

      

    Dieses Modul sollte nicht mehr explizit in Benutzercode importiert werden. Der Benutzercode sollte nur die parallelen und, bis der Vektorisierer Typklassen unterstützt, die typspezifischen Module importieren.

  • Verrück dich nicht mit lokalen Definitionen. isSafeHelper fehlt das Argument n in Ihrer Version.

user824425 29.12.2012, 22:48
quelle