Haskell Repa Schablone hackt

8

Das Problem

Ich versuche zu verstehen, wie Repa funktioniert und ich habe mit einem "Unschärfe" -Beispiel gearbeitet Code aus dem Paket Repa-Beispiele . Der Code verwendet stencil2 Quasi Quote :

%Vor%

Was ist einfach TemplateHaskell Snippet, das eine Funktion erzeugt:

%Vor%

Es ist okay, TH zu verwenden, aber ich würde gerne die Coefs in einem Repa Array behalten, also habe ich den Code geändert, um stattdessen ein Repa Array zu verwenden, aber mein Code arbeitet im Vergleich zum Original zwei Mal langsamer.

Einige ausgefallene Notizen

Ich habe bemerkt, dass Repa-Autoren hartkodierte 7 x 7-Matrix von Werten verwenden, um Koeffizienten zu erhalten: Ссылка (siehe: template7x7)

Fragen

  1. Ich möchte Sie fragen, warum es nicht als Original optimiert wurde und wie können wir es beheben? Ich möchte eine "Convolve" -Funktion schreiben, mit der ich eine Schablone (ein Repa-Array) über ein Bild falten kann.
  2. Müssen wir wirklich solche hartcodierten Matrizen verwenden, damit GHC den Code optimiert? Es gibt wirklich keine Möglichkeit, schnellen Haskell-Code zu erstellen, ohne solche "Hacks" zu benutzen?

Der Code

Original Unschärfe-Funktion:

%Vor%

meine Unschärfe-Funktion:

%Vor%

Der Rest des Codes:

%Vor%

Kompilieren Sie mit: ghc -O2 -threaded -fllvm -fforce-recomp Main.hs -ddump-splices

    
Wojciech Danilo 03.11.2013, 02:47
quelle

1 Antwort

1
  1. Das Lesen von Faltungs-Koeffizienten aus dem Array konnte theoretisch nicht so schnell sein wie das Löten von Konstanten direkt in dem kompilierten Code, weil der letztere Ansatz nichts auf Maschinenebene kostet.

  2. Nein, GHC kann beliebig große statische Schablonen einkochen. Siehe meine Implementierung von statischen Faltungen mit < a href="http://hackage.haskell.org/package/fixed-vector"> fixed-vector s von lambdas:

    %Vor%
leventov 03.11.2013 10:18
quelle