wiki:Flow/Building

Version 2 (modified by Ben Lippmeier, 11 years ago) (diff)

--

Building the Repa Plugin

Install LLVM and GHC head

Start with GHC head and LLVM 3.4 in your $PATH.

LLVM 3.1 also works (and probably other versions).

Leave the GHC head build in-place, soft link $GHC/inplace/bin/ghc-stage2 to $GHC/inplace/bin/ghc and then put the whole $GHC/inplace/bin directory in your $PATH. This way you also get ghc-pkg and other tools in your $PATH.

 $ ghc --version
 The Glorious Glasgow Haskell Compilation System, version 7.7.20140126

 $ ghc-pkg --version
 GHC package manager version 7.7.20140126

 $ opt --version
 LLVM version 3.4
 ...

Update the cabal database

Update your cabal database so you don't inadvertently install old library versions.

$ cabal update

Download and build the DDC head

Clone the DDC head repo.

$ git clone https://github.com/DDCSF/ddc

Install external dependencies for DDC.

$ cd ddc
$ cabal install `make show-pkgs` --enable-shared

The DDC make show-pkgs target lists what external Hackage packages DDC needs. We need to use --enable-shared to build shared libraries that will work with the Repa plugin.

Now build the DDC packages and register them with Cabal.

$ make packages

Note that just using make here will build DDC locally, but we won't get Cabal packages registered with the GHC development build. We need these when building the Repa plugin.

Download and build the Repa head

Clone the Repa head repo.

$ cd ..
$ git clone https://github.com/DDCSF/repa

Install the Repa packages.

$ cd repa
$ make plugin

Doing this should also install the QuickCheck and bmp packages as dependencies. After this step you should have the following cabal libraries installed, on top of the ones that come with the GHC development build.

$ ghc-pkg list
...
  QuickCheck-2.6
  bmp-1.2.5.2
  buildbox-2.1.3.1
  ddc-base-0.3.3.0
  ddc-build-0.3.3.0
  ddc-code-0.3.3.0
  ddc-core-0.3.3.0
  ddc-core-eval-0.3.3.0
  ddc-core-flow-0.3.3.0
  ddc-core-llvm-0.3.3.0
  ddc-core-salt-0.3.3.0
  ddc-core-simpl-0.3.3.0
  ddc-core-tetra-0.3.3.0
  ddc-driver-0.3.3.0
  ddc-interface-0.3.3.0
  ddc-source-tetra-0.3.3.0
  mtl-2.1.2
  parsec-3.1.5
  repa-3.2.3.4
  repa-io-3.2.3.4
  repa-plugin-1.0.1.0
  repa-series-1.0.1.0
  stm-2.4.2
  text-1.1.0.0
  wl-pprint-1.1

Using the repa-plugin

Compile one of the tests using the Repa plugin:

 $ cd repa-plugin/test/90-Benchmarks/repa/FilterMax
 $ ghc -fforce-recomp -O2 -fllvm -optlo-O3 \
    --make Main.hs \
    -fplugin=Data.Array.Repa.Plugin \
    -fplugin-opt=Data.Array.Repa.Plugin:dump

The ':dump' flag tells the plugin to drop the intermediate code at several points along the compilation pipeline. You should get a stack of dump.* files in the current directory.

Run the repa-plugin test

Run the version using flow fusion.

$ ./Main flow 100000000
elapsedTimeMS   = 281
cpuTimeMS       = 280

Run the version using stream fusion.

$ ./Main vector 100000000
elapsedTimeMS   = 319
cpuTimeMS       = 320

Running DDC Flow Fusion tests

Although the repa-plugin is invoked via GHC, the actual flow fusion transforms are done on the DDC Core language. There are tests for the low-level transforms in the DDC repo.

Go back to the root of the DDC build.

$ cd $DDC

Set the number of threads for a parallel build (substitute 8 => whatever)

$ echo THREADS=8 > make/config-override.mk

Build DDC locally and run all the regression tests.

$ make war

The flow fusion tests are in $DDC/test/ddc-main/60-CoreFlow

$ cat test/ddc-main/60-CoreFlow/30-Scalar/20-Map/Test.dcx
$ cat test/ddc-main/60-CoreFlow/30-Scalar/20-Map/Test.stdout.check

We can also run individual tests manually.

$ bin/ddci-core test/ddc-main/60-CoreFlow/30-Scalar/20-Map/Test.dcx