diff --git a/garlic/apps/fwi/default.nix b/garlic/apps/fwi/default.nix index 96c2691..94d1bdc 100644 --- a/garlic/apps/fwi/default.nix +++ b/garlic/apps/fwi/default.nix @@ -4,7 +4,8 @@ , tampi ? null , mcxx ? null , cc -, gitBranch +, gitBranch ? "garlic/tampi+send+oss+task" +, fwiInput }: with stdenv.lib; @@ -12,6 +13,7 @@ with stdenv.lib; assert !(tampi != null && mcxx == null); stdenv.mkDerivation rec { + inherit gitBranch; name = "fwi"; src = builtins.fetchGit { @@ -19,14 +21,20 @@ stdenv.mkDerivation rec { ref = "${gitBranch}"; }; - enableParallelBuilding = true; + enableParallelBuilding = false; buildInputs = [ cc ] - ++ optional (mpi != null) mpi + ++ optional (mpi != null) mpi ++ optional (tampi != null) tampi - ++ optional (mcxx != null) mcxx; + ++ optional (mcxx != null) mcxx; + + # FIXME: Correct this on the Makefile so we can just type "make fwi" + # FIXME: Allow multiple MPI implementations + postPatch = '' + sed -i 's/= OPENMPI$/= INTEL/g' Makefile + ''; # FIXME: This is an ugly hack. # When using _GNU_SOURCE or any other definition used in features.h, we need @@ -35,33 +43,25 @@ stdenv.mkDerivation rec { # below, reaches the command line of the preprocessing stage with gcc. preConfigure = '' export DEFINES=-D_GNU_SOURCE - export NANOS6_CONFIG_OVERRIDE=version.debug=true + + make depend + + cp ${fwiInput}/generated_model_params.h src/ ''; # We compile the ModelGenerator using gcc *only*, as otherwise it will # be compiled with nanos6, which requires access to /sys to determine # hardware capabilities. So it will fail in the nix-build environment, # as there is no /sys mounted. - preBuild = '' - make COMPILER=GNU ModelGenerator - ''; - makeFlags = [ - "CC=${cc.cc.CC}" + #"COMPILER=GNU" + #"CC=${cc.cc.CC}" + "fwi" ]; - postBuild = '' - make input - ''; - - #FIXME split the input in another derivation installPhase = '' mkdir -p $out/bin cp fwi $out/bin - cp ModelGenerator $out/bin - mv InputModels $out/bin - mkdir -p $out/etc/fwi - cp SetupParams/{fwi_frequencies.txt,fwi_params.txt} $out/etc/fwi ''; programPath = "/bin/fwi"; diff --git a/garlic/apps/fwi/input.nix b/garlic/apps/fwi/input.nix new file mode 100644 index 0000000..a71014f --- /dev/null +++ b/garlic/apps/fwi/input.nix @@ -0,0 +1,40 @@ +{ + stdenv +}: + +with stdenv.lib; + +stdenv.mkDerivation rec { + name = "fwi-header"; + + src = builtins.fetchGit { + url = "https://gitlab.com/srodrb/BSC-FWI.git"; + ref = "garlic/seq"; + }; + + enableParallelBuilding = false; + + # FIXME: This is an ugly hack. + # When using _GNU_SOURCE or any other definition used in features.h, we need + # to define them before mcc includes nanos6.h from the command line. So the + # only chance is by setting it at the command line with -D. Using the DEFINES + # below, reaches the command line of the preprocessing stage with gcc. + preConfigure = '' + export DEFINES=-D_GNU_SOURCE + ''; + + # We compile the ModelGenerator using gcc *only*, as otherwise it will + # be compiled with nanos6, which requires access to /sys to determine + # hardware capabilities. So it will fail in the nix-build environment, + # as there is no /sys mounted. + # Also, we need to compile it with the builder platform as target, as is going + # to be executed during the build to generate the src/generated_model_params.h + # header. + makeFlags = [ "COMPILER=GNU" "params" "input" ]; + + installPhase = '' + mkdir -p $out/ + cp src/generated_model_params.h $out/ + cp -r InputModels $out/ + ''; +} diff --git a/garlic/apps/index.nix b/garlic/apps/index.nix index ac2ccfd..41da295 100644 --- a/garlic/apps/index.nix +++ b/garlic/apps/index.nix @@ -53,5 +53,10 @@ hpccg = callPackage ./hpccg/default.nix { }; - fwi = callPackage ./fwi/default.nix { }; + fwi = rec { + input = callPackage ./fwi/input.nix { }; + solver = callPackage ./fwi/default.nix { + fwiInput = input; + }; + }; } diff --git a/garlic/exp/fwi/test.nix b/garlic/exp/fwi/test.nix index 8fe6cb8..26de7f4 100644 --- a/garlic/exp/fwi/test.nix +++ b/garlic/exp/fwi/test.nix @@ -11,24 +11,38 @@ with stdenv.lib; let # Initial variable configuration varConf = { + gitBranch = [ + "garlic/tampi+send+oss+task" + "garlic/mpi+send+omp+task" + "garlic/mpi+send+oss+task" + "garlic/mpi+send+seq" + "garlic/oss+task" + "garlic/omp+task" + "garlic/seq" + ]; }; + machineConfig = targetMachine.config; + # Generate the complete configuration for each unit genConf = with bsc; c: targetMachine.config // rec { - # Options for creams - cc = icc; - gitBranch = "seq"; + expName = "fwi"; + unitName = "${expName}-test"; + inherit (machineConfig) hw; - # Repeat the execution of each unit 30 times - loops = 1; + cc = icc; + gitBranch = c.gitBranch; + + # Repeat the execution of each unit several times + loops = 10; # Resources - qos = "debug"; - nodes = 1; - time = "02:00:00"; + cpusPerTask = hw.cpusPerSocket; ntasksPerNode = 1; - cpuBind = "rank,verbose"; - jobName = "fwi-${gitBranch}"; + nodes = 1; + qos = "debug"; + time = "02:00:00"; + jobName = unitName; }; # Compute the array of configurations @@ -37,29 +51,30 @@ let }; # Custom stage to copy the FWI input - copyInput = {nextStage, conf, ...}: - let - input = bsc.garlic.apps.fwi; - in - stages.exec { - inherit nextStage; - env = '' - cp -r ${input}/bin/InputModels . - chmod +w -R . - ''; - argv = [ - "${input}/etc/fwi/fwi_params.txt" - "${input}/etc/fwi/fwi_frequencies.txt" - ]; - }; + #copyInput = {nextStage, conf, ...}: + # let + # input = bsc.garlic.apps.fwi; + # in + # stages.exec { + # inherit nextStage; + # env = '' + # cp -r ${input}/bin/InputModels . + # chmod +w -R . + # ''; + # argv = [ + # "${input}/etc/fwi/fwi_params.txt" + # "${input}/etc/fwi/fwi_frequencies.txt" + # ]; + # }; + + apps = bsc.garlic.apps; # FWI program - program = {nextStage, conf, ...}: with conf; - bsc.garlic.apps.fwi.override { - inherit cc gitBranch; - }; + program = {nextStage, conf, ...}: apps.fwi.solver.override { + inherit (conf) cc gitBranch; + }; - pipeline = stdexp.stdPipeline ++ [ copyInput program ]; + pipeline = stdexp.stdPipeline ++ [ program ]; in diff --git a/garlic/exp/index.nix b/garlic/exp/index.nix index 3a007fa..2b34e4a 100644 --- a/garlic/exp/index.nix +++ b/garlic/exp/index.nix @@ -97,6 +97,10 @@ test = callPackage ./lulesh/test.nix { }; }; + fwi = { + test = callPackage ./fwi/test.nix { }; + }; + osu = rec { latency = callPackage ./osu/latency.nix { }; latencyShm = latency.override { interNode = false; };