Remove garlic from bscpkgs

This commit is contained in:
Rodrigo Arias 2023-10-03 12:24:58 +02:00
parent 7b72b38023
commit 4533c94b4f
178 changed files with 0 additions and 16994 deletions

View File

@ -1,54 +0,0 @@
{
stdenv
, lib
, cc
, nanos6 ? null
, mcxx ? null
, mpi
, gitBranch
}:
with lib;
stdenv.mkDerivation rec {
name = "bigsort";
src = builtins.fetchGit {
url = "ssh://git@bscpm03.bsc.es/dalvare1/bigsort.git";
ref = "${gitBranch}";
};
#sourceRoot = "./BigSort";
preBuild = ''
cd BigSort
export I_MPI_CXX=${cc.CXX}
'';
buildInputs = [
cc
mpi
]
++ optional (mcxx != null) mcxx
++ optional (nanos6 != null) nanos6;
makeFlags = [
"CC=${cc.CC}"
"CXX=${cc.CXX}"
"CPP_BIN=mpicxx"
"CLUSTER=MareNostrum4"
"OPENMP=yes"
"Debug=no"
"OPENMP_FLAGS=-qopenmp"
];
enableParallelBuilding = true;
installPhase = ''
mkdir -p $out/bin
cp bigsort $out/bin/BigSort
'';
programPath = "/bin/BigSort";
hardeningDisable = [ "all" ];
}

View File

@ -1,46 +0,0 @@
{
stdenv
, lib
, cc
, mpi
}:
with lib;
stdenv.mkDerivation rec {
name = "genseq";
src = builtins.fetchGit {
url = "ssh://git@bscpm03.bsc.es/dalvare1/bigsort.git";
ref = "garlic/mpi+send+omp+task";
};
postUnpack = "sourceRoot=$sourceRoot/GenSeq";
# FIXME: Remove the ../commons/Makefile as is not useful here, we only need
# the CPP_SRC and OBJ variables.
postPatch = ''
sed -i '1cCPP_SRC = $(wildcard *.cpp)' Makefile
sed -i '2cOBJ = $(CPP_SRC:.cpp=.o)' Makefile
'';
buildInputs = [
cc
mpi
];
makeFlags = [
"I_MPI_CXX=${cc.CXX}"
"CPP_BIN=mpicxx"
];
enableParallelBuilding = true;
installPhase = ''
mkdir -p $out/bin
cp genseq $out/bin/genseq
'';
programPath = "/bin/genseq";
hardeningDisable = [ "all" ];
}

View File

@ -1,46 +0,0 @@
{
stdenv
, lib
, cc
, mpi
}:
with lib;
stdenv.mkDerivation rec {
name = "shuffle";
src = builtins.fetchGit {
url = "ssh://git@bscpm03.bsc.es/dalvare1/bigsort.git";
ref = "garlic/mpi+send+omp+task";
};
postUnpack = "sourceRoot=$sourceRoot/ShuffleSeq";
# FIXME: Remove the ../commons/Makefile as is not useful here, we only need
# the CPP_SRC and OBJ variables.
postPatch = ''
sed -i '1cCPP_SRC = $(wildcard *.cpp)' Makefile
sed -i '2cOBJ = $(CPP_SRC:.cpp=.o)' Makefile
'';
buildInputs = [
cc
mpi
];
makeFlags = [
"I_MPI_CXX=${cc.CXX}"
"CPP_BIN=mpicxx"
];
enableParallelBuilding = true;
installPhase = ''
mkdir -p $out/bin
cp shuffle $out/bin/shuffle
'';
programPath = "/bin/shuffle";
hardeningDisable = [ "all" ];
}

View File

@ -1,43 +0,0 @@
{
stdenv
, libconfig
, nanos6
, mpi
, uthash
, fftw
, tampi
, hdf5
}:
stdenv.mkDerivation rec {
name = "cpic";
# Use my current cpic version, so I can test changes without commits
#src = /home/Computational/rarias/cpic;
src = builtins.fetchGit {
url = "https://github.com/rodarima/cpic";
# rev = "73bd70448587f0925b89e24c8f17e412ea3958e6";
ref = "simd";
};
enableParallelBuilding = true;
dontStrip = true;
buildInputs = [
libconfig
nanos6
mpi
uthash
fftw
tampi
hdf5
];
installPhase = ''
mkdir -p $out/bin
cp cpic $out/bin/cpic
'';
hardeningDisable = [ "all" ];
}

View File

@ -1,57 +0,0 @@
{
stdenv
, nanos6
, mpi
, openmpi
, impi
, tampi
, mcxx
, gnuDef
, intelDef
, cc
, gitBranch ? "garlic/mpi+send+seq"
, gitCommit ? null
, garlicTools
}:
assert (mpi == impi || mpi == openmpi);
let
# FIXME: We should find a better way to specify the MPI implementation
# and the compiler.
mpiName = if mpi == openmpi then "OpenMPI" else "IntelMPI";
compName = if cc == intelDef then "Intel" else "GNU";
gitSource = garlicTools.fetchGarlicApp {
appName = "creams";
inherit gitCommit gitBranch;
gitTable = import ./git-table.nix;
};
in
stdenv.mkDerivation rec {
name = "creams";
inherit (gitSource) src gitBranch gitCommit;
programPath = "/bin/creams.exe";
buildInputs = [ nanos6 mpi cc tampi mcxx ];
configurePhase = ''
export TAMPI_HOME=${tampi}
. etc/bashrc
export FORTRAN_COMPILER=${compName}
export MPI_LIB=${mpiName}
CREAMS_UPDATE_ENVIRONMENT
'';
installPhase = ''
mkdir -p $out/bin
cp -a build/* $out/bin
'';
hardeningDisable = [ "all" ];
}

View File

@ -1,49 +0,0 @@
#!/usr/bin/env python3
import argparse
parser = argparse.ArgumentParser(description="Generate a grid.dat input file for CREAMS")
parser.add_argument('--npx', type=int, help='number of processes in X', default=1)
parser.add_argument('--npy', type=int, help='number of processes in Y', default=1)
parser.add_argument('--npz', type=int, help='number of processes in Z', default=32)
parser.add_argument('--grain', type=int, help='granularity', default=9)
parser.add_argument('--nx', type=int, help='number of points in X', default=20)
parser.add_argument('--ny', type=int, help='number of points in Y', default=20)
parser.add_argument('--nz', type=int, help='number of points in Z', default=7000)
parser.add_argument('--dx', type=float, help='grid spacing in X', default=0.0025062657)
parser.add_argument('--dy', type=float, help='grid spacing in Y', default=0.0025062657)
parser.add_argument('--dz', type=float, help='grid spacing in Z', default=0.0025062657)
args = parser.parse_args()
grain_str = "%d %d" % (args.grain, args.grain)
boundary = "extrapolation"
# Print
print(' %-49d number of processes in x-direction (0 if automatic)' % args.npx)
print(' %-49d number of processes in y-direction (0 if automatic)' % args.npy)
print(' %-49d number of processes in z-direction (0 if automatic)' % args.npz)
print(' ')
print(' %-49s subdomain granularity' % grain_str)
print(' ')
print(' %-49s -x boundary' % boundary)
print(' %-49s +x boundary' % boundary)
print(' %-49s -y boundary' % boundary)
print(' %-49s +y boundary' % boundary)
print(' %-49s -z boundary' % boundary)
print(' %-49s +z boundary' % boundary)
print(' ')
print(' x-direction')
for i in range(args.nx):
print("%.9e" % (i * args.dx))
print(' ')
print(' y-direction')
for i in range(args.ny):
print("%.9e" % (i * args.dy))
print(' ')
print(' z-direction')
for i in range(args.nz):
print("%.9e" % (i * args.dz))
print(' ')
print(' END')

View File

@ -1,12 +0,0 @@
{
# Auto-generated with garlic-git-table on 2021-03-31 for repo:
# ssh://git@bscpm03.bsc.es/pmartin1/creams-simplified.git
"garlic/mpi+isend+omp+task" = "e6aa540820ee12d3d45d0eef8e7eeb2f0f1daea2";
"garlic/mpi+isend+oss+task" = "016f33b8bec996a4546e8f08b1b6b1709f00499b";
"garlic/mpi+send+omp+fork" = "e56e059264ad1bfe5e0c96a8b9303d21dd7fa20a";
"garlic/mpi+send+omp+task" = "919580213de34bc5b6ba60c768c5dde5e501a1f6";
"garlic/mpi+send+oss+task" = "adab8b66f27317d51445648302e7b133edf4837d";
"garlic/mpi+send+seq" = "956125f9334493d31ceee3fa7024efa65bee9ca5";
"garlic/tampi+isend+oss+task" = "14a121627679a251909d4b8103d260e27eac1d29";
}

View File

@ -1,48 +0,0 @@
{
stdenv
, python3
, granul ? 9
, nprocx ? 1
, nprocy ? 1
, nprocz ? 1
, nx ? 20
, ny ? 20
, nz ? 7000
, gitBranch ? "garlic/mpi+send+seq"
, gitCommit ? null
, garlicTools
}:
let
gitSource = garlicTools.fetchGarlicApp {
appName = "creams";
inherit gitCommit gitBranch;
gitTable = import ./git-table.nix;
};
gen = ./gen_grid.py;
in
stdenv.mkDerivation rec {
name = "creams-input";
buildInputs = [ python3 ];
inherit (gitSource) src gitBranch gitCommit;
phases = [ "unpackPhase" "installPhase" ];
installPhase = ''
mkdir -p $out
cp -a SodTubeBenchmark $out/
python3 ${gen} \
--npx ${toString nprocx} \
--npy ${toString nprocy} \
--npz ${toString nprocz} \
--grain ${toString granul} \
--nx ${toString nx} \
--ny ${toString ny} \
--nz ${toString nz} \
> $out/SodTubeBenchmark/grid.dat
'';
}

View File

@ -1,77 +0,0 @@
{
stdenv
, lib
, mpi ? null
, tampi ? null
, mcxx ? null
, cc
, gitBranch ? "garlic/tampi+send+oss+task"
, gitCommit ? null
, fwiParams
, garlicTools
}:
with lib;
assert !(tampi != null && mcxx == null);
let
gitSource = garlicTools.fetchGarlicApp {
appName = "fwi";
inherit gitCommit gitBranch;
gitTable = import ./git-table.nix;
};
in
stdenv.mkDerivation rec {
name = "fwi";
inherit (gitSource) src gitBranch gitCommit;
enableParallelBuilding = false;
buildInputs = [
cc
]
++ optional (mpi != null) mpi
++ optional (tampi != null) tampi
++ 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
sed -i 's/USE_O_DIRECT ?= NO/USE_O_DIRECT ?= YES/g' Makefile || true
'';
# 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
make depend
cp ${fwiParams}/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.
makeFlags = [
#"COMPILER=GNU"
#"CC=${cc.cc.CC}"
"fwi"
];
installPhase = ''
mkdir -p $out/bin
cp fwi $out/bin
'';
programPath = "/bin/fwi";
hardeningDisable = [ "all" ];
}

View File

@ -1,15 +0,0 @@
{
# Auto-generated with garlic-git-table on 2021-04-19 for repo:
# ssh://git@bscpm03.bsc.es/garlic/apps/fwi.git
"garlic/mpi+send+omp+fork" = "ea1ed53f20858dc082f9cbbe0e7e8fb28a6fe58a";
"garlic/mpi+send+omp+task" = "aa8881056fb3fa98832d203899beacfb8fa702f6";
"garlic/mpi+send+oss+task" = "c184484af8498fd939761575b34bb46ba3be0dde";
"garlic/mpi+send+oss+task+NOREUSE" = "0062093ef744c694d69673d1881719958bbed353";
"garlic/mpi+send+seq" = "cc184ad77f143481e2506933d0cdc038c349f071";
"garlic/omp+task" = "1fe23690d74ae89ace5383ab165a6ce6346c2afd";
"garlic/oss+task" = "68e6e8f17ee03addb460745acea2a38241ca89ee";
"garlic/seq" = "aa6b6c5857125796c65fbf23018d557e4693f1ae";
"garlic/tampi+isend+oss+task" = "7c98194e13786c4e8ecfa8a144587e5a95e09205";
"garlic/tampi+send+oss+task" = "e08d66f7453c4034a363bb2d22c5248fe86ed740";
}

View File

@ -1,65 +0,0 @@
{
stdenv
, lib
, nz ? 200
, nx ? 200
, ny ? 500
, gitBranch ? "garlic/seq"
, gitCommit ? null
, garlicTools
}:
with lib;
with builtins;
let
gitSource = garlicTools.fetchGarlicApp {
appName = "fwi";
inherit gitCommit gitBranch;
gitTable = import ./git-table.nix;
};
in
stdenv.mkDerivation rec {
name = "fwi-params";
inherit (gitSource) src gitBranch gitCommit;
enableParallelBuilding = false;
# Set the input size with the weird order (nz,nx,ny).
postPatch = ''
sed -i 1c${toString nz} SetupParams/fwi_params.txt
sed -i 2c${toString nx} SetupParams/fwi_params.txt
sed -i 3c${toString ny} SetupParams/fwi_params.txt
'';
# 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" ];
installPhase = ''
mkdir -p $out/
cp src/generated_model_params.h $out/
cp SetupParams/fwi_params.txt $out/
cp SetupParams/fwi_frequencies.txt $out/
mkdir -p $out/bin
cp ModelGenerator $out/bin/
'';
hardeningDisable = [ "all" ];
}

View File

@ -1,39 +0,0 @@
{
stdenv
, mpi
, tampi
, mcxx
, gitBranch ? "garlic/mpi+send+seq"
, gitCommit ? null
, garlicTools
}:
let
gitSource = garlicTools.fetchGarlicApp {
appName = "heat";
inherit gitCommit gitBranch;
gitTable = import ./git-table.nix;
};
in
stdenv.mkDerivation rec {
name = "heat";
inherit (gitSource) src gitBranch gitCommit;
patches = [ ./print-times.patch ];
buildInputs = [ mpi mcxx tampi ];
programPath = "/bin/${name}";
installPhase = ''
mkdir -p $out/bin
cp ${name} $out/bin/
mkdir -p $out/etc
cp heat.conf $out/etc/
'';
hardeningDisable = [ "all" ];
}

View File

@ -1,9 +0,0 @@
{
# Auto-generated with garlic-git-table on 2021-04-01 for repo:
# ssh://git@bscpm03.bsc.es/garlic/apps/heat.git
"garlic/mpi+send+oss+task" = "947c80070d4c53e441df54b8bfac8928b10c5fb2";
"garlic/mpi+send+seq" = "f41e1433808d0cbecd88a869b451c927747e5d42";
"garlic/tampi+isend+oss+task" = "b1273f9b4db32ba6e15e3d41343e67407ce2f54f";
"garlic/tampi+send+oss+task" = "554bec249f9aa23dd92edcfa2ada1e03e05e121d";
}

View File

@ -1,13 +0,0 @@
diff --git a/src/mpi/main.c b/src/mpi/main.c
index 44f4a99..08a1f5c 100644
--- a/src/mpi/main.c
+++ b/src/mpi/main.c
@@ -83,6 +83,8 @@ int main(int argc, char **argv)
conf.rows, conf.cols, conf.rows/nranks, totalElements, totalElements/nranks,
conf.rbs, conf.cbs, nranks, threads, conf.timesteps, end-start, throughput);
printf("time %e\n", end - start);
+ printf("start_time %.9f\n", start);
+ printf("end_time %.9f\n", end);
}
if (conf.generateImage) {

View File

@ -1,55 +0,0 @@
{
stdenv
, lib
, icc
, mpi ? null
, tampi ? null
, mcxx ? null
, gitBranch ? "garlic/mpi+isend+seq"
, gitCommit ? null
, garlicTools
}:
assert !(tampi != null && mcxx == null);
with lib;
let
gitSource = garlicTools.fetchGarlicApp {
appName = "hpccg";
inherit gitCommit gitBranch;
gitTable = import ./git-table.nix;
};
in
stdenv.mkDerivation rec {
name = "hpccg";
inherit (gitSource) src gitBranch gitCommit;
programPath = "/bin/test_HPCCG-mpi.exe";
buildInputs = [
icc
]
++ optional (mpi != null) mpi
++ optional (tampi != null) tampi
++ optional (mcxx != null) mcxx;
# The hpccg app fails to compile in parallel. Makefile must be fixed before.
enableParallelBuilding = false;
makeFlags = [
"USE_MPI=-DUSING_MPI"
]
++ optional (tampi != null) "TAMPI_HOME=${tampi}";
dontPatchShebangs = true;
installPhase = ''
echo ${tampi}
mkdir -p $out/bin
cp test_HPCCG-mpi.exe $out/bin
'';
hardeningDisable = [ "all" ];
}

View File

@ -1,9 +0,0 @@
{
# Auto-generated with garlic-git-table on 2021-04-20 for repo:
# ssh://git@bscpm03.bsc.es/garlic/apps/hpccg.git
"garlic/mpi+isend+omp+fork" = "c84af0480d231961201f2904ee4e3fced9d5f9be";
"garlic/mpi+isend+seq" = "d1b47cd459440700de1b68233ec4fe794343dbd4";
"garlic/tampi+isend+oss+task" = "7238e9be2e4a7b028abc05d40b476462eaa3de6a";
"garlic/tampi+isend+oss+taskfor" = "02ec60f43b8d68d74575ea0563a9029fd441f1f1";
}

View File

@ -1,44 +0,0 @@
{
stdenv
, cc
, nanos6
, mcxx
, mpi
, tampi
, gitBranch ? "garlic/seq"
, gitCommit ? null
, garlicTools
}:
let
gitSource = garlicTools.fetchGarlicApp {
appName = "hpcg";
inherit gitCommit gitBranch;
gitTable = import ./git-table.nix;
};
in
stdenv.mkDerivation rec {
name = "hpcg";
inherit (gitSource) src gitBranch gitCommit;
buildInputs = [
cc nanos6 mcxx mpi tampi
];
makeFlags = [
"CC=${cc.CC}"
"CXX=${cc.CXX}"
];
enableParallelBuilding = true;
installPhase = ''
mkdir -p $out/bin
cp bin/* $out/bin/
'';
programPath = "/bin/xhpcg";
hardeningDisable = [ "all" ];
}

View File

@ -1,18 +0,0 @@
{
# Auto-generated with garlic-git-table on 2021-04-20 for repo:
# ssh://git@bscpm03.bsc.es/garlic/apps/hpcg.git
"garlic/mpi" = "8c94ccfd97518ed947bd6be3386260b72fdcdff2";
"garlic/mpi+SAVEMAT" = "5dd2ad9eba13dba67086f46c6e8519804d837383";
"garlic/mpi+omp" = "d24c372dd9fda584e711efb612f172e5c3602804";
"garlic/mpi+oss" = "519a867bb3a3e07440df05e60a62abad764524e5";
"garlic/mpi+send+omp+fork" = "a08d31aedbc108e1c0081cdc5021827ac9022688";
"garlic/omp" = "dcc8a40831cda884b9240af47e883ac997150ed3";
"garlic/omp+SAVEMAT" = "40dbac86c905e192ecc8146e0e65e4c3a3c6dbf8";
"garlic/omp+fork" = "042752b3dbcd9b0f4db524b6cdc911278ee1a51b";
"garlic/omp+initsplit" = "5370e7ee26fb72ef100a79624f73ed2baa6bcc79";
"garlic/oss" = "7e6e2d969b7904572f2475bf471e637651337761";
"garlic/oss+task" = "034940756ccab88876609c3cba4dea0a0f5c944b";
"garlic/seq" = "dee225571ab2572d7aa51df9846b01237ee941a1";
"garlic/tampi+isend+oss+task" = "449a3980a767f91ca65d429490080961dcfba498";
}

View File

@ -1,13 +0,0 @@
--- a/setup/Make.MPI_ICPC_OSS 2020-07-13 16:02:33.272257865 +0200
+++ b/setup/Make.MPI_ICPC_OSS 2020-07-13 16:04:34.344413390 +0200
@@ -91,8 +91,8 @@
# - HPCG includes / libraries / specifics -------------------------------
# ----------------------------------------------------------------------
#
-HPCG_INCLUDES = -I$(INCdir) -I$(INCdir)/$(arch) $(MPinc) -I{TAMPI_HOME}/include
-HPCG_LIBS = ${TAMPI_HOME}/lib/libtampi.a
+HPCG_INCLUDES = -I$(INCdir) -I$(INCdir)/$(arch) $(MPinc) -I$(TAMPI_HOME)/include
+HPCG_LIBS = -l:libtampi.a
#
# - Compile time options -----------------------------------------------
#

View File

@ -1,60 +0,0 @@
{
stdenv
, lib
, mpi
, gfortran
, tampi
, nanos6
, mcxx
, gitBranch ? "garlic/mpi+isend+seq"
, gitCommit ? null
, garlicTools
}:
with lib;
let
gitSource = garlicTools.fetchGarlicApp {
appName = "ifsker";
inherit gitCommit gitBranch;
gitTable = import ./git-table.nix;
};
in
stdenv.mkDerivation rec {
name = "ifsker";
inherit (gitSource) src gitBranch gitCommit;
buildInputs = [ tampi mpi nanos6 mcxx gfortran ];
# Mercurium seems to fail when building with fortran in parallel
enableParallelBuilding = false;
# FIXME: Patch mcxx to use other directory than $HOME for the lock
# files.
preConfigure = ''
export TAMPI_HOME=${tampi}
# $HOME is required for the lock files by mcxx to compile fortran.
# So we use the $TMPDIR to store them.
export HOME=$TMPDIR
'';
makeFlags = [
"-f" "Makefile.gcc"
];
installPhase = ''
mkdir -p $out/bin
cp ${name} $out/bin/
mkdir -p $out/etc
cp -r data $out/etc/
cp nanos6.toml $out/etc
'';
programPath = "/bin/${name}";
hardeningDisable = [ "all" ];
}

View File

@ -1,10 +0,0 @@
{
# Auto-generated with garlic-git-table on 2021-04-20 for repo:
# ssh://git@bscpm03.bsc.es/garlic/apps/ifsker.git
"garlic/mpi+isend+oss+fork" = "a6a20303101cb140571ddc1166e66843fbe83017";
"garlic/mpi+isend+oss+task" = "a7bdb6c9b57aafbc50cdc790eb42e5bdd850f213";
"garlic/mpi+isend+seq" = "bc97cf30835bbf6a825209485bb96fc8314e5bcb";
"garlic/tampi+isend+oss+task" = "33408215bc231b70b60733fddea3d1b7431bb0d1";
"garlic/tampi+send+oss+task" = "19dae956b4ef69916c0e8ad15bb6ced0085275cd";
}

View File

@ -1,55 +0,0 @@
{
super
, self
, bsc
, garlic
, callPackage
}:
{
nbody = callPackage ./nbody/default.nix { };
saiph = callPackage ./saiph/default.nix {
cc = bsc.clangOmpss2;
L3SizeKB = garlic.targetMachine.config.hw.cacheSizeKB.L3;
cachelineBytes = garlic.targetMachine.config.hw.cachelineBytes;
};
creams = callPackage ./creams/default.nix {
gnuDef = self.gfortran10 ; # Default GNU compiler version
intelDef = bsc.icc ; # Default Intel compiler version
};
creamsInput = callPackage ./creams/input.nix { };
hpcg = callPackage ./hpcg/default.nix { };
bigsort = {
sort = callPackage ./bigsort/default.nix {
gitBranch = "garlic/mpi+send+omp+task";
};
genseq = callPackage ./bigsort/genseq.nix { };
shuffle = callPackage ./bigsort/shuffle.nix { };
};
heat = callPackage ./heat/default.nix { };
miniamr = callPackage ./miniamr/default.nix {
variant = "ompss-2";
};
ifsker = callPackage ./ifsker/default.nix { };
lulesh = callPackage ./lulesh/default.nix { };
hpccg = callPackage ./hpccg/default.nix { };
fwi = rec {
params = callPackage ./fwi/params.nix { };
solver = callPackage ./fwi/default.nix {
fwiParams = params;
};
};
}

View File

@ -1,48 +0,0 @@
{
stdenv
, lib
, impi
, mcxx
, icc
, tampi ? null
, gitBranch ? "garlic/mpi+isend+seq"
, gitCommit ? null
, garlicTools
}:
with lib;
let
gitSource = garlicTools.fetchGarlicApp {
appName = "lulesh";
inherit gitCommit gitBranch;
gitTable = import ./git-table.nix;
};
in
stdenv.mkDerivation rec {
name = "lulesh";
inherit (gitSource) src gitBranch gitCommit;
dontConfigure = true;
preBuild = optionalString (tampi != null) "export TAMPI_HOME=${tampi}";
#TODO: Allow multiple MPI implementations and compilers
buildInputs = [
impi
icc
mcxx
];
enableParallelBuilding = true;
#TODO: Can we build an executable named "lulesh" in all branches?
installPhase = ''
mkdir -p $out/bin
find . -name 'lulesh*' -type f -executable -exec cp \{\} $out/bin/${name} \;
'';
programPath = "/bin/${name}";
hardeningDisable = [ "all" ];
}

View File

@ -1,12 +0,0 @@
{
# Auto-generated with garlic-git-table on 2021-04-20 for repo:
# ssh://git@bscpm03.bsc.es/garlic/apps/lulesh.git
"garlic/mpi+isend+omp+fork" = "6cc85c55cb4840d6cde12bb285f5ab1ae7878618";
"garlic/mpi+isend+oss+task" = "0a9e2cd1d64ab4fcf1860ace02866278ad289637";
"garlic/mpi+isend+seq" = "9df5475c7dd2b345559fae5bd07ceea38f2e7b91";
"garlic/tampi+isend+oss+task" = "28ce0cd69f9b4e65eff8141ec455d5f60e9b98b3";
"garlic/tampi+isend+oss+taskfor" = "928f315ea426585a32231d950da651399e48d762";
"garlic/tampi+isend+oss+taskloop" = "7957c1a2c84ae80edddcec9eafe7efdeefa68d58";
"garlic/tampi+isend+oss+taskloopfor" = "7efa0535130a6726f5a46669cf171412d21adc9b";
}

View File

@ -1,48 +0,0 @@
{
stdenv
, lib
, tampi
, clangOmpss2
, mpi
, nanos6
, mcxx
, variant
}:
with lib;
assert (assertOneOf "variant" variant [ "openmp" "openmp-tasks" "ompss-2" ]);
let
cc=mcxx;
in
stdenv.mkDerivation rec {
name = "miniamr";
src = builtins.fetchGit {
url = "ssh://git@bscpm03.bsc.es/ksala/miniamr.git";
ref = "master";
};
postUnpack = ''
sourceRoot=$sourceRoot/${variant}
'';
buildInputs = [ tampi clangOmpss2 mpi nanos6 mcxx ];
makeFlags = [
"CC=${cc.CC}"
"CXX=${cc.CXX}"
];
enableParallelBuilding = true;
installPhase = ''
mkdir -p $out/bin
cp miniAMR.x $out/bin/
'';
programPath = "/bin/miniAMR.x";
hardeningDisable = [ "all" ];
}

View File

@ -1,59 +0,0 @@
{
stdenv
, lib
, cc
, mpi ? null
, tampi ? null
, mcxx ? null
, cflags ? null
, gitBranch ? "garlic/seq"
, gitCommit ? null
, blocksize ? 2048
, garlicTools
}:
assert !(tampi != null && mcxx == null);
with lib;
let
gitSource = garlicTools.fetchGarlicApp {
appName = "nbody";
inherit gitCommit gitBranch;
gitTable = import ./git-table.nix;
};
in
stdenv.mkDerivation rec {
name = "nbody";
inherit (gitSource) src gitBranch gitCommit;
programPath = "/bin/nbody";
buildInputs = [
cc
]
++ optional (mpi != null) mpi
++ optional (tampi != null) tampi
++ optional (mcxx != null) mcxx;
preBuild = (if cflags != null then ''
makeFlagsArray+=(CFLAGS="${cflags}")
'' else "");
makeFlags = [
"CC=${cc.CC}"
"BS=${toString blocksize}"
]
++ optional (tampi != null) "TAMPI_HOME=${tampi}";
dontPatchShebangs = true;
installPhase = ''
echo ${tampi}
mkdir -p $out/bin
cp nbody* $out/bin/${name}
'';
hardeningDisable = [ "all" ];
}

View File

@ -1,13 +0,0 @@
{
# Auto-generated with garlic-git-table on 2021-04-20 for repo:
# ssh://git@bscpm03.bsc.es/garlic/apps/nbody.git
"garlic/mpi+send+oss+task" = "20aa856baa3268d99262588807911ad0b3318d09";
"garlic/mpi+send+seq" = "3be64af0f949db5fd60fcd0334cf2cd8c9fa25c3";
"garlic/omp+fork" = "9c869272df7c775f467a2220211a414e33321c00";
"garlic/oss+task" = "13ab26fbad8662a1052cc94410386080bbf6a2ba";
"garlic/seq" = "9dfea29189d14477bd75e6f741f0518e7e4e5e72";
"garlic/seq+BLOCK" = "99408705628b374df4308dcf1cdbe2d21d1451c2";
"garlic/tampi+isend+oss+task" = "653d26e4a0913d36ea18d4e72e65a04838bb138a";
"garlic/tampi+send+oss+task" = "b1440ebc5f79165e5dfaa6a4ce7916eda410ec9a";
}

View File

@ -1,35 +0,0 @@
{
stdenv
, mpi
, fetchurl
}:
stdenv.mkDerivation {
name = "ppong";
src = fetchurl {
url = "http://www.csl.mtu.edu/cs4331/common/PPong.c";
sha256 = "0d1w72gq9627448cb7ykknhgp2wszwd117dlbalbrpf7d0la8yc0";
};
unpackCmd = ''
mkdir src
cp $src src/ppong.c
'';
dontConfigure = true;
buildPhase = ''
echo mpicc -include stdlib.h ppong.c -o ppong
mpicc -include stdlib.h ppong.c -o ppong
'';
installPhase = ''
mkdir -p $out/bin
cp ppong $out/bin/ppong
ln -s $out/bin/ppong $out/bin/run
'';
buildInputs = [ mpi ];
hardeningDisable = [ "all" ];
}

View File

@ -1,106 +0,0 @@
{
stdenv
, lib
, nanos6
, mpi
, tampi
, cc
, vtk
, boost
, gitBranch ? "master"
, gitCommit ? null
, enableManualDist ? false
, nbgx ? null
, nbgy ? null
, nbgz ? null
, nblx ? null
, nbly ? null
, nblz ? null
, nsteps ? null
, numComm ? null
, enableVectFlags ? false
, enableDebugFlags ? false
, enableAsanFlags ? false
, cachelineBytes ? null
, L3SizeKB ? null
# Problem size:
, sizex ? 3
, sizey ? 4
, sizez ? 4
, garlicTools
}:
assert enableManualDist -> (nbgx != null);
assert enableManualDist -> (nbgy != null);
assert enableManualDist -> (nbgz != null);
with lib;
with lib.versions;
let
gitSource = garlicTools.fetchGarlicApp {
appName = "saiph";
inherit gitCommit gitBranch;
gitTable = import ./git-table.nix;
};
in
stdenv.mkDerivation rec {
name = "saiph";
inherit (gitSource) src gitBranch gitCommit;
programPath = "/bin/Heat3D_vect";
enableParallelBuilding = true;
dontStrip = true;
enableDebugging = true;
buildInputs = [
nanos6
mpi
tampi
cc
vtk
boost
];
preBuild = ''
cd saiphv2/cpp/src
export VTK_VERSION=${majorMinor (getVersion vtk.name)}
export VTK_HOME=${vtk}
make clean
sed -i '/SIZEX =/s/3/${toString sizex}/g' testApp/Heat3D_vect.cpp
sed -i '/SIZEY =/s/4/${toString sizey}/g' testApp/Heat3D_vect.cpp
sed -i '/SIZEZ =/s/4/${toString sizez}/g' testApp/Heat3D_vect.cpp
'';
makeFlags = [
"-f" "Makefile.${cc.CC}"
"apps"
"APP=Heat3D_vect"
] ++ optional (cachelineBytes != null) "ROW_ALIGNMENT=${toString cachelineBytes}"
++ optional (L3SizeKB != null) "L3_SIZE_K=${toString L3SizeKB}"
++ optional (enableManualDist) "DIST_SET=1"
++ optional (enableManualDist) "NBG_X=${toString nbgx}"
++ optional (enableManualDist) "NBG_Y=${toString nbgy}"
++ optional (enableManualDist) "NBG_Z=${toString nbgz}"
++ optional (nblx != null) "NBL_X=${toString nblx}"
++ optional (nbly != null) "NBL_Y=${toString nbly}"
++ optional (nblz != null) "NBL_Z=${toString nblz}"
++ optional (nsteps != null) "NSTEPS=${toString nsteps}"
++ optional (numComm != null) "NUM_COMM=${toString numComm}"
++ optional (enableVectFlags) "VECT_CHECKS=1"
++ optional (enableDebugFlags) "DEBUG_CHECKS=1"
++ optional (enableAsanFlags) "SANITIZE_CHECKS=1"
;
installPhase = ''
mkdir -p $out/lib
mkdir -p $out/bin
cp obj/libsaiphv2.so $out/lib/
cp bin/Heat3D_vect $out/bin/
'';
hardeningDisable = [ "all" ];
}

View File

@ -1,10 +0,0 @@
{
# Auto-generated with garlic-git-table on 2021-04-19 for repo:
# ssh://git@bscpm03.bsc.es/garlic/apps/saiph.git
"garlic/mpi+isend+omp+fork+simd" = "96823846b327b6860f05d428f0cd5ed8ca537a0e";
"garlic/mpi+isend+omp+task+simd" = "de0346a559120f561bff554aa86b34d01214b714";
"garlic/mpi+isend+seq+simd" = "1411dad765231f5d3cec9f621526583974232d42";
"garlic/tampi+isend+omp+task+simd" = "587a7651df8eb69cae4a79bdfc5cb7f50723f3ce";
"garlic/tampi+isend+oss+task+simd" = "3731197d3e35df248fa6bdb7e4cb05c5dd4f2597";
}

View File

@ -1,31 +0,0 @@
{
stdenv
, fig
}:
stdenv.mkDerivation {
name = "report.tar.gz";
src = ./report;
buildPhase = ''
pwd
ls -l
grep -o '@[^ @]*@' report.tex | sed 's/@//g' | sort -u > list
echo "fig:" > fun.nix
echo "'''" >> fun.nix
for line in $(cat list); do
localPath=$(echo $line | tr '.' '/')
echo "mkdir -p $localPath" >> fun.nix
echo "cp -r \''${$line}/* $localPath" >> fun.nix
echo "sed -i 's;@$line@;$localPath;g' report.tex" >> fun.nix
done
echo "'''" >> fun.nix
echo " ---------- this is the fun.nix -------------"
cat fun.nix
echo " --------------------------------------------"
'';
installPhase = ''
cp fun.nix $out
'';
}

View File

@ -1 +0,0 @@
import ../default.nix

View File

@ -1,58 +0,0 @@
{
stdenv
, bash
, bashInteractive
, busybox
, extraInputs ? []
}:
let
inputrc = ./inputrc;
in
stdenv.mkDerivation {
name = "develop";
preferLocalBuild = true;
phases = [ "installPhase" ];
buildInputs = extraInputs ++ [ busybox ];
installPhase = ''
cat > $out <<EOF
#!${bash}/bin/bash
# This program loads a environment with the given programs available.
# Requires /nix to be available.
curdir="\$(pwd)"
export "buildInputs=$buildInputs"
# ${stdenv}
export "PATH=$PATH"
export "out=/fake-output-directory"
export NIX_BUILD_TOP=.
export NIX_STORE=/nix/store
export PS1='\[\033[1;32m\]develop\$\[\033[0m\] '
export TMUX_TMPDIR=/tmp
export TMPDIR=/tmp
export TEMPDIR=/tmp
export TMP=/tmp
export TEMP=/tmp
export LANG=en_US.UTF-8
source ${stdenv}/setup
# Access to bin and nix tools for srun, as it keeps the PATH
export "PATH=\$PATH:/bin"
export "PATH=$PATH:/gpfs/projects/bsc15/nix/bin"
export "SHELL=${bashInteractive}/bin/bash"
export HISTFILE="\$curdir/.histfile"
export INPUTRC=${inputrc}
if [[ -z "\$@" ]]; then
exec ${bashInteractive}/bin/bash
else
exec "\$@"
fi
EOF
chmod +x $out
'';
}

View File

@ -1,37 +0,0 @@
# inputrc borrowed from CentOS (RHEL).
set bell-style none
set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
set colored-stats on
#set mark-symlinked-directories on
$if mode=emacs
# for linux console and RH/Debian xterm
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word
# for rxvt
"\e[8~": end-of-line
# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
"\eOH": beginning-of-line
"\eOF": end-of-line
# for freebsd console
"\e[H": beginning-of-line
"\e[F": end-of-line
$endif

View File

@ -1,6 +0,0 @@
*.utf8
*.ascii
*.html
*.pdf
grohtml*
doc.tar.gz

View File

@ -1,42 +0,0 @@
all: ug.pdf ug.html
TTYOPT=-rPO=4m -rLL=72m
PDFOPT=-dpaper=a4 -rPO=4c -rLL=13c
#MMOPT=-dpaper=a4 -rpo=5c -rll=13c
PREPROC=-k -t -p -R
POSTPROC=
REGISTERS=-dcurdate="`date '+%Y-%m-%d'`"
REGISTERS+=-dgitcommit="`git rev-parse HEAD`"
PREPROC+=$(REGISTERS)
HTML_OPT=$(PREPROC) -P-Dimg -P-i120 -Thtml
# Embed fonts?
#POSTPROC+=-P -e
blackbox.pdf: blackbox.ms Makefile
REFER=ref.i groff -ms $(PREPROC) -dpaper=a4 -rPO=2c -rLL=17c -Tpdf $< > $@
%.html: %.ms Makefile
mkdir -p img
REFER=ref.i groff -ms -mwww $(HTML_OPT) $< > $@
echo $(HTML_OPT)
sed -i '/<\/head>/i<link rel="stylesheet" href="s.css">' $@
sed -i 's/^<a name="\([^"]*\)"><\/a>/<a name="\1" href="#\1">\&sect;<\/a>/g' $@
#sed -i '/<h1 /,/<hr>/s/^<a href="#[0-9]\+\.[0-9]\+\.[0-9]\+.*//' $@
sed -i '/<h1 /,/<hr>/s/^<a href="#[0-9]\+\.[0-9]\+.*//' $@
%.pdf: %.ms Makefile
REFER=ref.i groff -ms -mwww $(PREPROC) $(PDFOPT) -Tpdf $< > $@
-killall -HUP mupdf
%.utf8: %.ms
REFER=ref.i groff -ms -mwww $(PREPROC) $(TTYOPT) -Tutf8 $^ > $@
%.ascii: %.ms
REFER=ref.i groff -ms -mwww -c $(PREPROC) $(TTYOPT) -Tascii $^ > $@
doc.tar.gz: ug.pdf ug.html s.css
tar czf $@ $^ img s.css
clean:
rm -rf img ug.pdf ug.html doc.tar.gz

View File

@ -1,40 +0,0 @@
.\" Use helvetica family
.fam H
.PS
moveht=0.1
boxwid=1
sht=boxht + 0.1
hspace = boxwid + 0.2
right
G: [
boxwid=1
extrawid=1.8
right
A: box "nix"; arrow;
B1: box wid extrawid "App source code" "PM branch, defines...";
move to (A.sw.x, A.y - boxht - moveht)
A: box "garlic/nix"; arrow;
B2: box wid extrawid "App run config" "Input size, algorithm...";
move to (A.sw.x, A.y - boxht - moveht)
A: box "garlic/nix"; arrow;
B3: box wid extrawid "Build config" "MPI impl, O3, CC version...";
move to (A.sw.x, A.y - boxht - moveht)
A: box "garlic/nix"; arrow;
B4: box wid extrawid "Run config" "Nodes, affinity";
move to (A.sw.x, A.y - boxht - moveht)
A: box "MN4"; arrow;
B5: box wid extrawid "Hardware" "Cache size, intercomm...";
]
movewid=1
move
circlerad=0.4
E: circle "Execution"
arrow
box "Result"
rspline = 0.5
arrow from G.B1.e to E chop 0 chop circlerad
arrow from G.B2.e to E chop 0 chop circlerad
arrow from G.B3.e to E chop 0 chop circlerad
arrow from G.B4.e to E chop 0 chop circlerad
arrow from G.B5.e to E chop 0 chop circlerad
.PE

View File

@ -1,22 +0,0 @@
.\".fam CMU
.\".TL
.\"Garlic: git branch name
.\".AU
.\"Rodrigo Arias Mallo
.\".AI
.\"Barcelona Supercomputing Center
.\"#####################################################################
.nr GROWPS 3
.nr PSINCR 1.5p
.\".nr PD 0.5m
.nr PI 2m
\".2C
.\"#####################################################################
\".NH 1
\"Instructions
\".LP
\"To name a branch of a program, please follow the flowchart below.
.ps -2
.PS 5/25.4
copy "gitbranch.pic"
.PE

View File

@ -1,254 +0,0 @@
.TL
Garlic: the execution pipeline
.AU
Rodrigo Arias Mallo
.AI
Barcelona Supercomputing Center
.AB
.LP
This document covers the execution of experiments in the Garlic
benchmark, which are performed under strict conditions. The several
stages of the execution are documented so the experimenter can have a
global overview of how the benchmark runs under the hood.
The results of the experiment are stored in a known path to be used in
posterior processing steps.
.AE
.\"#####################################################################
.nr GROWPS 3
.nr PSINCR 1.5p
.\".nr PD 0.5m
.nr PI 2m
\".2C
.\"#####################################################################
.NH 1
Introduction
.LP
Every experiment in the Garlic
benchmark is controlled by a single
.I nix
file placed in the
.CW garlic/exp
subdirectory.
Experiments are formed by several
.I "experimental units"
or simply
.I units .
A unit is the result of each unique configuration of the experiment
(typically involves the cartesian product of all factors) and
consists of several shell scripts executed sequentially to setup the
.I "execution environment" ,
which finally launch the actual program being analyzed.
The scripts that prepare the environment and the program itself are
called the
.I stages
of the execution and altogether form the
.I "execution pipeline"
or simply the
.I pipeline .
The experimenter must know with very good details all the stages
involved in the pipeline, as they have a large impact on the execution.
.PP
Additionally, the execution time is impacted by the target machine in
which the experiments run. The software used for the benchmark is
carefully configured and tuned for the hardware used in the execution;
in particular, the experiments are designed to run in MareNostrum 4
cluster with the SLURM workload manager and the Omni-Path
interconnection network. In the future we plan to add
support for other clusters in order to execute the experiments in other
machines.
.\"#####################################################################
.NH 1
Isolation
.LP
The benchmark is designed so that both the compilation of every software
package and the execution of the experiment is performed under strict
conditions. We can ensure that two executions of the same experiment are
actually running the same program in the same software environment.
.PP
All the software used by an experiment is included in the
.I "nix store"
which is, by convention, located at the
.CW /nix
directory. Unfortunately, it is common for libraries to try to load
software from other paths like
.CW /usr
or
.CW /lib .
It is also common that configuration files are loaded from
.CW /etc
and from the home directory of the user that runs the experiment.
Additionally, some environment variables are recognized by the libraries
used in the experiment, which change their behavior. As we cannot
control the software and configuration files in those directories, we
couldn't guarantee that the execution behaves as intended.
.PP
In order to avoid this problem, we create a
.I sandbox
where only the files in the nix store are available (with some other
exceptions). Therefore, even if the libraries try to access any path
outside the nix store, they will find that the files are not there
anymore. Additionally, the environment variables are cleared before
entering the environment (with some exceptions as well).
.\"#####################################################################
.NH 1
Execution pipeline
.LP
Several predefined stages form the
.I standard
execution pipeline and are defined in the
.I stdPipeline
array. The standard pipeline prepares the resources and the environment
to run a program (usually in parallel) in the compute nodes. It is
divided in two main parts:
connecting to the target machine to submit a job and executing the job.
Finally, the complete execution pipeline ends by running the actual
program, which is not part of the standard pipeline, as should be
defined differently for each program.
.NH 2
Job submission
.LP
Some stages are involved in the job submission: the
.I trebuchet
stage connects via
.I ssh
to the target machine and executes the next stage there. Once in the
target machine, the
.I runexp
stage computes the output path to store the experiment results, using
the user in the target machine and changes the working directory there.
In MareNostrum 4 the output path is at
.CW /gpfs/projects/bsc15/garlic/$user/out .
Then the
.I isolate
stage is executed to enter the sandbox and the
.I experiment
stage begins, which creates a directory to store the experiment output,
and launches several
.I unit
stages.
.PP
Each unit executes a
.I sbatch
stage which runs the
.I sbatch(1)
program with a job script that simply calls the next stage. The
sbatch program internally reads the
.CW /etc/slurm/slurm.conf
file from outside the sandbox, so we must explicitly allow this file to
be available, as well as the
.I munge
socket used for authentication by the SLURM daemon. Once the jobs are
submitted to SLURM, the experiment stage ends and the trebuchet finishes
the execution. The jobs will be queued for execution without any other
intervention from the user.
.PP
The rationale behind running sbatch from the sandbox is because the
options provided in environment variables override the options from the
job script. Therefore, we avoid this problem by running sbatch from the
sandbox, where the interfering environment variables are removed. The
sbatch program is also provided in the
.I "nix store" ,
with a version compatible with the SLURM daemon running in the target
machine.
.NH 2
Job execution
.LP
Once an unit job has been selected for execution, SLURM
allocates the resources (usually several nodes) and then selects one of
the nodes to run the job script: it is not executed in parallel yet.
The job script runs from a child process forked from on of the SLURM
daemon processes, which are outside the sandbox. Therefore, we first run the
.I isolate
stage
to enter the sandbox again.
.PP
The next stage is called
.I control
and determines if enough data has been generated by the experiment unit
or if it should continue repeating the execution. At the current time,
it is only implemented as a simple loop that runs the next stage a fixed
amount of times (by default, it is repeated 30 times).
.PP
The following stage is
.I srun
which launches several copies of the next stage to run in
parallel (when using more than one task). Runs one copy per task,
effectively creating one process per task. The CPUs affinity is
configured by the parameter
.I --cpu-bind
and is important to set it correctly (see more details in the
.I srun(1)
manual). Appending the
.I verbose
value to the cpu bind option causes srun to print the assigned affinity
of each task, which is very valuable when examining the execution log.
.PP
The mechanism by which srun executes multiple processes is the same used
by sbatch, it forks from a SLURM daemon running in the computing nodes.
Therefore, the execution begins outside the sandbox. The next stage is
.I isolate
which enters again the sandbox in every task. All remaining stages are
running now in parallel.
.\" ###################################################################
.NH 2
The program
.LP
At this point in the execution, the standard pipeline has been
completely executed, and we are ready to run the actual program that is
the matter of the experiment. Usually, programs require some arguments
to be passed in the command line. The
.I exec
stage sets the arguments (and optionally some environment variables) and
executes the last stage, the
.I program .
.PP
The experimenters are required to define these last stages, as they
define the specific way in which the program must be executed.
Additional stages may be included before or after the program run, so
they can perform additional steps.
.\" ###################################################################
.NH 2
Stage overview
.LP
The complete execution pipeline using the standard pipeline is shown in
the Table 1. Some properties are also reflected about the execution
stages.
.KF
.TS
center;
lB cB cB cB cB cB
l c c c c c.
_
Stage Target Safe Copies User Std
_
trebuchet xeon no no yes yes
runexp login no no yes yes
isolate login no no no yes
experiment login yes no no yes
unit login yes no no yes
sbatch login yes no no yes
_
isolate comp no no no yes
control comp yes no no yes
srun comp yes no no yes
isolate comp no yes no yes
_
exec comp yes yes no no
program comp yes yes no no
_
.TE
.QS
.B "Table 1" :
The stages of a complete execution pipeline. The
.B target
column determines where the stage is running,
.B safe
states if the stage begins the execution inside the sandbox,
.B user
if it can be executed directly by the user,
.B copies
if there are several instances running in parallel and
.B std
if is part of the standard execution pipeline.
.QE
.KE

View File

@ -1,152 +0,0 @@
#.ps -3
#.fam CMU
#.PS 4.5/25.4 # Scale drawing to 20/25.4 in =
# = 20/25.4[in]/25.4[mm/in] = 20 mm
# FLOWCHART - Basic flow chart blocks.
scale=25.4 #Scale units from inches to mm
csize=2.0 #Cell size in mm
pstricks=0
dx=0; dy=2;
define process
{[
box $1;
]}
# decision(): rhomboid -> if block
define decision {[
boxwid=boxwid*1.2
boxht=boxht*1.2
B: box invis $1;
line from B.n to B.e to B.s to B.w to B.n;
]}
#--- END OF MACROS ---
boxwid=30
fillval=1
circlerad=10
down
START: circle "Start"
arrow
D_MPIB: decision("MPI-based?")
arrow " Yes" ljust
D_TAMPI: decision("TAMPI?")
arrow " Yes" ljust
TAMPI: process("\fB+tampi\fP")
right
move to D_TAMPI.e
arrow "No" above
D_MPI: decision("MPI?")
down
move to D_MPI.s
arrow " Yes" ljust
MPI: process("\fB+mpi\fP")
move to TAMPI.s
A_TAMPI: arrow linewid
line from MPI.s to MPI.c - (0,boxht) \
to A_TAMPI.c
circle at A_TAMPI.c rad 0.7 filled
move at A_TAMPI
D_ISEND: decision("MPI_Isend()?")
arrow " Yes" ljust
ISEND: process("\fB+isend\fP")
A_ISEND: arrow
right
move to D_ISEND.e
arrow "No" above
D_SEND: decision("MPI_Send()?")
down
move to D_SEND.s
arrow " Yes" ljust
SEND: process("\fB+send\fP")
right
move to D_SEND.e
arrow "No" above
D_RMA: decision("MPI_Get()?")
down
move to D_RMA.s
arrow " Yes" ljust
RMA: process("\fB+rma\fP")
line "No" above from D_MPIB.w to D_MPIB.w - (boxwid,0)
line to (D_MPIB.w.x-boxwid, A_ISEND.c.y) \
to A_ISEND.c
line from SEND.s to SEND.c - (0,boxht) \
to A_ISEND.c
line from RMA.s to RMA.c - (0,boxht) \
to SEND.c - (0,boxht)
circle at A_ISEND.c rad 0.7 filled
move at A_ISEND
D_MT: decision("multithread?")
arrow " Yes" ljust
D_OMP: decision("OpenMP?")
arrow " Yes" ljust
OMP: process("\fB+omp\fP")
right
move to D_OMP.e
arrow "No" above
D_OSS: decision("OmpSs-2?")
down
move to D_OSS.s
arrow " Yes" ljust
OSS: process("\fB+oss\fP")
down
move to OMP.s
A_OMP: arrow
circle at A_OMP.c rad 0.7 filled
line from OSS.s to OSS.c - (0,boxht) \
to A_OMP.c
move to A_OMP.s
D_FJ: decision("fork-join?")
arrow " Yes" ljust
FJ: process("\fB+fork\fP")
right
move to D_FJ.e
arrow "No" above
D_TASKFOR: decision("task for?")
arrow "No" above
down
move to D_TASKFOR.s
arrow " Yes" ljust
TASKFOR: process("\fB+taskfor\fP")
right
move to D_TASKFOR.e
arrow "No" above
D_TASK: decision("task model?")
down
move to D_TASK.s
arrow " Yes" ljust
TASK: process("\fB+task\fP")
move to FJ.s
A_FJ: arrow
circle at A_FJ.c rad 0.7 filled
line from TASKFOR.s to TASKFOR.c - (0,boxht) \
to A_FJ.c
line from TASK.s to TASK.c - (0,boxht) \
to TASKFOR.c - (0,boxht)
left
move to OMP.c - (boxwid,0)
SEQ: process("\fB+seq\fP")
line "No" above from D_MT.w to (SEQ.x, D_MT.w.y)
arrow to SEQ.n
line from SEQ.s to (SEQ.s.x, A_FJ.c.y) to A_FJ.c
down
move to A_FJ.s
D_SIMD: decision("SIMD opt.?")
move to D_SIMD.e
right
arrow "Yes" above
SIMD: process("\fB+simd\fP")
down
move to D_SIMD.s
arrow " No" ljust
END: circle "End"
circle radius circlerad*0.9 at END
arrow from SIMD.s to (SIMD.x, END.y) to END.e
# Error lines
ERR: circle "Error" at (TASK.x+boxwid, END.y)
circle radius circlerad*0.9 at ERR
line "No" above from D_TASK.e to (ERR.n.x,D_TASK.e.y)
line "No" above from D_OSS.e to (ERR.n.x,D_OSS.e.y)
line "No" above from D_RMA.e to (ERR.n.x,D_RMA.e.y)
line "No" above from D_MPI.e to (ERR.n.x,D_MPI.e.y)
arrow to ERR.n
#.PE

View File

@ -1,256 +0,0 @@
.TL
Garlic: the postprocess pipeline
.AU
Rodrigo Arias Mallo
.AI
Barcelona Supercomputing Center
.AB
.LP
This document covers the format used to store the results of the
execution of experiments and the postprocess steps used to generate a
set of figures from the results to present the data. The several stages
of the postprocess pipeline are documented to provide a general picture.
.AE
.\"#####################################################################
.nr GROWPS 3
.nr PSINCR 1.5p
.\".nr PD 0.5m
.nr PI 2m
.\".2C
.R1
bracket-label " [" ] ", "
accumulate
move-punctuation
.R2
.\"#####################################################################
.NH 1
Introduction
.LP
After the correct execution of an experiment the results are stored for
further investigation. Typically the time of the execution or other
quantities are measured and presented later in a figure (generally a
plot or a table). The
.I "postprocess pipeline"
consists of all the steps required to create a set of figures from the
results. Similarly to the execution pipeline where several stages run
sequentially,
.[
garlic execution
.]
the postprocess pipeline is also formed by multiple stages executed
in order.
.PP
The rationale behind dividing execution and postprocess is
that usually the experiments are costly to run (they take a long time to
complete) while generating a figure require less time. Refining the
figures multiple times reusing the same experimental results doesn't
require the execution of the complete experiment, so the experimenter
can try multiple ways to present the data without waiting a large delay.
.NH 1
Results
.LP
The results are generated in the same
.I "target"
machine where the experiment is executed and are stored in the garlic
\fCout\fP
directory, organized into a tree structure following the experiment
name, the unit name and the run number (governed by the
.I control
stage):
.DS L
\fC
|-- 6lp88vlj7m8hvvhpfz25p5mvvg7ycflb-experiment
| |-- 8lpmmfix52a8v7kfzkzih655awchl9f1-unit
| | |-- 1
| | | |-- stderr.log
| | | |-- stdout.log
| | | |-- ...
| | |-- 2
\&...
\fP
.DE
In order to provide an easier access to the results, an index is also
created by taking the
.I expName
and
.I unitName
attributes (defined in the experiment configuration) and linking them to
the appropriate experiment and unit directories. These links are
overwritten by the last experiment with the same names so they are only
valid for the last execution. The out and index directories are
placed into a per-user directory, as we cannot guarantee the complete
execution of each unit when multiple users share units.
.PP
The messages printed to
.I stdout
and
.I stderr
are stored in the log files with the same name inside each run
directory. Additional data is sometimes generated by the experiments,
and is found in each run directory. As the generated data can be very
large, is ignored by default when fetching the results.
.NH 1
Fetching the results
.LP
Consider a program of interest for which an experiment has been designed to
measure some properties that the experimenter wants to present in a
visual plot. When the experiment is launched, the execution
pipeline (EP) is completely executed and it will generate some
results. In this escenario, the execution pipeline depends on the
program\[em]any changes in the program will cause nix to build the
pipeline again
using the updated program. The results will also depend on the
execution pipeline as well as the postprocess pipeline (PP) and the plot
on the results. This chain of dependencies can be shown in the
following dependency graph:
.ie t \{\
.PS
circlerad=0.22;
linewid=0.3;
right
circle "Prog"
arrow
circle "EP"
arrow
circle "Result"
arrow
circle "PP"
arrow
circle "Plot"
.PE
.\}
.el \{\
.nf
Prog ---> EP ---> Result ---> PP ---> Plot
.fi
.\}
Ideally, the dependencies should be handled by nix, so it can detect any
change and rebuild the necessary parts automatically. Unfortunately, nix
is not able to build the result as a derivation directly, as it requires
access to the
.I "target"
machine with several user accounts. In order to let several users reuse
the same results from a shared cache, we would like to use the
.I "nix store" .
.PP
To generate the results from the
experiment, we add some extra steps that must be executed manually:
.PS
circle "Prog"
arrow
diag=linewid + circlerad;
far=circlerad*3 + linewid*4
E: circle "EP"
R: circle "Result" at E + (far,0)
RUN: circle "Run" at E + (diag,-diag) dashed
FETCH: circle "Fetch" at R + (-diag,-diag) dashed
move to R.e
arrow
P: circle "PP"
arrow
circle "Plot"
arrow dashed from E to RUN chop
arrow dashed from RUN to FETCH chop
arrow dashed from FETCH to R chop
arrow from E to R chop
.PE
The run and fetch steps are provided by the helper tool
.I "garlic(1)" ,
which launches the experiment using the user credentials at the
.I "target"
machine and then fetches the results, placing them in a directory known
by nix. When the result derivation needs to be built, nix will look in
this directory for the results of the execution. If the directory is not
found, a message is printed to suggest the user to launch the experiment
and the build process is stopped. When the result is successfully built
by any user, is stored in the
.I "nix store"
and it won't need to be rebuilt again until the experiment changes, as
the hash only depends on the experiment and not on the contents of the
results.
.PP
Notice that this mechanism violates the deterministic nature of the nix
store, as from a given input (the experiment) we can generate different
outputs (each result from different executions). We knowingly relaxed
this restriction by providing a guarantee that the results are
equivalent and there is no need to execute an experiment more than once.
.PP
To force the execution of an experiment you can use the
.I rev
attribute which is a number assigned to each experiment
and can be incremented to create copies that only differs on that
number. The experiment hash will change but the experiment will be the
same, as long as the revision number is ignored along the execution
stages.
.NH 1
Postprocess stages
.LP
Once the results are completely generated in the
.I "target"
machine there are several stages required to build a set of figures:
.PP
.I fetch \[em]
waits until all the experiment units are completed and then executes the
next stage. This stage is performed by the
.I garlic(1)
tool using the
.I -F
option and also reports the current state of the execution.
.PP
.I store \[em]
copies from the
.I target
machine into the nix store all log files generated by the experiment,
keeping the same directory structure. It tracks the execution state of
each unit and only copies the results once the experiment is complete.
Other files are ignored as they are often very large and not required
for the subsequent stages.
.PP
.I timetable \[em]
converts the results of the experiment into a NDJSON file with one
line per run for each unit. Each line is a valid JSON object, containing
the
.I exp ,
.I unit
and
.I run
keys and the unit configuration (as a JSON object) in the
.I config
key. The execution time is captured from the standard output and is
added in the
.I time
key.
.PP
.I merge \[em]
one or more timetable datasets are joined, by simply concatenating them.
This step allows building one dataset to compare multiple experiments in
the same figure.
.PP
.I rPlot \[em]
one ot more figures are generated by a single R script
.[
r cookbook
.]
which takes as input the previously generated dataset.
The path of the dataset is recorded in the figure as well, which
contains enough information to determine all the stages in the execution
and postprocess pipelines.
.SH 1
Appendix A: Current setup
.LP
As of this moment, the
.I build
machine which contains the nix store is
.I xeon07
and the
.I "target"
machine used to run the experiments is Mare Nostrum 4 with the
.I output
directory placed at
.CW /gpfs/projects/bsc15/garlic .
By default, the experiment results are never deleted from the
.I target
so you may want to remove the ones already stored in the nix store to
free space.

View File

@ -1,9 +0,0 @@
%A Rodrigo Arias Mallo
%D 2020
%T Garlic: the execution pipeline
%A Winston Chang
%T R Graphics Cookbook: Practical Recipes for Visualizing Data
%D 2020
%I O'Reilly Media
%O 2nd edition

View File

@ -1,19 +0,0 @@
html {
line-height: 1.6;
margin-bottom: 50px;
padding-bottom: 80px;
}
body {
max-width: 700px;
text-align: justify;
margin:0 auto;
}
pre {
overflow: auto;
display: block;
padding: 3px 3px;
line-height: 1.4;
background-color: #eeeeee;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,181 +0,0 @@
.\"usage: NS title
.EQ
delim $$
.EN
.de NS \" New Slide
.SK
.ev gp-top
.fam H
.vs 1.5m
.ll \\n[@ll]u
.lt \\n[@ll]u
.rs
.sp 2v
.ps +5
\\$*
.ps -5
.sp 1.5v
.br
.ev
..
.\" Remove headers
.de TP
..
.\" Bigger page number in footer
.de EOP
.fam H
.ps +2
. ie o .tl \\*[pg*odd-footer]
. el .tl \\*[pg*even-footer]
. ds hd*format \\g[P]
. af P 0
. ie (\\n[P]=1)&(\\n[N]=1) .tl \\*[pg*header]
. el .tl \\*[pg*footer]
. af P \\*[hd*format]
. tl ''\\*[Pg_type!\\n[@copy_type]]''
..
.\" Remove top and bottom margin
.VM 0 0
.\"
.\"
.\" Set virtual page dimensions for a physical size of 16x12 cm
.PGFORM 14c 12c 1c 1
.ND "January 14, 2021"
.\" .vs 1.5m
.S C 1.5m
.fam H
.\".PH "'cosas'''"
.COVER ms
.de cov@print-date
.DS C
.fam H
.B
\\*[cov*new-date]
.DE
..
.TL
.ps 20
.fam H
Garlic experiments
.AF "Barcelona Supercomputing Center"
.AU "Rodrigo Arias Mallo"
.COVEND
.PF "'''%'"
.\" Turn off justification
.SA 0
.\".PF '''%'
.\"==================================================================
.NS "Approach 1"
This was the approach proposed for hybrids PM
.BL
.LI
Perform a granularity experiment with a \fIreasonable\fP problem size.
.LI
Take the best blocksize
.LI
Analyze strong and weak scaling with that blocksize.
.LI
Plot speedup and efficiency comparing multiple PM.
.LE 1
The main problem is that it may lead to \fBbogus comparisons\fP.
Additionally, there is no guarantee that the best blocksize is the one
that performs better with more resources.
.\"==================================================================
.NS "Approach 2"
We want to measure scalability of the application \fBonly\fP, not mixed
with runtime overhead or lack of parallelism.
.P
We define \fBsaturation\fP as the state of an execution that allows a
program to potentially use all the resources (the name comes from the
transistor state, when current flows freely).
.P
Design a new experiment which tests multiple blocksizes and multiple
input sizes to find these states: \fBthe saturation experiment\fP.
.P
Begin with small problems and increase the size, so you get to the
answer quickly.
.\"==================================================================
.NS "Saturation experiment"
.2C
\X'pdf: pdfpic sat.png.tk.pdf -R 7c'
.NCOL
.S -1 -3
.BL 1m
.LI
The objetive is to find the minimum input size that allows us to get
meaningful scalability results.
.LI
More precisely, a unit is in \fBsaturation state\fP if the median time
is below the \fBsaturation time limit\fP, currently set to 110% the minimum
median time (red dashed lines).
.LI
An input size is in \fBsaturation zone\fP if it allows at least K=3
consecutive points in the saturation state.
.LI
With less than 512 particles/CPU (green line) we cannot be sure that the
performance is not impacted by the runtime overhead or lack of
parallelism.
.LE
.S P P
.1C
.\"==================================================================
.NS "Experiment space"
.2C
\X'pdf: pdfpic scaling-region.svg.tk.pdf -L 7c'
.NCOL
.S -1 -3
.BL 1m
.LI
\fBSaturation limit\fP: small tasks cannot be solved without overhead
from the runtime, no matter the blocksize.
.LI
Different limits for OmpSs-2 and OpenMP.
.LI
Experiment A will show the scaling of the app while in the saturation
zone.
.LI
Experiment B will show that OpenMP scales bad in the last 2 points.
.LI
Experiment C will show that at some point both OpenMP and OmpSs-2 scale
bad.
.LE
.S P P
.1C
.\"==================================================================
.NS "Experiment space: experiment C"
.2C
\X'pdf: pdfpic scalability.svg.tk.pdf -L 7c'
.NCOL
.BL 1m
.LI
The experiment C will show a difference in performance when approached
to the saturation limit.
.LI
We could say that OmpSs-2 introduces less overhead, therefore allows
better scalability.
.LE
.1C
.\"==================================================================
.NS "Reproducibility"
How easy can we get the same results? Three properties R0 < R1 < R2 (no common nomenclature yet!):
.BL 1m
.LI
R0: \fBSame\fP humans on the \fBsame\fP machine obtain the same result
.LI
R1: \fBDifferent\fP humans on the \fBsame\fP machine obtain the same result
.LI
R2: \fBDifferent\fP humans on a \fBdifferent\fP machine obtain same result
.LE
.P
Garlic provides 2 types of properties: for software and for experimental
results:
.BL 1m
.LI
Software is R2: you can get the exact same software by any one, in any
machine
.LI
Experimental results are R1: you cannot change the machine MN4 (yet)
.LE
.P
Same experimental result means that the mean of your results is in the confidence
interval of our results \fBand the relative std is < 1%\fP.

Binary file not shown.

View File

@ -1,29 +0,0 @@
GENFIG=scaling-region.svg.tk.pdf \
sat.png.tk.pdf \
scalability.svg.tk.pdf
GENPDF=2.pdf 3.pdf
all: $(GENPDF)
keep_figs: $(GENFIG)
%.svg.pdf: %.svg Makefile
inkscape $< --export-pdf=$@
%.png.pdf: %.png Makefile
gm convert $< -density 30 $@
%.tk.pdf: %.pdf Makefile
pdftk $< output $@
%.pdf: %.mm $(GENFIG)
groff -Tpdf -e -t -p -P-p12c,16c -mm $< > $@
-killall -HUP mupdf
watch:
while [ 1 ]; do inotifywait -e modify *; make; done
.PRECIOUS: *.svg.pdf *.tk.pdf
clean:
rm -f $(GENFIG) $(GENPDF)

View File

@ -1,479 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1280"
height="720"
viewBox="0 0 338.66667 190.5"
version="1.1"
id="svg8"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
sodipodi:docname="overview.svg">
<defs
id="defs2">
<inkscape:path-effect
effect="spiro"
id="path-effect1043"
is_visible="true"
lpeversion="1" />
<inkscape:path-effect
effect="spiro"
id="path-effect1015"
is_visible="true"
lpeversion="1" />
<inkscape:path-effect
effect="spiro"
id="path-effect942"
is_visible="true"
lpeversion="0" />
<inkscape:path-effect
effect="spiro"
id="path-effect946"
is_visible="true"
lpeversion="0" />
<inkscape:path-effect
effect="spiro"
id="path-effect950"
is_visible="true"
lpeversion="0" />
<inkscape:path-effect
effect="spiro"
id="path-effect954"
is_visible="true"
lpeversion="0" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.98994949"
inkscape:cx="650.6739"
inkscape:cy="347.57627"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
units="px"
inkscape:window-width="1914"
inkscape:window-height="1025"
inkscape:window-x="0"
inkscape:window-y="24"
inkscape:window-maximized="1"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true">
<inkscape:grid
type="xygrid"
id="grid1071" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-size:11.2889px;line-height:1.25;font-family:'Linux Libertine';-inkscape-font-specification:'Linux Libertine, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="119.66053"
y="23.383175"
id="text12"><tspan
sodipodi:role="line"
id="tspan10"
x="119.66053"
y="23.383175"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.2889px;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;stroke-width:0.264583">Garlic overview</tspan></text>
<text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:'Linux Libertine';-inkscape-font-specification:'Linux Libertine, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="234.71022"
y="112.26602"
id="text1019"><tspan
sodipodi:role="line"
id="tspan1017"
x="234.71022"
y="112.26602"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46667px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583">bscpkgs</tspan></text>
<text
xml:space="preserve"
style="font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="235.14818"
y="99.37706"
id="text1023"><tspan
sodipodi:role="line"
id="tspan1021"
x="235.14818"
y="99.37706"
style="stroke-width:0.264583" /></text>
<text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="22.981543"
y="40.828518"
id="text1027"><tspan
sodipodi:role="line"
id="tspan1025"
x="22.981543"
y="40.828518"
style="font-size:8.46667px;stroke-width:0.264583">Isolation</tspan></text>
<text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="235.41302"
y="141.11386"
id="text1031"><tspan
sodipodi:role="line"
id="tspan1029"
x="235.41302"
y="141.11386"
style="stroke-width:0.264583">Apps</tspan></text>
<text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="22.981543"
y="98.77639"
id="text1035"><tspan
sodipodi:role="line"
id="tspan1033"
x="22.981543"
y="98.77639"
style="stroke-width:0.264583">Postprocess</tspan></text>
<text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="22.981543"
y="128.14102"
id="text1039"><tspan
sodipodi:role="line"
id="tspan1037"
x="22.981543"
y="128.14102"
style="stroke-width:0.264583">Replicable</tspan></text>
<g
id="g939"
transform="matrix(0.83871913,0,0,0.83871913,126.82493,-113.88842)">
<path
style="opacity:1;fill:#71c837;fill-opacity:1;stroke:none;stroke-width:0.252538;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 35.855789,282.06376 c -4.85096,-1.86589 -9.321157,-5.5573 -12.052686,-9.95291 -1.42608,-2.29485 -2.550183,-5.13416 -3.142218,-7.93675 -0.468005,-2.21545 -0.584044,-5.74948 -0.261382,-7.96055 0.751234,-5.14793 3.001156,-9.88538 6.376496,-13.42641 1.064876,-1.11715 1.141312,-1.23333 0.967644,-1.47084 -0.180189,-0.24642 -0.218712,-0.22848 -0.867441,0.40409 -2.541844,2.4785 -4.781497,6.13785 -6.015517,9.8287 -2.151697,6.43554 -1.660797,12.92798 1.44394,19.09701 2.373529,4.71614 5.881378,8.24463 10.798715,10.86225 l 1.469982,0.78252 -0.947613,-0.075 c -1.18859,-0.0941 -3.165274,-0.59068 -4.535339,-1.13928 -2.14739,-0.85986 -4.899448,-2.77408 -7.344667,-5.10867 -4.3499,-4.1531 -7.205196,-9.05097 -8.004667,-13.7309 -0.27279,-1.59685 -0.278638,-4.42186 -0.0123,-5.94906 0.477293,-2.73701 1.939155,-6.11115 3.97591,-9.17685 2.546688,-3.83325 4.620429,-5.89727 10.387406,-10.3387 3.493318,-2.69038 4.736076,-3.72889 6.15496,-5.14339 3.568843,-3.55782 6.467152,-8.6731 7.339454,-12.95356 0.148482,-0.72861 0.269968,-1.50206 0.269968,-1.71878 0,-0.39331 0.0019,-0.39417 0.968851,-0.46738 1.365353,-0.10337 3.052225,-0.70711 4.744035,-1.69791 l 0.701582,-0.41089 0.0026,1.5061 c 0.0045,2.60243 0.476784,5.34744 1.339734,7.78693 1.52088,4.2994 4.18253,7.41948 11.62023,13.62161 4.276695,3.56624 7.746677,6.95204 9.117036,8.89585 2.259996,3.20572 3.348103,6.20096 3.568194,9.82215 0.595117,9.79157 -3.768748,17.911 -12.44142,23.14856 -1.296532,0.78299 -3.637803,1.90233 -3.985585,1.90546 -0.110249,10e-4 0.150921,-0.21006 0.580377,-0.46902 5.436653,-3.27826 9.475507,-9.15074 10.803453,-15.70819 0.267552,-1.32118 0.309211,-1.92299 0.309211,-4.46686 0,-2.53757 -0.042,-3.14727 -0.306856,-4.45455 -1.060807,-5.23597 -3.854233,-10.15023 -7.65502,-13.4669 -0.618908,-0.54008 -1.155922,-0.98329 -1.193366,-0.98492 -0.03745,-0.002 -0.139946,0.11212 -0.227777,0.25276 -0.141502,0.22658 -0.07607,0.32023 0.574336,0.82202 2.259362,1.74308 4.915725,5.31474 6.310574,8.48498 2.018451,4.58759 2.502477,9.49237 1.415167,14.34033 -1.629156,7.26389 -6.611462,13.30354 -13.416428,16.26369 -1.085205,0.47206 -1.217885,0.49706 -2.973134,0.56011 l -1.837235,0.066 1.006237,-2.07559 c 2.368455,-4.8854 3.538316,-10.024 3.535808,-15.5308 -0.0027,-5.88707 -1.061958,-10.50484 -5.157827,-22.48487 -0.6345,-1.85585 -1.191602,-3.37335 -1.237999,-3.37223 -0.0464,0.001 -0.17008,0.0563 -0.274844,0.1226 -0.156832,0.0993 0.130482,1.08447 1.626465,5.57721 2.644622,7.94233 3.529431,11.22265 4.132003,15.31894 0.372002,2.52887 0.400976,6.90859 0.06118,9.24748 -0.627637,4.32015 -1.762573,7.98369 -3.564128,11.5049 -0.508662,0.9942 -0.719381,1.53437 -0.616966,1.58158 0.08555,0.0394 -0.686359,0.0277 -1.715347,-0.0261 -1.028986,-0.0538 -2.81859,-0.0876 -3.976896,-0.0751 -1.158304,0.0125 -2.076599,-0.0249 -2.04065,-0.0831 0.03595,-0.0582 -0.513096,-0.57953 -1.220099,-1.15859 -5.871245,-4.80873 -8.903676,-12.46261 -8.334531,-21.0364 0.514302,-7.74762 3.570269,-16.48358 8.451646,-24.16033 0.756092,-1.18908 0.878686,-1.62601 0.456232,-1.62601 -0.269476,0 -2.187459,3.11792 -3.581049,5.82143 -6.527942,12.66396 -7.778054,24.87321 -3.460077,33.79294 1.354494,2.79801 3.875849,5.96086 6.265727,7.85989 l 0.882295,0.70108 -1.131244,0.087 c -2.28504,0.17566 -3.206655,0.12456 -4.125092,-0.22871 z"
id="path1121"
inkscape:connector-curvature="0" />
<path
style="opacity:1;fill:none;stroke:#000000;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 48.867489,212.94095 c 0,0 -0.86438,7.76605 2.713226,13.63584 6.494115,10.65492 22.215215,15.10271 22.945555,29.57717 0.73034,14.47445 -8.97919,21.92729 -15.29676,24.84412 -6.317568,2.91683 -10.522303,1.607 -14.936018,1.58965 -4.413716,-0.0174 -11.542077,1.89608 -18.275069,-2.46922 -6.732992,-4.36531 -17.7526266,-15.9095 -10.997271,-29.49573 6.755356,-13.58623 16.532136,-14.09272 22.847212,-24.4691 3.894154,-6.39853 3.425017,-10.20633 3.425017,-10.20633"
id="path115"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cszzzzzsc" />
<path
style="opacity:1;fill:none;stroke:#000000;stroke-width:1.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 41.293381,215.94735 c 0,0 1.628798,0.38316 4.106055,-0.68681 2.477257,-1.06997 3.458673,-2.01071 3.468053,-2.31959 0.01165,-0.38377 -2.218113,-0.51799 -4.760631,0.84257 -2.542518,1.36055 -2.815487,1.75415 -2.813477,2.16383 z"
id="path932"
inkscape:connector-curvature="0"
sodipodi:nodetypes="szszs" />
<path
style="opacity:1;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 96.572915,115.66592 c 3.453405,-6.0297 5.055035,-13.10355 4.535715,-20.032736 -0.39271,-5.239899 -1.955101,-10.314508 -3.590774,-15.308037 -0.858872,-2.622043 -1.740862,-5.236513 -2.645833,-7.843004"
id="path940"
inkscape:connector-curvature="0"
inkscape:path-effect="#path-effect942"
inkscape:original-d="m 96.572915,115.66592 c 1.512171,-6.67784 3.024074,-13.35542 4.535715,-20.032736 1.51164,-6.677316 -2.393584,-10.205622 -3.590774,-15.308037 -1.197189,-5.102413 -1.763625,-5.228934 -2.645833,-7.843004"
transform="translate(-47.04174,166.51122)" />
<path
style="opacity:1;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 88.162945,67.662944 c -3.064224,4.547552 -5.489214,9.525165 -7.181547,14.741074 -1.328054,4.09317 -2.208726,8.359616 -2.235731,12.662759 -0.02701,4.303143 0.823506,8.651583 2.802696,12.472653 1.648228,3.18211 4.067739,5.96128 6.992559,8.032"
id="path944"
inkscape:connector-curvature="0"
inkscape:path-effect="#path-effect946"
inkscape:original-d="m 88.162945,67.662944 c -2.015609,4.976424 -5.165409,9.764121 -7.181547,14.741074 -2.016138,4.97695 0.378241,16.756679 0.566965,25.135412 0.188722,8.37874 4.661969,5.3544 6.992559,8.032"
sodipodi:nodetypes="cssc"
transform="translate(-47.04174,166.51122)" />
<path
style="opacity:1;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 74.744792,74.844492 c -5.08443,4.722113 -8.015278,11.678462 -7.843007,18.615327 0.124172,5.000037 1.820316,9.949651 4.788964,13.974931 2.968648,4.02529 7.196284,7.10792 11.936482,8.70364"
id="path948"
inkscape:connector-curvature="0"
inkscape:path-effect="#path-effect950"
inkscape:original-d="m 74.744792,74.844492 c -2.897553,5.417394 -4.944925,13.197404 -7.843007,18.615327 -2.898081,5.417923 11.402546,13.732871 16.725446,22.678571"
sodipodi:nodetypes="csc"
transform="translate(-47.04174,166.51122)" />
<path
style="opacity:1;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 106.91469,75.255709 c 5.52653,4.277036 8.97564,11.122946 9.124,18.109618 0.1032,4.860277 -1.34637,9.741783 -4.08548,13.758033 -2.73912,4.01624 -6.75454,7.14782 -11.31705,8.82604"
id="path952"
inkscape:connector-curvature="0"
inkscape:path-effect="#path-effect954"
inkscape:original-d="m 106.91469,75.255709 c 2.5516,4.944922 6.57292,13.164164 9.124,18.109618 2.55107,4.945451 -10.26809,15.055783 -15.40253,22.584073"
sodipodi:nodetypes="ccc"
transform="translate(-47.04174,166.51122)" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 46.507366,283.1457 c -0.0079,0.37985 0.887358,0.72396 1.120981,1.53188 0.191658,0.66279 -0.270534,1.84628 -0.270534,1.84628 0,0 0.282724,-1.19113 0.01191,-1.83123 -0.270812,-0.64011 -1.689183,-1.6178 -1.689183,-1.6178"
id="path1082"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csczc" />
<path
sodipodi:nodetypes="csczc"
inkscape:connector-curvature="0"
id="path1084"
d="m 43.483556,283.02758 c -0.0079,0.37985 -0.459182,0.51135 -0.225559,1.31927 0.191658,0.66279 0.887018,1.42106 0.887018,1.42106 0,0 -0.874828,-0.76591 -1.145642,-1.40601 -0.270812,-0.64011 -0.01191,-1.54693 -0.01191,-1.54693"
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="csczc"
inkscape:connector-curvature="0"
id="path1086"
d="m 41.404687,283.12207 c -0.0079,0.37985 -0.424683,0.81322 -0.509041,1.65 -0.09182,0.91084 -1.211218,1.96222 -1.211218,1.96222 0,0 0.998985,-1.05902 0.952594,-1.94717 -0.04639,-0.88815 0.318816,-1.6178 0.318816,-1.6178"
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 50.003646,283.07483 c -0.0079,0.37985 0.252593,0.74066 0.486216,1.54858 0.191658,0.66279 0.364231,1.82958 0.364231,1.82958 0,0 -0.235111,-1.0575 -0.505925,-1.6976 -0.270812,-0.64011 -1.171348,-1.75143 -1.171348,-1.75143"
id="path1088"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csczc" />
<path
sodipodi:nodetypes="cscsc"
inkscape:connector-curvature="0"
id="path1090"
d="m 38.971466,282.67323 c -0.0079,0.37985 0.246274,1.23214 -0.438171,1.72087 -0.564294,0.40293 -2.160414,0.6651 -2.160414,0.6651 0,0 1.532556,-0.55416 2.019908,-0.90991 0.451361,-0.32948 0.05896,-1.68867 0.05896,-1.68867"
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 36.490995,283.38903 c 4.989684,-0.34688 10.337396,-1.14471 14.741072,-0.16534 0,0 -3.573827,0.52887 -5.976752,0.50791 -2.402925,-0.021 -8.76432,-0.34255 -8.76432,-0.34255 z"
id="path1092"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cczcc" />
<path
sodipodi:nodetypes="csczc"
inkscape:connector-curvature="0"
id="path1094"
d="m 44.524621,282.45677 c -0.0079,0.37985 0.252593,0.74066 0.486216,1.54858 0.191658,0.66279 -0.387464,1.06118 -0.387464,1.06118 0,0 0.516584,-0.2891 0.24577,-0.9292 -0.270812,-0.64011 -1.171348,-1.75143 -1.171348,-1.75143"
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="opacity:1;fill:#44aa00;fill-opacity:1;stroke:none;stroke-width:0.0568211;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 42.235134,215.49137 c 0,-0.0278 0.523283,-0.36314 1.010613,-0.64767 1.006039,-0.5874 1.720562,-0.94274 2.372019,-1.17967 0.784749,-0.28539 1.669558,-0.47173 2.23003,-0.46962 l 0.175395,5.3e-4 -0.05846,0.0509 c -0.108667,0.0946 -0.491339,0.36075 -0.734991,0.51123 -0.328242,0.20274 -0.628185,0.3686 -1.031687,0.57048 -1.382274,0.69159 -2.424417,1.03259 -3.501443,1.14569 -0.235215,0.0247 -0.461471,0.0335 -0.461471,0.018 z"
id="path1125"
inkscape:connector-curvature="0" />
</g>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="23.397022"
y="48.195503"
id="text1047"><tspan
sodipodi:role="line"
id="tspan1045"
x="23.397022"
y="48.195503"
style="stroke-width:0.264583">Filesystem isolation ensures the apps</tspan><tspan
sodipodi:role="line"
x="23.397022"
y="53.487164"
style="stroke-width:0.264583"
id="tspan1176">always use the same software libraries</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="23.622332"
y="106.40382"
id="text1051"><tspan
sodipodi:role="line"
id="tspan1049"
x="23.622332"
y="106.40382"
style="stroke-width:0.264583">Zero human intervention, all data</tspan><tspan
sodipodi:role="line"
x="23.622332"
y="111.69549"
style="stroke-width:0.264583"
id="tspan1053">postprocessing scripts are included</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="23.779432"
y="135.50798"
id="text1063"><tspan
sodipodi:role="line"
x="23.779432"
y="135.50798"
style="stroke-width:0.264583"
id="tspan1127">Different team, same results on</tspan><tspan
sodipodi:role="line"
x="23.779432"
y="140.79964"
style="stroke-width:0.264583"
id="tspan1131">the same system (ACM)</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="235.24559"
y="119.633"
id="text1069"><tspan
sodipodi:role="line"
x="235.24559"
y="119.633"
style="stroke-width:0.264583"
id="tspan1093">Repository with BSC and custom</tspan><tspan
sodipodi:role="line"
x="235.24559"
y="124.92467"
style="stroke-width:0.264583"
id="tspan1111">packages </tspan></text>
<text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="234.71022"
y="54.057686"
id="text1075"><tspan
sodipodi:role="line"
id="tspan1073"
x="234.71022"
y="54.057686"
style="stroke-width:0.264583">nix</tspan></text>
<text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="22.981543"
y="69.932686"
id="text1079"><tspan
sodipodi:role="line"
id="tspan1077"
x="22.981543"
y="69.932686"
style="stroke-width:0.264583">Backwards tracking</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="23.824903"
y="77.299644"
id="text1083"><tspan
sodipodi:role="line"
x="23.824903"
y="77.299644"
style="stroke-width:0.264583"
id="tspan1121">Every result is hashed by the software</tspan><tspan
sodipodi:role="line"
x="23.824903"
y="82.591309"
style="stroke-width:0.264583"
id="tspan1125">used to generate it (datasets, plots ...)</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="235.06369"
y="61.424671"
id="text1087"><tspan
sodipodi:role="line"
id="tspan1085"
x="235.06369"
y="61.424671"
style="stroke-width:0.264583">Reproducible builds from source using</tspan><tspan
sodipodi:role="line"
x="235.06369"
y="66.716331"
style="stroke-width:0.264583"
id="tspan1107">the nix package manager</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="235.01408"
y="148.7413"
id="text1091"><tspan
sodipodi:role="line"
id="tspan1089"
x="235.01408"
y="148.7413"
style="stroke-width:0.264583">Several benchmark programs with</tspan><tspan
sodipodi:role="line"
x="235.01408"
y="154.03296"
style="stroke-width:0.264583"
id="tspan1105">multiple programming models</tspan></text>
<text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:'Linux Libertine';-inkscape-font-specification:'Linux Libertine, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="234.71022"
y="83.16185"
id="text1097"><tspan
sodipodi:role="line"
id="tspan1095"
x="234.71022"
y="83.16185"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46667px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583">nixpkgs</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="235.0947"
y="90.528831"
id="text1101"><tspan
sodipodi:role="line"
id="tspan1099"
x="235.0947"
y="90.528831"
style="stroke-width:0.264583">Large repository of common packages,</tspan><tspan
sodipodi:role="line"
x="235.0947"
y="95.820496"
style="stroke-width:0.264583"
id="tspan1103">maintaned by the community</tspan></text>
<text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;fill:#008000;stroke-width:0.264583"
x="22.981543"
y="157.24518"
id="text1039-8"><tspan
sodipodi:role="line"
id="tspan1037-1"
x="22.981543"
y="157.24518"
style="fill:#008000;stroke-width:0.264583">Reproducible</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;fill:#008000;stroke-width:0.264583"
x="23.779427"
y="164.61215"
id="text1063-0"><tspan
sodipodi:role="line"
x="23.779427"
y="164.61215"
style="fill:#008000;stroke-width:0.264583"
id="tspan1131-0">Different team, same results on</tspan><tspan
sodipodi:role="line"
x="23.779427"
y="169.90381"
style="fill:#008000;stroke-width:0.264583"
id="tspan1162">a different system (ACM).</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;stroke-width:0.264583"
x="163.37598"
y="138.77432"
id="text1166"><tspan
sodipodi:role="line"
x="163.37598"
y="138.77432"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';text-align:center;text-anchor:middle;stroke-width:0.264583"
id="tspan1168">Is a complete benchmark framework</tspan><tspan
sodipodi:role="line"
x="163.37598"
y="144.50696"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';text-align:center;text-anchor:middle;stroke-width:0.264583"
id="tspan1172">(<tspan
style="fill:#008000"
id="tspan1174">green</tspan> = not mature yet)</tspan></text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

View File

@ -1,265 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="500"
height="500"
viewBox="0 0 132.29167 132.29167"
version="1.1"
id="svg8"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
sodipodi:docname="scalability.svg">
<defs
id="defs2">
<marker
style="overflow:visible;"
id="marker2584"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="scale(0.4) rotate(180) translate(10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path2582" />
</marker>
<marker
style="overflow:visible;"
id="marker1521"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="scale(0.4) rotate(180) translate(10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path1519" />
</marker>
<marker
style="overflow:visible"
id="marker1313"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1311" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path842" />
</marker>
<marker
style="overflow:visible"
id="marker1129"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1127" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lstart"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path839" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="225.60325"
inkscape:cy="274.75145"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="true"
units="px"
inkscape:snap-bbox="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1914"
inkscape:window-height="1025"
inkscape:window-x="0"
inkscape:window-y="24"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid10" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:#c5ffc5;fill-opacity:1;stroke:none;stroke-width:0.189286;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:0.189286, 0.567857;stroke-dashoffset:0"
d="m 36.122769,118.97047 -20.300019,-0.0177 0.107096,-11.93674 c 0.0589,-6.56521 0.08242,-27.953609 0.05225,-47.529788 l -0.05485,-35.593051 27.686723,-0.04266 27.686722,-0.04266 0.07339,47.624942 0.07339,47.624937 -7.512341,-0.0348 c -4.131786,-0.0191 -16.647348,-0.0428 -27.812359,-0.0525 z"
id="path3092" />
<path
style="fill:#f98f84;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 87.3125,119.0625 h 15.875 V 23.812501 h -15.875 z"
id="path2031"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#dc8add;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 71.4375,119.0625 h 15.875 V 23.812501 h -15.875 z"
id="path2027"
sodipodi:nodetypes="ccccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.12, 1.06;stroke-dashoffset:0;stroke-opacity:1"
d="M 71.4375,119.0625 V 23.812501"
id="path1305"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="8.1803885"
y="11.751222"
id="text1213"><tspan
sodipodi:role="line"
x="8.1803885"
y="11.751222"
style="stroke-width:0.264583"
id="tspan1263">Efficiency</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="95.932426"
y="126.27518"
id="text1217"><tspan
sodipodi:role="line"
x="95.932426"
y="126.27518"
style="stroke-width:0.264583"
id="tspan1219">Nodes: log(n)</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.12, 1.06;stroke-dashoffset:0;stroke-opacity:1"
d="M 87.3125,119.0625 V 23.812501"
id="path1307"
sodipodi:nodetypes="cc" />
<path
style="fill:#cccccc;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 103.1875,119.0625 V 23.812501 h 13.22917 V 119.0625 Z"
id="path1415"
sodipodi:nodetypes="ccccc" />
<text
xml:space="preserve"
style="font-size:3.175px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;stroke-width:0.264583"
x="-80.841827"
y="110.98573"
id="text1419"
transform="rotate(-90)"><tspan
sodipodi:role="line"
x="-80.841827"
y="110.98573"
style="font-size:3.175px;text-align:end;text-anchor:end;stroke-width:0.264583"
id="tspan2029">Too small</tspan></text>
<text
xml:space="preserve"
style="font-size:3.175px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;fill:#000000;stroke-width:0.264583"
x="-96.356133"
y="96.125916"
id="text1601"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan1599"
x="-96.356133"
y="96.125916"
style="font-size:3.175px;fill:#000000;stroke-width:0.264583">OmpSs-2 scale bad</tspan></text>
<text
xml:space="preserve"
style="font-size:3.175px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;fill:#000000;stroke-width:0.264583"
x="-95.687462"
y="80.250916"
id="text1605"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan1603"
x="-95.687462"
y="80.250916"
style="font-size:3.175px;fill:#000000;stroke-width:0.264583">OpenMP scale bad</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker1129);marker-end:url(#Arrow1Lend)"
d="M 15.874997,15.875001 V 119.0625 H 124.35417"
id="path14"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.12, 1.06;stroke-dashoffset:0;stroke-opacity:1"
d="M 103.1875,119.0625 V 23.812501"
id="path2545"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.865;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 96.572917,116.41667 85.989584,71.437501 70.114584,46.302085 15.875,34.395834 l 68.791667,13.229167 15.875003,19.84375 9.26042,48.947919"
id="path2820"
sodipodi:nodetypes="ccccccc" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="51.457352"
y="32.917889"
id="text3711"><tspan
sodipodi:role="line"
id="tspan3709"
x="51.457352"
y="32.917889"
style="stroke-width:0.264583">We can explain this difference</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1313)"
d="m 80.697916,35.718751 -1.322917,9.260416"
id="path3713" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 10 KiB

View File

@ -1,806 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="500"
height="500"
viewBox="0 0 132.29167 132.29167"
version="1.1"
id="svg8"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
sodipodi:docname="scaling-region.svg">
<defs
id="defs2">
<marker
style="overflow:visible;"
id="marker2584"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="scale(0.4) rotate(180) translate(10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path2582" />
</marker>
<marker
style="overflow:visible;"
id="marker2429"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="scale(0.4) rotate(180) translate(10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path2427" />
</marker>
<marker
style="overflow:visible;"
id="marker2313"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="scale(0.4) rotate(180) translate(10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path2311" />
</marker>
<marker
style="overflow:visible;"
id="marker1521"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="scale(0.4) rotate(180) translate(10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path1519" />
</marker>
<marker
style="overflow:visible;"
id="Arrow1Mend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="scale(0.4) rotate(180) translate(10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path848" />
</marker>
<marker
style="overflow:visible"
id="marker1313"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1311" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path842" />
</marker>
<marker
style="overflow:visible"
id="marker1129"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1127" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lstart"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path839" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="207.26458"
inkscape:cy="264.61042"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="true"
units="px"
inkscape:snap-bbox="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1914"
inkscape:window-height="1025"
inkscape:window-x="0"
inkscape:window-y="24"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid10" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:#c5ffc5;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 58.208333,23.8125 -47.625,47.624999 v 50.270831 h 23.8125 L 103.1875,52.916666 V 23.8125 Z"
id="path2519" />
<path
style="fill:#deddda;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 58.208333,23.8125 -47.625,47.625 0,-13.229167 L 44.979167,23.8125 Z"
id="path2273"
sodipodi:nodetypes="ccccc" />
<rect
style="fill:#cdab8f;stroke:none;stroke-width:0.264999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="rect2041"
width="69.808571"
height="2.6832228"
x="-64.919769"
y="88.492943"
ry="1.1225308"
transform="rotate(-45)" />
<path
style="fill:#f98f84;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 55.5625,121.70833 18.520833,0 L 103.1875,92.604167 V 74.083333 Z"
id="path2031"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#dc8add;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 34.395833,121.70833 H 55.562499 L 103.1875,74.083332 V 52.916666 Z"
id="path2027" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:2.1199999,1.05999995;stroke-dashoffset:0"
d="M 34.395833,121.70833 103.1875,52.916667"
id="path1305"
sodipodi:nodetypes="cc" />
<rect
style="fill:#99c1f1;stroke:none;stroke-width:0.264999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="rect2043"
width="58.208332"
height="2.6458333"
x="-117.73958"
y="41.010418"
ry="1.3229166"
transform="rotate(-90)" />
<rect
style="fill:#f6d32d;stroke:none;stroke-width:0.264999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="rect2037"
width="58.208332"
height="2.6458333"
x="17.197916"
y="107.15625"
ry="1.3229166" />
<rect
style="fill:#f6d32d;stroke:none;stroke-width:0.264999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="rect2039"
width="58.208332"
height="2.6458333"
x="17.197916"
y="91.28125"
ry="1.3229166" />
<rect
style="fill:#f6d32d;stroke:none;stroke-width:0.264999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="rect2035"
width="58.208332"
height="2.6458333"
x="17.197916"
y="75.40625"
ry="1.3229166" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="3.9904637"
y="9.1053886"
id="text1213"><tspan
sodipodi:role="line"
x="3.9904637"
y="9.1053886"
style="stroke-width:0.264583"
id="tspan1221">Problem</tspan><tspan
sodipodi:role="line"
x="3.9904637"
y="14.397051"
style="stroke-width:0.264583"
id="tspan1263">size: log(N)</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="99.107437"
y="128.92101"
id="text1217"><tspan
sodipodi:role="line"
x="99.107437"
y="128.92101"
style="stroke-width:0.264583"
id="tspan1219">Nodes: log(n)</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.265, 0.795;stroke-dashoffset:0;stroke-opacity:1"
d="M 10.583333,121.70833 103.1875,29.104167"
id="path1289"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-size:2.82222px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;fill:#000000;stroke-width:0.264583"
x="117.66448"
y="16.21262"
id="text1293"><tspan
sodipodi:role="line"
x="117.66448"
y="16.21262"
style="font-size:2.82222px;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583"
id="tspan1299">Constant work</tspan><tspan
sodipodi:role="line"
x="117.66448"
y="19.740395"
style="font-size:2.82222px;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583"
id="tspan1303">per CPU</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:2.1199999,1.05999995;stroke-dashoffset:0"
d="m 55.5625,121.70833 47.625,-47.624997"
id="path1307"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
d="m 111.12501,21.166666 -6.61459,6.614584"
id="path1309"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-size:3.52778px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="110.29613"
y="39.111828"
id="text1391"><tspan
sodipodi:role="line"
id="tspan1389"
x="110.29613"
y="39.111828"
style="font-size:3.52778px;stroke-width:0.264583">OpenMP</tspan><tspan
sodipodi:role="line"
x="110.29613"
y="43.521553"
style="font-size:3.52778px;stroke-width:0.264583"
id="tspan1393">sat. limit</tspan></text>
<text
xml:space="preserve"
style="font-size:3.52778px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="110.06047"
y="60.278492"
id="text1397"><tspan
sodipodi:role="line"
id="tspan1395"
x="110.06047"
y="60.278492"
style="font-size:3.52778px;stroke-width:0.264583">OmpSs-2</tspan><tspan
sodipodi:role="line"
x="110.06047"
y="64.688217"
style="font-size:3.52778px;stroke-width:0.264583"
id="tspan1399">sat. limit</tspan></text>
<path
style="fill:#cccccc;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 74.083333,121.70833 103.1875,92.604167 v 29.104163 z"
id="path1415"
sodipodi:nodetypes="cccc" />
<text
xml:space="preserve"
style="font-size:3.175px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;stroke-width:0.264583"
x="-5.693222"
y="146.30673"
id="text1419"
transform="rotate(-45)"><tspan
sodipodi:role="line"
x="-5.693222"
y="146.30673"
style="font-size:3.175px;text-align:end;text-anchor:end;stroke-width:0.264583"
id="tspan2029">Too small</tspan></text>
<path
style="fill:#cccccc;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 44.97917,23.8125 10.583333,58.20833 V 23.8125 Z"
id="path1421"
sodipodi:nodetypes="cccc" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="-18.932135"
y="40.831676"
id="text1425"
transform="rotate(-45)"><tspan
sodipodi:role="line"
id="tspan1423"
x="-18.932135"
y="40.831676"
style="stroke-width:0.264583">ENOMEM</tspan></text>
<path
style="fill:#0000ff;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 18.520833,92.604166 55.5625,10e-7"
id="path1427"
sodipodi:nodetypes="cc" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="path1429"
cx="18.520834"
cy="92.604164"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1431"
cx="26.458334"
cy="92.604164"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1433"
cx="34.395832"
cy="92.604164"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1435"
cx="42.333332"
cy="92.604164"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1445"
cx="50.270832"
cy="92.604164"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1447"
cx="58.208332"
cy="92.604164"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1449"
cx="66.145828"
cy="92.604164"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1451"
cx="74.083328"
cy="92.604164"
rx="0.79374415"
ry="0.7937445" />
<path
style="fill:#0000ff;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 18.520833,108.47917 55.5625,0"
id="path1453"
sodipodi:nodetypes="cc" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1455"
cx="18.520834"
cy="108.47916"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1457"
cx="26.458334"
cy="108.47916"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1459"
cx="34.395832"
cy="108.47916"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1461"
cx="42.333332"
cy="108.47916"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1463"
cx="50.270832"
cy="108.47916"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1465"
cx="58.208332"
cy="108.47916"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1467"
cx="66.145828"
cy="108.47916"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1469"
cx="74.083328"
cy="108.47916"
rx="0.79374415"
ry="0.7937445" />
<path
style="fill:#0000ff;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 18.52084,76.729181 h 55.5625"
id="path1471"
sodipodi:nodetypes="cc" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1473"
cx="18.520842"
cy="76.729164"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1475"
cx="26.458342"
cy="76.729164"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1477"
cx="34.39584"
cy="76.729164"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1479"
cx="42.33334"
cy="76.729164"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1481"
cx="50.27084"
cy="76.729164"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1483"
cx="58.20834"
cy="76.729164"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1485"
cx="66.145836"
cy="76.729164"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1487"
cx="74.083336"
cy="76.729164"
rx="0.79374415"
ry="0.7937445" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;fill:#000000;"
x="18.050591"
y="73.928307"
id="text1491"><tspan
sodipodi:role="line"
id="tspan1489"
x="18.050591"
y="73.928307"
style="stroke-width:0.264583;fill:#000000;">Strong</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="13.229166"
y="78.052086"
id="text1495"><tspan
sodipodi:role="line"
id="tspan1493"
x="13.229166"
y="78.052086"
style="stroke-width:0.264583">A</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="13.229166"
y="93.927086"
id="text1499"><tspan
sodipodi:role="line"
id="tspan1497"
x="13.229166"
y="93.927086"
style="stroke-width:0.264583">B</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="13.070004"
y="110.02016"
id="text1503"><tspan
sodipodi:role="line"
id="tspan1501"
x="13.070004"
y="110.02016"
style="stroke-width:0.264583">C</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 18.520833,108.47917 47.625,-47.625003"
id="path1505"
sodipodi:nodetypes="cc" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1507"
cx="42.333332"
cy="84.666664"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1509"
cx="26.458334"
cy="100.54166"
rx="0.79374415"
ry="0.7937445" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1511"
cx="58.208332"
cy="68.791664"
rx="0.79374415"
ry="0.7937445" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;fill:#000000;stroke-width:0.264583"
x="-13.374139"
y="87.636398"
id="text1515"
transform="rotate(-45)"><tspan
sodipodi:role="line"
id="tspan1513"
x="-13.374139"
y="87.636398"
style="fill:#000000;stroke-width:0.264583">Weak</tspan></text>
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1575"
cx="66.145836"
cy="60.854168"
rx="0.79374415"
ry="0.7937445" />
<path
style="fill:#0000ff;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 42.333333,60.854171 V 116.41666"
id="path1577"
sodipodi:nodetypes="cc" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1579"
cx="60.854172"
cy="-42.333347"
rx="0.79374415"
ry="0.7937445"
transform="rotate(90)" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1581"
cx="68.791672"
cy="-42.333347"
rx="0.79374415"
ry="0.7937445"
transform="rotate(90)" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1589"
cx="100.54168"
cy="-42.333347"
rx="0.79374415"
ry="0.7937445"
transform="rotate(90)" />
<ellipse
style="fill:#000000;stroke:none;stroke-width:0.158999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="ellipse1593"
cx="116.41668"
cy="-42.333347"
rx="0.79374415"
ry="0.7937445"
transform="rotate(90)" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;fill:#000000;stroke-width:0.264583"
x="-70.524887"
y="39.94278"
id="text1597"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan1595"
x="-70.524887"
y="39.94278"
style="fill:#000000;stroke-width:0.264583">Saturation</tspan></text>
<text
xml:space="preserve"
style="font-size:3.175px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;fill:#000000;stroke-width:0.264583"
x="-5.0723147"
y="118.84846"
id="text1601"
transform="rotate(-45)"><tspan
sodipodi:role="line"
id="tspan1599"
x="-5.0723147"
y="118.84846"
style="font-size:3.175px;fill:#000000;stroke-width:0.264583">OpenMP scale bad</tspan></text>
<text
xml:space="preserve"
style="font-size:3.175px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;fill:#000000;stroke-width:0.264583"
x="-19.945276"
y="133.06721"
id="text1605"
transform="rotate(-45)"><tspan
sodipodi:role="line"
id="tspan1603"
x="-19.945276"
y="133.06721"
style="font-size:3.175px;fill:#000000;stroke-width:0.264583">OmpSs-2 scale bad</tspan></text>
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="-19.867579"
y="54.863327"
id="text2277"
transform="rotate(-45)"><tspan
sodipodi:role="line"
id="tspan2275"
x="-19.867579"
y="54.863327"
style="stroke-width:0.264583">ENOTIME</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2313)"
d="m 111.125,44.979167 -6.61458,6.614583"
id="path2309"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2429)"
d="m 111.125,66.145834 -6.61458,6.614583"
id="path2425"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;stroke-width:0.264583"
x="74.123642"
y="35.563721"
id="text2515"><tspan
sodipodi:role="line"
id="tspan2513"
x="74.123642"
y="35.563721"
style="text-align:center;text-anchor:middle;stroke-width:0.264583">Saturation</tspan><tspan
sodipodi:role="line"
x="74.123642"
y="40.855385"
style="text-align:center;text-anchor:middle;stroke-width:0.264583"
id="tspan2517">zone</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker1129);marker-end:url(#Arrow1Lend)"
d="M 10.58333,18.520833 V 121.70833 H 119.0625"
id="path14"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.12, 1.06;stroke-dashoffset:0;stroke-opacity:1"
d="M 74.083333,121.70833 103.1875,92.604167"
id="path2545"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.12, 1.06;stroke-dashoffset:0;stroke-opacity:1"
d="m 10.583333,71.4375 47.625,-47.625"
id="path2545-3"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.12, 1.06;stroke-dashoffset:0;stroke-opacity:1"
d="M 10.583334,58.208326 44.979167,23.8125"
id="path2545-6"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-size:3.52778px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="110.06046"
y="78.799332"
id="text2578"><tspan
sodipodi:role="line"
x="110.06046"
y="78.799332"
style="font-size:3.52778px;stroke-width:0.264583"
id="tspan2678">1 task/CPU</tspan><tspan
sodipodi:role="line"
x="110.06046"
y="83.209053"
style="font-size:3.52778px;stroke-width:0.264583"
id="tspan2682">limit</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2584)"
d="m 111.125,84.666667 -6.61458,6.614583"
id="path2580"
sodipodi:nodetypes="cc" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 32 KiB

File diff suppressed because it is too large Load Diff

View File

@ -1,83 +0,0 @@
import json, re, sys, os, glob
from os import path
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, flush=True, **kwargs)
def process_run(tree, runPath):
ctf_mode = {}
with open(".garlic/time_mode_runtime.csv", "r") as f:
ctf_mode['runtime'] = float(f.readline())
with open(".garlic/time_mode_dead.csv", "r") as f:
ctf_mode['dead'] = float(f.readline())
with open(".garlic/time_mode_task.csv", "r") as f:
ctf_mode['task'] = float(f.readline())
tree['ctf_mode'] = ctf_mode
with open("stdout.log", "r") as f:
lines = [line.strip() for line in f.readlines()]
time_line = None
for line in lines:
if re.match(r'^ ?time .*', line):
time_line = line
break
if time_line is None:
eprint("missing time line, aborting")
eprint("stdout file = {}/stdout.log".format(runPath))
exit(1)
time_str = time_line.split()[1]
tree['time'] = float(time_str)
print(json.dumps(tree))
def process_result_tree(resultTree):
eprint("processing resultTree: " + resultTree)
os.chdir(resultTree)
experiments = glob.glob(resultTree + "/*-experiment")
for exp in glob.glob("*-experiment"):
eprint("found experiment: " + exp)
expPath = path.join(resultTree, exp)
os.chdir(expPath)
for unit in glob.glob("*-unit"):
eprint("found unit: " + unit)
unitPath = path.join(resultTree, exp, unit)
os.chdir(unitPath)
with open('garlic_config.json') as json_file:
garlic_conf = json.load(json_file)
tree = {"exp":exp, "unit":unit, "config":garlic_conf}
for i in range(garlic_conf['loops']):
run = str(i + 1)
runPath = path.join(resultTree, exp, unit, run)
if path.isdir(runPath) == False:
eprint("missing run {}, aborting".format(run))
exit(1)
tree["run"] = run
os.chdir(runPath)
process_run(tree, runPath)
if len(sys.argv) != 2:
eprint("usage: python {} <resultTree>".format(argv[0]))
exit(1)
process_result_tree(sys.argv[1])

View File

@ -1,18 +0,0 @@
{
super
, self
, bsc
, garlic
, callPackage
}:
rec {
py = callPackage ./py.nix {};
std.timetable = py { script = ./std-timetable.py; compress = false; };
osu.latency = py { script = ./osu-latency.py; };
osu.bw = py { script = ./osu-bw.py; };
perf.stat = py { script = ./perf-stat.py; };
ctf.mode = py { script = ./ctf-mode.py; };
}

View File

@ -1,64 +0,0 @@
import json, re, sys, os, glob
from os import path
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, flush=True, **kwargs)
def process_run(tree, runPath):
with open("stdout.log", "r") as f:
lines = [line.strip() for line in f.readlines()]
for line in lines:
if not re.match('^[0-9]+ *[0-9\.]+$', line):
continue
slices = line.split()
size = slices[0]
bw = slices[1]
tree['size'] = int(size)
tree['bw'] = float(bw)
print(json.dumps(tree))
def process_result_tree(resultTree):
eprint("processing resultTree: " + resultTree)
os.chdir(resultTree)
experiments = glob.glob(resultTree + "/*-experiment")
for exp in glob.glob("*-experiment"):
eprint("found experiment: " + exp)
expPath = path.join(resultTree, exp)
os.chdir(expPath)
for unit in glob.glob("*-unit"):
eprint("found unit: " + unit)
unitPath = path.join(resultTree, exp, unit)
os.chdir(unitPath)
with open('garlic_config.json') as json_file:
garlic_conf = json.load(json_file)
tree = {"exp":exp, "unit":unit, "config":garlic_conf}
for i in range(garlic_conf['loops']):
run = str(i + 1)
runPath = path.join(resultTree, exp, unit, run)
if path.isdir(runPath) == False:
eprint("missing run {}, aborting".format(run))
exit(1)
tree["run"] = run
os.chdir(runPath)
process_run(tree, runPath)
if len(sys.argv) != 2:
eprint("usage: python {} <resultTree>".format(argv[0]))
exit(1)
process_result_tree(sys.argv[1])

View File

@ -1,64 +0,0 @@
import json, re, sys, os, glob
from os import path
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, flush=True, **kwargs)
def process_run(tree, runPath):
with open("stdout.log", "r") as f:
lines = [line.strip() for line in f.readlines()]
for line in lines:
if not re.match('^[0-9]+ *[0-9\.]+$', line):
continue
slices = line.split()
size = slices[0]
latency = slices[1]
tree['size'] = int(size)
tree['latency'] = float(latency)
print(json.dumps(tree))
def process_result_tree(resultTree):
eprint("processing resultTree: " + resultTree)
os.chdir(resultTree)
experiments = glob.glob(resultTree + "/*-experiment")
for exp in glob.glob("*-experiment"):
eprint("found experiment: " + exp)
expPath = path.join(resultTree, exp)
os.chdir(expPath)
for unit in glob.glob("*-unit"):
eprint("found unit: " + unit)
unitPath = path.join(resultTree, exp, unit)
os.chdir(unitPath)
with open('garlic_config.json') as json_file:
garlic_conf = json.load(json_file)
tree = {"exp":exp, "unit":unit, "config":garlic_conf}
for i in range(garlic_conf['loops']):
run = str(i + 1)
runPath = path.join(resultTree, exp, unit, run)
if path.isdir(runPath) == False:
eprint("missing run {}, aborting".format(run))
exit(1)
tree["run"] = run
os.chdir(runPath)
process_run(tree, runPath)
if len(sys.argv) != 2:
eprint("usage: python {} <resultTree>".format(argv[0]))
exit(1)
process_result_tree(sys.argv[1])

View File

@ -1,90 +0,0 @@
import json, re, sys, os, glob
from os import path
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, flush=True, **kwargs)
def process_run(tree, runPath):
with open(".garlic/perf.csv", "r") as f:
lines = [line.strip() for line in f.readlines()]
perf_data = {}
for line in lines:
if len(line) == 0: continue
if line[0] == '#': continue
slices = line.split(',')
if len(slices) != 7:
print("error: mismatched columns")
exit(1)
name = slices[2].replace("-", "_")
value = float(slices[0])
perf_data[name] = value
tree['perf'] = perf_data
with open("stdout.log", "r") as f:
lines = [line.strip() for line in f.readlines()]
time_line = None
for line in lines:
if re.match(r'^ ?time .*', line):
time_line = line
break
if time_line is None:
eprint("missing time line, aborting")
eprint("stdout file = {}/stdout.log".format(runPath))
exit(1)
time_str = time_line.split()[1]
tree['time'] = float(time_str)
print(json.dumps(tree))
def process_result_tree(resultTree):
eprint("processing resultTree: " + resultTree)
os.chdir(resultTree)
experiments = glob.glob(resultTree + "/*-experiment")
for exp in glob.glob("*-experiment"):
eprint("found experiment: " + exp)
expPath = path.join(resultTree, exp)
os.chdir(expPath)
for unit in glob.glob("*-unit"):
eprint("found unit: " + unit)
unitPath = path.join(resultTree, exp, unit)
os.chdir(unitPath)
with open('garlic_config.json') as json_file:
garlic_conf = json.load(json_file)
tree = {"exp":exp, "unit":unit, "config":garlic_conf}
for i in range(garlic_conf['loops']):
run = str(i + 1)
runPath = path.join(resultTree, exp, unit, run)
if path.isdir(runPath) == False:
eprint("missing run {}, aborting".format(run))
exit(1)
tree["run"] = run
os.chdir(runPath)
process_run(tree, runPath)
if len(sys.argv) != 2:
eprint("usage: python {} <resultTree>".format(argv[0]))
exit(1)
process_result_tree(sys.argv[1])

View File

@ -1,34 +0,0 @@
{
stdenv
, python3
, gzip
}:
{
script,
compress ? true
}:
tree:
stdenv.mkDerivation {
name = "dataset";
preferLocalBuild = true;
phases = [ "installPhase" ];
buildInputs = [ python3 gzip ];
installPhase = ''
mkdir -p $out
ln -s ${tree} $out/tree
ln -s ${script} $out/script
COMPRESS_DATASET=${toString compress}
if [ $COMPRESS_DATASET ]; then
python $out/script $out/tree | gzip > $out/dataset.json.gz
ln -s dataset.json.gz $out/dataset
else
python $out/script $out/tree > $out/dataset.json
ln -s dataset.json $out/dataset
fi
'';
}

View File

@ -1,77 +0,0 @@
import json, re, sys, os, glob
from os import path
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, flush=True, **kwargs)
def process_run(tree, runPath):
with open(".garlic/total_time_start", "r") as f:
total_time_start = float(f.readline().strip())
with open(".garlic/total_time_end", "r") as f:
total_time_end = float(f.readline().strip())
with open("stdout.log", "r") as f:
lines = [line.strip() for line in f.readlines()]
time_line = None
for line in lines:
if re.match(r'^ ?time .*', line):
time_line = line
break
if time_line is None:
eprint("missing time line, aborting")
eprint("stdout file = {}/stdout.log".format(runPath))
exit(1)
time_str = time_line.split()[1]
tree['time'] = float(time_str)
tree['total_time'] = total_time_end - total_time_start
print(json.dumps(tree))
def process_result_tree(resultTree):
eprint("processing resultTree: " + resultTree)
os.chdir(resultTree)
experiments = glob.glob(resultTree + "/*-experiment")
for exp in glob.glob("*-experiment"):
eprint("found experiment: " + exp)
expPath = path.join(resultTree, exp)
os.chdir(expPath)
for unit in glob.glob("*-unit"):
eprint("found unit: " + unit)
unitPath = path.join(resultTree, exp, unit)
os.chdir(unitPath)
with open('garlic_config.json') as json_file:
garlic_conf = json.load(json_file)
tree = {"exp":exp, "unit":unit, "config":garlic_conf}
for i in range(garlic_conf['loops']):
run = str(i + 1)
runPath = path.join(resultTree, exp, unit, run)
if path.isdir(runPath) == False:
eprint("missing run {}, aborting".format(run))
exit(1)
tree["run"] = run
os.chdir(runPath)
process_run(tree, runPath)
if len(sys.argv) != 2:
eprint("usage: python {} <resultTree>".format(argv[0]))
exit(1)
process_result_tree(sys.argv[1])

View File

@ -1,73 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, n # must be a string
, dram # must be a string
, strace
}:
with lib;
# Ensure the arguments are strings, to avoid problems with large numbers
assert (isString n);
assert (isString dram);
let
# Initial variable configuration
varConf = with bsc; { };
inherit (targetMachine) fs;
# Generate the complete configuration for each unit
genConf = with bsc; c: targetMachine.config // rec {
expName = "genseq";
unitName = "${expName}.n${n}.dram${dram}";
inherit (targetMachine.config) hw;
inherit n dram;
# Don't repeat
loops = 1;
# Resources
qos = "debug";
ntasksPerNode = 1;
nodes = 1;
time = "01:00:00";
cpusPerTask = hw.cpusPerNode;
jobName = unitName;
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
exec = {nextStage, conf, ...}: with conf;
let
#FIXME: We need a better mechanism to get the output paths
outDir = "${fs.shared.fast}/out/$GARLIC_USER/$GARLIC_UNIT/$GARLIC_RUN";
outFile = "${outDir}/seq.dat";
in
stages.exec {
inherit nextStage;
pre = ''
mkdir -p "${outDir}"
'';
argv = [ n dram outFile ];
post = ''
# Link the output here
ln -s "${outFile}" seq.dat
'';
};
program = {...}: bsc.apps.bigsort.genseq;
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,102 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, inputTre
, n
, dram
, garlicTools
, resultFromTrebuchet
}:
with lib;
with garlicTools;
let
# Initial variable configuration
varConf = with bsc; { };
inherit (targetMachine) fs;
# Generate the complete configuration for each unit
genConf = with bsc; c: targetMachine.config // rec {
expName = "shuffle";
unitName = "${expName}.n${n}.dram${dram}";
inherit (targetMachine.config) hw;
inherit n dram;
# Don't repeat
loops = 1;
# Resources
qos = "debug";
ntasksPerNode = 1;
nodes = 1;
time = "01:00:00";
cpusPerTask = hw.cpusPerNode;
jobName = unitName;
# We need access to a fast shared filesystem to store the shuffled input
# dataset
extraMounts = [ fs.shared.fast ];
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
exec = {nextStage, conf, ...}: with conf;
let
inputExp = inputTre.experiment;
inputUnit = elemAt inputExp.units 0;
unitName = baseNameOf (toString inputUnit);
# We also need the result. This is only used to ensure that we have the
# results, so it has been executed.
inputRes = resultFromTrebuchet inputTre;
#FIXME: We need a better mechanism to get the output paths
inFile = "${fs.shared.fast}/out/$GARLIC_USER/${unitName}/1/seq.dat";
outDir = "${fs.shared.fast}/out/$GARLIC_USER/$GARLIC_UNIT/$GARLIC_RUN";
outFile = "${outDir}/shuffled.dat";
in
stages.exec {
inherit nextStage;
pre = ''
# This line ensures that the previous results are complete:
# ${inputRes}
# Exit on error
set -e
# Ensure the input file exists
if [ ! -f "${inFile}" ]; then
echo "input file not found: ${inFile}"
exit 1
fi
mkdir -p "${outDir}"
# Copy the input as we are going to overwrite it
cp "${inFile}" "${outFile}"
'';
argv = [ n dram outFile 16 64 ];
post = ''
# Link the output here
ln -s "${outFile}" shuffled.dat
'';
};
program = {...}:
bsc.apps.bigsort.shuffle;
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,126 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, removeOutput ? true
, resultFromTrebuchet
, inputTre
}:
with lib;
let
varConf = { }; # Not used
inherit (targetMachine) fs;
# Generate the complete configuration for each unit
genConf = with bsc; c: targetMachine.config // rec {
expName = "bigsort";
unitName = "${expName}.bs${toString bs}";
inherit (targetMachine.config) hw;
# bigsort options
n = 1024 * 1024 * 1024 / 8; # In longs (?)
bs = n; # In bytes
pageSize = bs / 2; # In bytes (?)
cc = bsc.icc;
mpi = bsc.impi;
gitBranch = "garlic/mpi+send+omp+task";
# Repeat the execution of each unit 30 times
loops = 1;
# Resources
qos = "debug";
ntasksPerNode = 1;
nodes = 1;
time = "01:00:00";
# All CPUs of the socket to each task
cpusPerTask = hw.cpusPerSocket;
jobName = "bigsort-${toString n}-${toString bs}-${gitBranch}";
# Load the dataset from the same fs where it was stored in the shuffle
# step. Also we use a local temp fs to store intermediate results.
extraMounts = [ fs.shared.fast fs.local.temp ];
rev = 1;
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
exec = {nextStage, conf, ...}: with conf;
let
inputExp = inputTre.experiment;
unit = elemAt inputExp.units 0;
expName = baseNameOf (toString inputExp);
unitName = baseNameOf (toString unit);
# We also need the result. This is only used to ensure that we have the
# results, so it has been executed.
inputRes = resultFromTrebuchet inputTre;
#FIXME: We need a better mechanism to get the output paths
inFile = "${fs.shared.fast}/out/$GARLIC_USER/${unitName}/1/shuffled.dat";
outDir = "${fs.shared.fast}/out/$GARLIC_USER/$GARLIC_UNIT/$GARLIC_RUN";
outFile = "${outDir}/sorted.dat";
tmpDir = fs.local.temp;
in
stages.exec {
inherit nextStage;
pre = ''
# This line ensures that the shuffled results are complete: nix needs to
# compute the hash of the execution log to write the path here.
# ${inputRes}
# Exit on error
set -e
# Ensure the input file exists
if [ ! -f "${inFile}" ]; then
echo "input file not found: ${inFile}"
exit 1
fi
# Create the output path
mkdir -p ${outDir}
# Verbose args:
echo "INPUT = ${inFile}"
echo "OUTPUT = ${outFile}"
echo "TMPDIR = ${tmpDir}"
'';
argv = [ n bs inFile outFile tmpDir pageSize ];
# Optionally remove the potentially large output dataset
post = ''
# Link the output here
ln -s "${outFile}" sorted.dat
'' + optionalString (removeOutput) ''
# Remove the sorted output
stat "${outFile}" > "${outFile}.stat"
echo "file removed to save space" > "${outFile}"
'';
};
program = {nextStage, conf, ...}: with conf;
let
customPkgs = stdexp.replaceMpi conf.mpi;
in
customPkgs.apps.bigsort.sort.override {
inherit cc mpi gitBranch;
};
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
#{ inherit configs pipeline; }
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,164 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, pkgs
, targetMachine
, stages
, garlicTools
, writeText
, enableHWC ? false
}:
with lib;
with garlicTools;
let
# Initial variable configuration
varConf = {
nodes = [ 2 ];
};
machineConfig = targetMachine.config;
genConf = c: targetMachine.config // rec {
expName = "cn6-nbody";
unitName = expName + "-nodes${toString nodes}";
inherit (machineConfig) hw;
# Parameters for nbody
particles = 4 * 512 * hw.cpusPerSocket;
timesteps = 2;
blocksize = 512;
gitBranch = "garlic/tampi+isend+oss+task";
loops = 1;
# Resources
cpusPerTask = hw.cpusPerSocket;
ntasksPerNode = hw.socketsPerNode;
nodes = c.nodes;
qos = "debug";
time = "02:00:00";
jobName = unitName;
};
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
# Custom BSC packages
bsc' = bsc.extend (self: super: {
# For nanos6 we use my fork for distributed instrumentation at the
# latest commit
nanos6 = (super.nanos6Git.override {
enableJemalloc = true;
}).overrideAttrs (old: rec {
src = builtins.fetchGit {
url = "git@bscpm03.bsc.es:nanos6/forks/nanos6-fixes.git";
ref = "distributed-instrumentation-fixes";
rev = "80058512527961fbde9bd81474b0a29141d7982c";
};
dontStrip = false;
version = src.shortRev;
# Disable all unused instrumentations for faster builds
configureFlags = old.configureFlags ++ [
"--disable-extrae-instrumentation"
"--disable-lint-instrumentation"
"--disable-graph-instrumentation"
"--disable-stats-instrumentation"
"--with-babeltrace2=${super.babeltrace2}"
];
});
# Use clang from master
clangOmpss2Unwrapped = super.clangOmpss2Unwrapped.overrideAttrs (old: rec {
version = src.shortRev;
src = builtins.fetchGit {
url = "ssh://git@bscpm03.bsc.es/llvm-ompss/llvm-mono.git";
ref = "master";
rev = "ce47d99d2b2b968c87187cc7818cc5040b082d6c";
};
});
# Use mcxx from master
mcxx = super.mcxxGit;
# We also need the instrumented version of TAMPI
tampi = super.tampiGit.overrideAttrs (old: rec {
version = src.shortRev;
#dontStrip = true;
#NIX_CFLAGS = "-O0 -g";
src = builtins.fetchGit {
url = "ssh://git@bscpm03.bsc.es/interoperability/tampi.git";
ref = "master";
rev = "f1e77e6f439a0e964e98b5e0a4738b2e95e4fd3d";
};
});
});
ctf = {nextStage, conf, ...}: let
# Create the nanos6 configuration file
nanos6ConfigFile = writeText "nanos6.toml" ''
version.instrument = "ctf"
turbo.enabled = false
instrument.ctf.converter.enabled = true
instrument.ctf.converter.fast = false
'';
in stages.exec {
inherit nextStage;
# And use it
env = ''
export NANOS6_CONFIG=${nanos6ConfigFile}
# Add nanos6 and babeltrace2 binaries to the PATH
export PATH="$PATH:${bsc'.nanos6}/bin:${bsc'.babeltrace2}/bin"
# Also add the babeltrace2 python module to python search path
export PYTHONPATH="$PYTHONPATH:${bsc'.babeltrace2}/lib/python3.8/site-packages"
'';
post = ''
rank=$SLURM_PROCID
tracedir=trace_nbody
# Merge on rank 0 only
if [ $rank != 0 ]; then
exit 0;
fi
# Wait a bit for all ranks to finish the conversion
sleep 5
# Run the merger
nanos6-mergeprv "$tracedir"
'';
};
exec = {nextStage, conf, ...}: stages.exec {
inherit nextStage;
argv = with conf; [
"-t" timesteps
"-p" particles
];
};
program = {nextStage, conf, ...}: bsc'.garlic.apps.nbody.override {
inherit (conf) blocksize gitBranch;
};
pipeline = stdexp.stdPipeline ++ [ ctf exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,171 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, pkgs
, targetMachine
, stages
, garlicTools
, writeText
, enableHWC ? false
}:
with lib;
with garlicTools;
let
# Initial variable configuration
varConf = {
nodes = [ 1 2 4 8 ];
};
machineConfig = targetMachine.config;
genConf = c: targetMachine.config // rec {
expName = "timediff";
unitName = expName + "-nodes${toString nodes}";
inherit (machineConfig) hw;
loops = 1;
# Resources
cpusPerTask = hw.cpusPerSocket;
ntasksPerNode = hw.socketsPerNode;
nodes = c.nodes;
qos = "debug";
time = "02:00:00";
jobName = unitName;
};
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
# Custom BSC packages
bsc' = bsc.extend (self: super: {
# For nanos6 we use my fork for distributed instrumentation at the
# latest commit
nanos6 = (super.nanos6Git.override {
enableJemalloc = true;
}).overrideAttrs (old: rec {
src = builtins.fetchGit {
url = "git@bscpm03.bsc.es:rarias/nanos6.git";
ref = "rodrigo";
rev = "5cbeabb4e0446c2c293cc3005f76e6139465caee";
};
dontStrip = false;
version = src.shortRev;
# Disable all unused instrumentations for faster builds
configureFlags = old.configureFlags ++ [
"--disable-extrae-instrumentation"
"--disable-lint-instrumentation"
"--disable-graph-instrumentation"
"--disable-stats-instrumentation"
];
});
# Use clang from master
clangOmpss2Unwrapped = super.clangOmpss2Unwrapped.overrideAttrs (old: rec {
version = src.shortRev;
src = builtins.fetchGit {
url = "ssh://git@bscpm03.bsc.es/llvm-ompss/llvm-mono.git";
ref = "master";
rev = "ce47d99d2b2b968c87187cc7818cc5040b082d6c";
};
});
# Use mcxx from master
mcxx = super.mcxxGit;
# We also need the instrumented version of TAMPI
tampi = super.tampiGit.overrideAttrs (old: rec {
version = src.shortRev;
dontStrip = true;
NIX_CFLAGS = "-O0 -g";
src = builtins.fetchGit {
url = "ssh://git@bscpm03.bsc.es/rarias/tampi.git";
ref = "instrument";
rev = "6e4294299bf761a1cc31f4181d9479cefa1c7f3e";
};
});
# We use the latest commit in master as src for cn6
cn6Git = ((super.cn6.overrideAttrs (old: rec {
version = src.shortRev;
src = builtins.fetchGit {
url = "ssh://git@bscpm03.bsc.es/rarias/cn6.git";
ref = "master";
rev = "1d23d01d60164b8641746d5a204128a9d31b9650";
};
})).override { enableTest = true; });
cn6 = self.cn6Git;
});
ctf = {nextStage, conf, ...}: let
# Create the nanos6 configuration file
nanos6ConfigFile = writeText "nanos6.toml" ''
version.instrument = "ctf"
turbo.enabled = false
instrument.ctf.converter.enabled = false
'' + optionalString (enableHWC) ''
hardware_counters.papi.enabled = true
hardware_counters.papi.counters = [
"PAPI_TOT_INS", "PAPI_TOT_CYC",
"PAPI_L1_TCM", "PAPI_L2_TCM", "PAPI_L3_TCM"
]
'';
in stages.exec {
inherit nextStage;
# And use it
env = ''
export NANOS6_CONFIG=${nanos6ConfigFile}
'';
post = ''
rank=$SLURM_PROCID
tracedir=trace_timediff_mpi
# Convert CTF trace to PRV
${bsc'.cn6}/bin/cn6 $tracedir/$rank
# Merge on rank 0 only
if [ $rank != 0 ]; then
exit 0;
fi
# Wait a bit for all ranks to finish the conversion
sleep 5
# Run the merger
${bsc'.cn6}/bin/merge-prv $tracedir
# We need some tools the path
export PATH="$PATH:${bsc'.babeltrace2}/bin:${pkgs.ministat}/bin"
${bsc'.cn6}/bin/sync-err.sh $tracedir
'';
};
exec = {nextStage, conf, ...}: stages.exec {
inherit nextStage;
program = "${bsc'.cn6}/bin/timediff_mpi";
argv = [ conf.cpusPerTask ];
};
pipeline = stdexp.stdPipeline ++ [ ctf exec ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,126 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
, enableExtended ? false
}:
with lib;
with garlicTools;
let
# Initial variable configuration
varConf = {
granul = range2 4 128;
gitBranch = [
"garlic/tampi+isend+oss+task"
"garlic/mpi+isend+omp+task"
] ++ optionals (enableExtended) [
#"garlic/mpi+send+omp+fork" # Don't use fork for granularity
"garlic/mpi+send+seq"
"garlic/mpi+send+omp+task"
"garlic/mpi+send+oss+task"
"garlic/mpi+isend+oss+task"
];
# Max. number of iterations
iterations = [ 20 ] ++ optionals (enableExtended) [ 10 ];
nodes = [ 1 ] ++ optionals (enableExtended) (range2 2 16);
};
# We use these auxiliary functions to assign different configurations
# depending on the git branch.
getGranul = branch: oldGranul:
if (branch == "garlic/mpi+send+seq")
then 999999 else oldGranul;
getCpusPerTask = branch: hw:
if (branch == "garlic/mpi+send+seq")
then 1 else hw.cpusPerSocket;
getNtasksPerNode = branch: hw:
if (branch == "garlic/mpi+send+seq")
then hw.cpusPerNode else hw.socketsPerNode;
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
expName = "creams-gran";
unitName = "${expName}"+
"-nodes${toString nodes}"+
"-granul${toString granul}"+
"-${gitBranch}";
inherit (targetMachine.config) hw;
# Options for creams
inherit (c) gitBranch nodes iterations;
granul = getGranul gitBranch c.granul;
nprocz = ntasksPerNode * nodes;
# Repeat the execution of each unit 10 times
loops = 10;
# Resources
qos = "debug";
time = "02:00:00";
ntasksPerNode = getNtasksPerNode gitBranch hw;
cpusPerTask = getCpusPerTask gitBranch hw;
jobName = unitName;
};
# Compute the array of configurations
configs = unique (stdexp.buildConfigs {
inherit varConf genConf;
});
# Custom srun stage to copy the creams input dataset
customSrun = {nextStage, conf, ...}:
let
input = bsc.garlic.apps.creamsInput.override {
inherit (conf) gitBranch granul nprocz;
};
in
stdexp.stdStages.srun {
inherit nextStage conf;
# Now we add some commands to execute before calling srun. These will
# only run in one rank (the first in the list of allocated nodes)
preSrun = ''
cp -r ${input}/SodTubeBenchmark/* .
chmod +w -R .
sed -i '/maximum number of iterations/s/50/${toString conf.iterations}/' input.dat
rm -f nanos6.toml
'';
};
exec = {nextStage, conf, ...}: stages.exec {
inherit nextStage;
env = ''
export NANOS6_CONFIG_OVERRIDE="version.dependencies=regions"
'';
# Remove restarts as is not needed and is huge
post = ''
rm -rf restarts || true
'';
};
# Creams program
creams = {nextStage, conf, ...}: bsc.apps.creams.override {
inherit (conf) gitBranch;
};
pipeline = stdexp.stdPipelineOverride {
# Replace the stdandard srun stage with our own
overrides = { srun = customSrun; };
} ++ [ exec creams ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,132 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
, enableExtended ? false
}:
with lib;
with garlicTools;
let
# Initial variable configuration
varConf = {
#nodes = range2 1 16;
nodes = [ 16 ];
sizeFactor = [ 1 2 4 8 16 32 ];
granul = [ 1 2 4 8 16 ];
# Max. number of iterations
iterations = [ 20 ] ++ optionals (enableExtended) [ 10 ];
gitBranch = [
"garlic/tampi+isend+oss+task"
#"garlic/mpi+send+omp+fork"
#"garlic/mpi+send+omp+task"
#"garlic/mpi+send+seq"
] ++ optionals (enableExtended) [
"garlic/mpi+send+oss+task"
"garlic/mpi+isend+omp+task"
"garlic/mpi+isend+oss+task"
];
};
# We use these auxiliary functions to assign different configurations
# depending on the git branch.
getGranul = branch: oldGranul:
if (branch == "garlic/mpi+send+seq")
then 999999 else oldGranul;
getCpusPerTask = branch: hw:
if (branch == "garlic/mpi+send+seq")
then 1 else hw.cpusPerSocket;
getNtasksPerNode = branch: hw:
if (branch == "garlic/mpi+send+seq")
then hw.cpusPerNode else hw.socketsPerNode;
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
expName = "creams-granularity16";
unitName = "${expName}"
+ "-granul.${toString granul}"
+ "-sf.${toString sizeFactor}";
inherit (targetMachine.config) hw;
# Options for creams
inherit (c) iterations gitBranch nodes sizeFactor;
granul = getGranul gitBranch c.granul;
nprocz = ntasksPerNode * nodes;
baseSizePerCpu = 2;
baseSize = baseSizePerCpu * cpusPerTask * ntasksPerNode * nodes;
nz = baseSize * sizeFactor;
# Repeat the execution of each unit 10 times
loops = 10;
# Resources
qos = "debug";
time = "02:00:00";
ntasksPerNode = getNtasksPerNode gitBranch hw;
cpusPerTask = getCpusPerTask gitBranch hw;
jobName = unitName;
};
# Compute the array of configurations
configs = unique (
filter (c: !(c.granul == 1 && c.sizeFactor >= 32))(stdexp.buildConfigs {
inherit varConf genConf;
}));
# Custom srun stage to copy the creams input dataset
customSrun = {nextStage, conf, ...}:
let
input = bsc.garlic.apps.creamsInput.override {
inherit (conf) gitBranch granul nprocz nz;
};
in
stdexp.stdStages.srun {
inherit nextStage conf;
# Now we add some commands to execute before calling srun. These will
# only run in one rank (the first in the list of allocated nodes)
preSrun = ''
cp -r ${input}/SodTubeBenchmark/* .
chmod +w -R .
sed -i '/maximum number of iterations/s/50/${toString conf.iterations}/' input.dat
rm -f nanos6.toml
'';
};
exec = {nextStage, conf, ...}: stages.exec {
inherit nextStage;
env = ''
export NANOS6_CONFIG_OVERRIDE="version.dependencies=regions"
'';
# Remove restarts as is not needed and is huge
post = ''
rm -rf restarts || true
'';
};
# Creams program
creams = {nextStage, conf, ...}: bsc.apps.creams.override {
inherit (conf) gitBranch;
};
pipeline = stdexp.stdPipelineOverride {
# Replace the stdandard srun stage with our own
overrides = { srun = customSrun; };
} ++ [ exec creams ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,131 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
, enableExtended ? false
}:
with lib;
with garlicTools;
let
# Initial variable configuration
varConf = {
#nodes = range2 1 16;
nodes = [ 16 ];
sizeFactor = range2 1 32;
baseGranul = [ 1 ] ++ optionals (enableExtended) [ 2 4 8 ];
# Max. number of iterations
iterations = [ 20 ] ++ optionals (enableExtended) [ 10 ];
gitBranch = [
"garlic/tampi+isend+oss+task"
"garlic/mpi+send+omp+fork"
#"garlic/mpi+send+omp+task"
#"garlic/mpi+send+seq"
] ++ (optionals (enableExtended) [
"garlic/mpi+send+oss+task"
"garlic/mpi+isend+omp+task"
"garlic/mpi+isend+oss+task"
]);
};
# We use these auxiliary functions to assign different configurations
# depending on the git branch.
getGranul = branch: oldGranul:
if (branch == "garlic/mpi+send+seq")
then 999999 else oldGranul;
getCpusPerTask = branch: hw:
if (branch == "garlic/mpi+send+seq")
then 1 else hw.cpusPerSocket;
getNtasksPerNode = branch: hw:
if (branch == "garlic/mpi+send+seq")
then hw.cpusPerNode else hw.socketsPerNode;
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
expName = "creams-size";
unitName = "${expName}"
+ "-granul.${toString granul}"
+ "-sf.${toString sizeFactor}";
inherit (targetMachine.config) hw;
# Options for creams
inherit (c) iterations gitBranch nodes sizeFactor baseGranul;
granul = getGranul gitBranch (max 2 (baseGranul * sizeFactor));
nprocz = ntasksPerNode * nodes;
baseSizePerCpu = 2;
baseSize = baseSizePerCpu * cpusPerTask * ntasksPerNode * nodes;
nz = baseSize * sizeFactor;
# Repeat the execution of each unit 10 times
loops = 10;
# Resources
qos = "debug";
time = "02:00:00";
ntasksPerNode = getNtasksPerNode gitBranch hw;
cpusPerTask = getCpusPerTask gitBranch hw;
jobName = unitName;
};
# Compute the array of configurations
configs = unique (stdexp.buildConfigs {
inherit varConf genConf;
});
# Custom srun stage to copy the creams input dataset
customSrun = {nextStage, conf, ...}:
let
input = bsc.garlic.apps.creamsInput.override {
inherit (conf) gitBranch granul nprocz nz;
};
in
stdexp.stdStages.srun {
inherit nextStage conf;
# Now we add some commands to execute before calling srun. These will
# only run in one rank (the first in the list of allocated nodes)
preSrun = ''
cp -r ${input}/SodTubeBenchmark/* .
chmod +w -R .
sed -i '/maximum number of iterations/s/50/${toString conf.iterations}/' input.dat
rm -f nanos6.toml
'';
};
exec = {nextStage, conf, ...}: stages.exec {
inherit nextStage;
env = ''
export NANOS6_CONFIG_OVERRIDE="version.dependencies=regions"
'';
# Remove restarts as is not needed and is huge
post = ''
rm -rf restarts || true
'';
};
# Creams program
creams = {nextStage, conf, ...}: bsc.apps.creams.override {
inherit (conf) gitBranch;
};
pipeline = stdexp.stdPipelineOverride {
# Replace the stdandard srun stage with our own
overrides = { srun = customSrun; };
} ++ [ exec creams ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,126 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
, enableExtended ? false
}:
with lib;
with garlicTools;
let
# Initial variable configuration
varConf = {
nodes = range2 1 16;
granul = [ 16 ] ++ optionals (enableExtended) [ 8 32 ];
# Max. number of iterations
iterations = [ 20 ] ++ optionals (enableExtended) [ 10 ];
gitBranch = [
"garlic/tampi+isend+oss+task"
"garlic/mpi+send+omp+task"
"garlic/mpi+send+seq"
] ++ optionals (enableExtended) [
"garlic/mpi+send+omp+fork"
"garlic/mpi+send+oss+task"
"garlic/mpi+isend+omp+task"
"garlic/mpi+isend+oss+task"
];
};
# We use these auxiliary functions to assign different configurations
# depending on the git branch.
getGranul = branch: oldGranul:
if (branch == "garlic/mpi+send+seq")
then 999999 else oldGranul;
getCpusPerTask = branch: hw:
if (branch == "garlic/mpi+send+seq")
then 1 else hw.cpusPerSocket;
getNtasksPerNode = branch: hw:
if (branch == "garlic/mpi+send+seq")
then hw.cpusPerNode else hw.socketsPerNode;
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
expName = "creams-ss";
unitName = "${expName}"+
"-nodes${toString nodes}"+
"-granul${toString granul}"+
"-${gitBranch}";
inherit (targetMachine.config) hw;
# Options for creams
inherit (c) iterations gitBranch nodes;
granul = getGranul gitBranch c.granul;
nprocz = ntasksPerNode * nodes;
# Repeat the execution of each unit 10 times
loops = 10;
# Resources
qos = "debug";
time = "02:00:00";
ntasksPerNode = getNtasksPerNode gitBranch hw;
cpusPerTask = getCpusPerTask gitBranch hw;
jobName = unitName;
};
# Compute the array of configurations
configs = unique (stdexp.buildConfigs {
inherit varConf genConf;
});
# Custom srun stage to copy the creams input dataset
customSrun = {nextStage, conf, ...}:
let
input = bsc.garlic.apps.creamsInput.override {
inherit (conf) gitBranch granul nprocz;
};
in
stdexp.stdStages.srun {
inherit nextStage conf;
# Now we add some commands to execute before calling srun. These will
# only run in one rank (the first in the list of allocated nodes)
preSrun = ''
cp -r ${input}/SodTubeBenchmark/* .
chmod +w -R .
sed -i '/maximum number of iterations/s/50/${toString conf.iterations}/' input.dat
rm -f nanos6.toml
'';
};
exec = {nextStage, conf, ...}: stages.exec {
inherit nextStage;
env = ''
export NANOS6_CONFIG_OVERRIDE="version.dependencies=regions"
'';
# Remove restarts as is not needed and is huge
post = ''
rm -rf restarts || true
'';
};
# Creams program
creams = {nextStage, conf, ...}: bsc.apps.creams.override {
inherit (conf) gitBranch;
};
pipeline = stdexp.stdPipelineOverride {
# Replace the stdandard srun stage with our own
overrides = { srun = customSrun; };
} ++ [ exec creams ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,189 +0,0 @@
# This file defines an experiment. It is designed as a function that takes
# several parameters and returns a derivation. This derivation, when built will
# create several scripts that can be executed and launch the experiment.
# These are the inputs to this function: an attribute set which must contain the
# following keys:
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
}:
# We import in the scope the content of the `lib` attribute, which
# contain useful functions like `toString`, which will be used later. This is
# handy to avoid writting `lib.tostring`.
with lib;
# We also have some functions specific to the garlic benchmark which we import
# as well. Take a look at the garlic/tools.nix file for more details.
with garlicTools;
# The `let` keyword allows us to define some local variables which will be used
# later. It works as the local variable concept in the C language.
let
# Initial variable configuration: every attribute in this set contains lists
# of options which will be used to compute the configuration of the units. The
# cartesian product of all the values will be computed.
varConf = {
# In this case we will vary the columns and rows of the blocksize. This
# configuration will create 3 x 2 = 6 units.
cbs = [ 256 1024 4096 ];
rbs = [ 512 1024 ];
};
# Generate the complete configuration for each unit: genConf is a function
# that accepts the argument `c` and returns a attribute set. The attribute set
# is formed by joining the configuration of the machine (which includes
# details like the number of nodes or the architecture) and the configuration
# that we define for our units.
#
# Notice the use of the `rec` keyword, which allows us to access the elements
# of the set while is being defined.
genConf = c: targetMachine.config // rec {
# These attributes are user defined, and thus the user will need to handle
# them manually. They are not read by the standard pipeline:
# Here we load the `hw` attribute from the machine configuration, so we can
# access it, for example, the number of CPUs per socket as hw.cpusPerSocket.
hw = targetMachine.config.hw;
# These options will be used by the heat app, be we write them here so they
# are stored in the unit configuration.
timesteps = 10;
cols = 1024 * 16; # Columns
rows = 1024 * 16; # Rows
# The blocksize is set to the values passed in the `c` parameter, which will
# be set to one of all the configurations of the cartesian product. for
# example: cbs = 256 and rbs = 512.
# We can also write `inherit (c) cbs rbs`, as is a shorthand notation.
cbs = c.cbs;
rbs = c.rbs;
# The git branch is specified here as well, as will be used when we specify
# the heat app
gitBranch = "garlic/tampi+isend+oss+task";
# -------------------------------------------------------------------------
# These attributes are part of the standard pipeline, and are required for
# each experiment. They are automatically recognized by the standard
# execution pipeline.
# The experiment name:
expName = "example-granularity-heat";
# The experimental unit name. It will be used to create a symlink in the
# index (at /gpfs/projects/bsc15/garlic/$USER/index/) so you can easily find
# the unit. Notice that the symlink is overwritten each time you run a unit
# with the same same.
#
# We use the toString function to convert the numeric value of cbs and rbs
# to a string like: "example-granularity-heat.cbs-256.rbs-512"
unitName = expName +
".cbs-${toString cbs}" +
".rbs-${toString rbs}";
# Repeat the execution of each unit a few times: this option is
# automatically taken by the experiment, which will repeat the execution of
# the program that many times. It is recommended to run the app at least 30
# times, but we only used 10 here for demostration purposes (as it will be
# faster to run)
loops = 10;
# Resources: here we configure the resources in the machine. The queue to be
# used is `debug` as is the fastest for small jobs.
qos = "debug";
# Then the number of MPI processes or tasks per node:
ntasksPerNode = 1;
# And the number of nodes:
nodes = 1;
# We use all the CPUs available in one socket to each MPI process or task.
# Notice that the number of CPUs per socket is not specified directly. but
# loaded from the configuration of the machine that will be used to run our
# experiment. The affinity mask is set accordingly.
cpusPerTask = hw.cpusPerSocket;
# The time will limit the execution of the program in case of a deadlock
time = "02:00:00";
# The job name will appear in the `squeue` and helps to identify what is
# running. Currently is set to the name of the unit.
jobName = unitName;
};
# Using the `varConf` and our function `genConf` we compute a list of the
# complete configuration of every unit.
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
# Now that we have the list of configs, we need to write how that information
# is used to run our program. In our case we will use some params such as the
# number of rows and columns of the input problem or the blocksize as argv
# values.
# The exec stage is used to run a program with some arguments.
exec = {nextStage, conf, ...}: stages.exec {
# All stages require the nextStage attribute, which is passed as parameter.
inherit nextStage;
# Then, we fill the argv array with the elements that will be used when
# running our program. Notice that we load the attributes from the
# configuration which is passed as argument as well.
argv = [
"--rows" conf.rows
"--cols" conf.cols
"--rbs" conf.rbs
"--cbs" conf.cbs
"--timesteps" conf.timesteps
];
# This program requires a file called `head.conf` in the current directory.
# To do it, we run this small script in the `pre` hook, which simple runs
# some commands before running the program. Notice that this command is
# executed in every MPI task.
pre = ''
ln -sf ${nextStage}/etc/heat.conf heat.conf || true
'';
};
# The program stage is only used to specify which program we should run.
# We use this stage to specify build-time parameters such as the gitBranch,
# which will be used to fetch the source code. We use the `override` function
# of the `bsc.garlic.apps.heat` derivation to change the input paramenters.
program = {nextStage, conf, ...}: bsc.garlic.apps.heat.override {
inherit (conf) gitBranch;
};
# Other stages may be defined here, in case that we want to do something
# additional, like running the program under `perf stats` or set some
# envionment variables.
# Once all the stages are defined, we build the pipeline array. The
# `stdexp.stdPipeline` contains the standard pipeline stages, so we don't need
# to specify them. We only specify how we run our program, and what program
# exactly, by adding our `exec` and `program` stages:
pipeline = stdexp.stdPipeline ++ [ exec program ];
# Then, we use the `configs` and the `pipeline` just defined inside the `in`
# part, to build the complete experiment:
in
# The `stdexp.genExperiment` function generates an experiment by calling every
# stage of the pipeline with the different configs, and thus creating
# different units. The result is the top level derivation which is the
# `trebuchet`, which is the script that, when executed, launches the complete
# experiment.
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,128 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, stages
}:
with lib;
# Common definitions used by fwi experiments
rec {
branchesWithoutBlocksize = [
"garlic/mpi+send+omp+fork"
"garlic/mpi+send+seq"
];
# Returns true if the given config is in the forkJoinBranches list
needsBlocksize = c: ! any (e: c.gitBranch == e) branchesWithoutBlocksize;
# Set the blocksize to null for the fork join branch
fixBlocksize = c: if (needsBlocksize c) then c
else (c // { blocksize = null; });
# Generate the configs by filtering the unneded blocksizes
getConfigs = {varConf, genConf}:
let
allConfigs = stdexp.buildConfigs { inherit varConf genConf; };
in
# The unique function ensures that we only run one config for the fork
# join branch, even if we have multiple blocksizes.
unique (map fixBlocksize allConfigs);
getResources = {gitBranch, hw}:
if (gitBranch == "garlic/mpi+send+seq") then {
cpusPerTask = 1;
ntasksPerNode = hw.cpusPerNode;
} else {
cpusPerTask = hw.cpusPerSocket;
ntasksPerNode = hw.socketsPerNode;
};
exec = {nextStage, conf, ...}:
let
fwiParams = bsc.apps.fwi.params.override {
inherit (conf) nx ny nz;
};
ioFreq = if (conf.enableIO) then (conf.ioFreq or "-1") else "9999";
in stages.exec {
inherit nextStage;
# FIXME: FWI should allow the I/O directory to be specified as a
# parameter
pre = ''
FWI_SRUNDIR=$(pwd)
FWI_EXECDIR="${conf.tempDir}/out/$GARLIC_USER/$GARLIC_UNIT/$GARLIC_RUN"
FWI_PARAMS="${fwiParams}/fwi_params.txt"
FWI_FREQ="${fwiParams}/fwi_frequencies.txt"
# Run fwi in a directory with fast local storage
mkdir -p "$FWI_EXECDIR"
cd "$FWI_EXECDIR"
# Only generate the input if we have the CPU 0 (once per node)
if grep -o 'Cpus_allowed_list:[[:space:]]0' \
/proc/self/status > /dev/null;
then
FWI_CAPTAIN=1
fi
if [ $FWI_CAPTAIN ]; then
>&2 echo "generating the input dataset"
${fwiParams}/bin/ModelGenerator -m "$FWI_PARAMS" "$FWI_FREQ"
fi
echo >&2 "Current dir: $(pwd)"
echo >&2 "Using PARAMS=$FWI_PARAMS and FREQ=$FWI_FREQ"
'' + optionalString (conf.enableCTF) ''
export NANOS6_CONFIG_OVERRIDE="version.instrument=ctf"
'';
argv = [
''"$FWI_PARAMS"''
''"$FWI_FREQ"''
] ++ optional (needsBlocksize conf) conf.blocksize ++ [
"-1" # Fordward steps
"-1" # Backward steps
ioFreq # Write/read frequency
];
post = ''
# Go back to the garlic out directory
cd "$FWI_SRUNDIR"
if [ $FWI_CAPTAIN ]; then
'' + optionalString (conf.enableCTF) ''
# FIXME: We should specify the path in the nanos6 config, so we
# can avoid the race condition while they are generating the
# traces
sleep 3
# Save the traces
mv "$FWI_EXECDIR"/trace_* .
'' + ''
rm -rf "$FWI_EXECDIR"
fi
'';
};
apps = bsc.garlic.apps;
# FWI program
program = {nextStage, conf, ...}:
let
fwiParams = bsc.apps.fwi.params.override {
inherit (conf) nx ny nz;
};
in
apps.fwi.solver.override {
inherit (conf) gitBranch;
inherit fwiParams;
};
pipeline = stdexp.stdPipeline ++ [ exec program ];
}

View File

@ -1,71 +0,0 @@
# Regular granularity test for FWI
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
, callPackage
}:
with lib;
with garlicTools;
let
inherit (targetMachine) fs;
# Initial variable configuration
varConf = {
gitBranch = [ "garlic/tampi+isend+oss+task" ];
blocksize = range2 1 256;
n = [ {nx=100; nz=100; ny=8000; ntpn=2; nodes=1;} ];
};
machineConfig = targetMachine.config;
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
expName = "fwi-granularity";
unitName = "${expName}"
+ "-bs${toString blocksize}"
+ "-${toString gitBranch}";
inherit (machineConfig) hw;
inherit (c) gitBranch blocksize;
inherit (c.n) nx ny nz ntpn nodes;
# Other FWI parameters
enableIO = true;
enableCTF = false;
# Repeat the execution of each unit several times
loops = 10;
# Resources
cpusPerTask = hw.cpusPerSocket;
ntasksPerNode = ntpn;
qos = "debug";
time = "02:00:00";
jobName = unitName;
# Enable permissions to write in the local storage
extraMounts = [ fs.local.temp ];
tempDir = fs.local.temp;
};
common = callPackage ./common.nix {};
inherit (common) getConfigs pipeline;
configs = getConfigs {
inherit varConf genConf;
};
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,75 +0,0 @@
# Test FWI variants based on tasks with and without I/O.
# This experiment solves a computationally expensive input which brings the
# storage devices to saturation when I/O is enabled. The same input runs
# without I/O for comparison purposes. Also, a range of block sizes
# deemed as efficient according to the granularity experiment are
# explored.
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, callPackage
, enableExtended ? false
}:
with lib;
let
common = callPackage ./common.nix {};
inherit (common) getConfigs getResources pipeline;
inherit (targetMachine) fs;
# Initial variable configuration
varConf = {
gitBranch = [ "garlic/tampi+send+oss+task" ];
blocksize = [ 1 2 4 8 ];
n = [ {nx=500; nz=500; ny=16000;} ];
nodes = if (enableExtended) then range2 1 16 else [ 4 ];
enableIO = [ false true ];
};
machineConfig = targetMachine.config;
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
expName = "fwi-io";
unitName = "${expName}"
+ "-nodes${toString nodes}"
+ "-bs${toString blocksize}"
+ (if (enableIO) then "-io1" else "-io0")
+ "-${toString gitBranch}";
inherit (machineConfig) hw;
inherit (c) gitBranch blocksize enableIO nodes;
inherit (c.n) nx ny nz;
# Repeat the execution of each unit several times
loops = 10;
# Resources
inherit (getResources { inherit gitBranch hw; })
cpusPerTask ntasksPerNode;
qos = "debug";
time = "02:00:00";
jobName = unitName;
enableCTF = false;
# Enable permissions to write in the local storage
extraMounts = [ fs.local.temp ];
tempDir = fs.local.temp;
};
configs = getConfigs {
inherit varConf genConf;
};
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,91 +0,0 @@
# This test compares a FWI version using poor data locality (+NOREUSE) versus
# the optimized version (used for all other experiments). Follows a pseudocode
# snippet illustrating the fundamental difference between version.
#
# NOREUSE
# ----------------------
# for (y) for (x) for (z)
# computA(v[y][x][z]);
# for (y) for (x) for (z)
# computB(v[y][x][z]);
# for (y) for (x) for (z)
# computC(v[y][x][z]);
#
# Optimized version
# ----------------------
# for (y) for (x) for (z)
# computA(v[y][x][z]);
# computB(v[y][x][z]);
# computC(v[y][x][z]);
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, callPackage
}:
with lib;
let
inherit (targetMachine) fs;
# Initial variable configuration
varConf = {
gitBranch = [
"garlic/mpi+send+oss+task"
"garlic/mpi+send+oss+task+NOREUSE"
];
blocksize = [ 1 2 4 8 ];
n = [ {nx=300; ny=2000; nz=300;} ]; # / half node
};
machineConfig = targetMachine.config;
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
expName = "fwi-reuse";
unitName = "${expName}"
+ "-bs${toString blocksize}"
+ "-${toString gitBranch}";
inherit (machineConfig) hw;
inherit (c) gitBranch blocksize;
inherit (c.n) nx ny nz;
enableCTF = false;
enableIO = true;
# Repeat the execution of each unit several times
loops = 10;
# Resources
cpusPerTask = hw.cpusPerSocket;
ntasksPerNode = 1;
nodes = 1;
qos = "debug";
time = "02:00:00";
jobName = unitName;
# Enable permissions to write in the local storage
extraMounts = [ fs.local.temp ];
tempDir = fs.local.temp;
};
common = callPackage ./common.nix {};
inherit (common) getConfigs pipeline;
configs = getConfigs {
inherit varConf genConf;
};
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,90 +0,0 @@
# Strong scaling test for FWI variants based on tasks. This
# experiment explores a range of block sizes deemed as efficient
# according to the granularity experiment.
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
, callPackage
, enableExtended ? false
}:
with lib;
with garlicTools;
let
common = callPackage ./common.nix {};
inherit (common) getConfigs getResources pipeline;
inherit (targetMachine) fs;
# Initial variable configuration
varConf = {
gitBranch = [
"garlic/tampi+isend+oss+task"
] ++ optionals (enableExtended) [
"garlic/tampi+send+oss+task"
"garlic/mpi+send+omp+task"
"garlic/mpi+send+oss+task"
"garlic/mpi+send+omp+fork"
# FIXME: the mpi pure version has additional constraints with the
# number of planes in Y. By now is disabled.
#"garlic/mpi+send+seq"
];
blocksize = if (enableExtended)
then range2 1 16
else [ 2 ];
n = [ { nx=100; ny=8000; nz=100; } ];
nodes = range2 1 16;
};
machineConfig = targetMachine.config;
# Generate the complete configuration for each unit
genConf = c: machineConfig // rec {
expName = "fwi-ss";
unitName = "${expName}"
+ "-nodes${toString nodes}"
+ "-bs${toString blocksize}"
+ "-${toString gitBranch}";
inherit (machineConfig) hw;
inherit (c) gitBranch blocksize;
inherit (c.n) nx ny nz;
# Other FWI parameters
enableIO = true;
enableCTF = false;
# Repeat the execution of each unit several times
loops = 10;
# Resources
inherit (getResources { inherit gitBranch hw; })
cpusPerTask ntasksPerNode;
nodes = c.nodes;
qos = "debug";
time = "02:00:00";
jobName = unitName;
# Enable permissions to write in the local storage
extraMounts = [ fs.local.temp ];
tempDir = fs.local.temp;
};
configs = getConfigs {
inherit varConf genConf;
};
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,175 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
, writeText
, enablePerf ? false
, enableCTF ? false
, enableHWC ? false
, enableExtended ? false
}:
# TODO: Finish HWC first
assert (enableHWC == false);
with lib;
with garlicTools;
let
# Initial variable configuration
varConf = with bsc; {
cbs = range2 32 4096;
rbs = range2 32 4096;
};
machineConfig = targetMachine.config;
# Generate the complete configuration for each unit
genConf = with bsc; c: targetMachine.config // rec {
expName = "heat";
unitName = expName +
".cbs-${toString cbs}" +
".rbs-${toString rbs}";
inherit (machineConfig) hw;
# heat options
timesteps = 10;
cols = 1024 * 16; # Columns
rows = 1024 * 16; # Rows
inherit (c) cbs rbs;
gitBranch = "garlic/tampi+isend+oss+task";
# Repeat the execution of each unit 30 times
loops = 10;
# Resources
qos = "debug";
ntasksPerNode = 1;
nodes = 1;
time = "02:00:00";
# Assign one socket to each task (only one process)
cpusPerTask = hw.cpusPerSocket;
jobName = unitName;
};
filterConfigs = c: let
# Too small sizes lead to huge overheads
goodSize = (c.cbs * c.rbs >= 1024);
# When the extended units are not enabled, we only select those in
# the diagonal.
extended = if (enableExtended) then true
else c.cbs == c.rbs;
in
goodSize && extended;
# Compute the array of configurations
configs = filter (filterConfigs) (stdexp.buildConfigs {
inherit varConf genConf;
});
perf = {nextStage, conf, ...}: stages.perf {
inherit nextStage;
perfOptions = "stat -o .garlic/perf.csv -x , " +
"-e cycles,instructions,cache-references,cache-misses";
};
ctf = {nextStage, conf, ...}: let
# Create the nanos6 configuration file
nanos6ConfigFile = writeText "nanos6.toml" ''
version.instrument = "ctf"
turbo.enabled = false
instrument.ctf.converter.enabled = false
'' + optionalString (enableHWC) ''
hardware_counters.papi.enabled = true
hardware_counters.papi.counters = [
"PAPI_TOT_INS", "PAPI_TOT_CYC",
"PAPI_L1_TCM", "PAPI_L2_TCM", "PAPI_L3_TCM"
]
'';
in stages.exec {
inherit nextStage;
# And use it
env = ''
export NANOS6_CONFIG=${nanos6ConfigFile}
'';
# FIXME: We should run a hook *after* srun has ended, so we can
# execute it in one process only (not in N ranks). This hack works
# with one process only. Or be able to compute the name of the trace
# directory so we can begin the conversion in parallel
post = assert (conf.nodes * conf.ntasksPerNode == 1); ''
tracedir=$(ls -d trace_* | head -1)
echo "using tracedir=$tracedir"
offset=$(grep 'offset =' $tracedir/ctf/ust/uid/1000/64-bit/metadata | \
grep -o '[0-9]*')
echo "offset = $offset"
start_time=$(awk '/^start_time / {print $2}' stdout.log)
end_time=$(awk '/^end_time / {print $2}' stdout.log)
begin=$(awk "BEGIN{print $start_time*1e9 - $offset}")
end=$(awk "BEGIN{print $end_time*1e9 - $offset}")
echo "only events between $begin and $end"
${bsc.cn6}/bin/cn6 -s $tracedir
${bsc.cn6}/bin/cut $begin $end < $tracedir/prv/trace.prv |\
${bsc.cn6}/bin/hcut 1 ${toString conf.cpusPerTask} \
> $tracedir/prv/trace-cut.prv
${bsc.cn6}/bin/dur 6400025 0 < $tracedir/prv/trace-cut.prv |\
awk '{s+=$1} END {print s}' >> .garlic/time_mode_dead.csv &
${bsc.cn6}/bin/dur 6400025 1 < $tracedir/prv/trace-cut.prv |\
awk '{s+=$1} END {print s}' >> .garlic/time_mode_runtime.csv &
${bsc.cn6}/bin/dur 6400025 3 < $tracedir/prv/trace-cut.prv |\
awk '{s+=$1} END {print s}' >> .garlic/time_mode_task.csv &
wait
# Remove the traces at the end, as they are huge
rm -rf $tracedir
'';
# TODO: To enable HWC we need to first add a taskwait before the
# first get_time() measurement, otherwise we get the HWC of the
# main task, which will be huge.
};
exec = {nextStage, conf, ...}: stages.exec {
inherit nextStage;
argv = [
"--rows" conf.rows
"--cols" conf.cols
"--rbs" conf.rbs
"--cbs" conf.cbs
"--timesteps" conf.timesteps
];
# The next stage is the program
env = ''
ln -sf ${nextStage}/etc/heat.conf heat.conf || true
'';
};
program = {nextStage, conf, ...}: bsc.garlic.apps.heat.override {
inherit (conf) gitBranch;
};
pipeline = stdexp.stdPipeline ++
(optional enablePerf perf) ++
(optional enableCTF ctf) ++
[ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,73 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, stages
, callPackage
}:
with lib;
rec {
checkInput = {nextStage, conf, ...}: stages.exec {
inherit nextStage;
pre = optionalString (! (conf.enableGen or false)) (
let
gen = callPackage ./gen.nix { };
inputTre = gen.getInputTre conf;
exp = inputTre.experiment;
unit = elemAt exp.units 0;
expName = baseNameOf (toString exp);
unitName = baseNameOf (toString unit);
inputPath = "$GARLIC_OUT/${expName}/${unitName}/1";
in
''
# Force the generation of the input resultTree as a dependency:
# ${toString inputTre.result}
# Ensure the input dataset is still available
export HPCG_INPUT_PATH="${toString inputPath}"
if [ ! -e "$HPCG_INPUT_PATH" ]; then
>&2 echo "Missing input dataset: $HPCG_INPUT_PATH"
exit 1
fi
''
);
};
getSizePerTask = cpusPerTask: sizePerCpu:
mapAttrs (name: val: val * cpusPerTask) sizePerCpu;
exec = {nextStage, conf, ...}: let
actionArg = if (conf.enableGen or false)
then "--store=."
else "--load=\"$HPCG_INPUT_PATH\"";
in stages.exec {
inherit nextStage;
argv = [
"--nx=${toString conf.sizePerTask.x}"
"--ny=${toString conf.sizePerTask.y}"
"--nz=${toString conf.sizePerTask.z}"
"--npx=${toString conf.nprocs.x}"
"--npy=${toString conf.nprocs.y}"
"--npz=${toString conf.nprocs.z}"
"--nblocks=${toString conf.nblocks}"
"--ncomms=${toString conf.ncomms}"
# The input symlink is generated by the input stage, which is generated by
# the genInput function.
actionArg
] ++ optional (conf.disableAspectRatio or false) "--no-ar=1";
};
program = {nextStage, conf, ...}: bsc.apps.hpcg.override {
inherit (conf) gitBranch;
};
pipeline = stdexp.stdPipeline ++ [
checkInput
exec program ];
}

View File

@ -1,52 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
, callPackage
}:
with lib;
with garlicTools;
rec {
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
expName = "hpcg-gen";
unitName = expName
+ "-nodes${toString nodes}"
+ "-spt.z${toString sizePerTask.z}";
inherit (targetMachine.config) hw;
# Inherit options from the current conf
inherit (c) sizePerTask nprocs disableAspectRatio gitBranch
cpusPerTask ntasksPerNode nodes;
# nblocks and ncomms are ignored from c
ncomms = 1;
nblocks = 1;
# We only need one run
loops = 1;
# Generate the input
enableGen = true;
# Resources
qos = "debug";
time = "02:00:00";
jobName = unitName;
};
common = callPackage ./common.nix {};
getInputTre = conf: stdexp.genExperiment {
configs = [ (genConf conf) ];
pipeline = common.pipeline;
};
}

View File

@ -1,76 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
, callPackage
}:
with lib;
with garlicTools;
let
common = callPackage ./common.nix { };
inherit (common) pipeline getSizePerTask;
maxNodes = 16;
# Initial variable configuration
varConf = {
blocksPerCpu = range2 0.5 256;
gitBranch = [
"garlic/tampi+isend+oss+task"
];
};
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
expName = "hpcg-granularity";
unitName = "${expName}"
+ "-nodes${toString nodes}"
+ "-bpc${toString blocksPerCpu}";
inherit (targetMachine.config) hw;
inherit maxNodes;
sizeFactor = maxNodes / nodes;
# hpcg options
inherit (c) blocksPerCpu gitBranch;
baseSizeZ = 16;
nodes = 1;
totalTasks = ntasksPerNode * nodes;
sizePerCpu = {
x = 2;
y = 2;
z = baseSizeZ * sizeFactor;
};
sizePerTask = getSizePerTask cpusPerTask sizePerCpu;
nprocs = { x=1; y=1; z=totalTasks; };
nblocks = floatTruncate (blocksPerCpu * cpusPerTask);
ncomms = 1;
disableAspectRatio = true;
# Repeat the execution of each unit several times
loops = 3;
# Resources
qos = "debug";
time = "02:00:00";
cpusPerTask = hw.cpusPerSocket;
ntasksPerNode = hw.socketsPerNode;
jobName = unitName;
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,78 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
, callPackage
, enableExtended ? false
, enableStrong ? true
}:
with lib;
with garlicTools;
let
common = callPackage ./common.nix { };
inherit (common) pipeline getSizePerTask;
maxNodes = 16;
# Initial variable configuration
varConf = {
nodes = range2 1 maxNodes;
baseSizeZ = if (enableExtended) then [ 8 16 ] else [ 16 ];
blocksPerCpu = if (enableExtended) then range2 1 8 else [ 4 ];
gitBranch = [
"garlic/tampi+isend+oss+task"
];
};
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
expName = if (enableStrong) then "hpcg-ss" else "hpcg-ws";
unitName = "${expName}"
+ "-nodes${toString nodes}"
+ "-bpc${toString blocksPerCpu}";
inherit (targetMachine.config) hw;
inherit maxNodes;
sizeFactor = if (enableStrong) then maxNodes / nodes else 1;
# hpcg options
inherit (c) nodes blocksPerCpu gitBranch;
totalTasks = ntasksPerNode * nodes;
sizePerCpu = {
x = 2;
y = 2;
z = c.baseSizeZ * sizeFactor;
};
sizePerTask = getSizePerTask cpusPerTask sizePerCpu;
nprocs = { x=1; y=1; z=totalTasks; };
nblocks = blocksPerCpu * cpusPerTask;
ncomms = 1;
disableAspectRatio = true;
# Repeat the execution of each unit several times
loops = 10;
# Resources
qos = "debug";
time = "02:00:00";
cpusPerTask = hw.cpusPerSocket;
ntasksPerNode = hw.socketsPerNode;
jobName = unitName;
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,65 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
, callPackage
}:
with lib;
with garlicTools;
let
common = callPackage ./common.nix { };
inherit (common) pipeline getSizePerTask;
# Initial variable configuration
varConf = {
sizeFactor = [ 1 2 4 8 16 32 ];
};
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
expName = "hpcg-size";
unitName = "${expName}"
+ "-nodes${toString nodes}"
+ "-sf${toString sizeFactor}";
inherit (targetMachine.config) hw;
# hpcg options
inherit (c) sizeFactor;
gitBranch = "garlic/tampi+isend+oss+task";
nodes = 16;
totalTasks = ntasksPerNode * nodes;
sizePerCpu = { x = 2; y = 2; z = 4 * sizeFactor; };
sizePerTask = getSizePerTask cpusPerTask sizePerCpu;
nprocs = { x=1; y=1; z=totalTasks; };
blocksPerCpu = 4;
nblocks = blocksPerCpu * cpusPerTask;
ncomms = 1;
disableAspectRatio = true;
# Repeat the execution of each unit several times
loops = 5;
# Resources
qos = "debug";
time = "02:00:00";
cpusPerTask = hw.cpusPerSocket;
ntasksPerNode = hw.socketsPerNode;
jobName = unitName;
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,108 +0,0 @@
{
super
, self
, bsc
, garlic
, callPackage
}:
{
nbody = rec {
granularity = callPackage ./nbody/granularity.nix { };
ss = callPackage ./nbody/ss.nix { };
numa = callPackage ./nbody/numa.nix { };
};
saiph = {
granularity = callPackage ./saiph/granularity.nix { };
ss = callPackage ./saiph/ss.nix { };
};
creams = rec {
ss = callPackage ./creams/ss.nix { };
granularity = callPackage ./creams/granularity.nix { };
size = callPackage ./creams/size.nix { };
granularity16 = callPackage ./creams/granularity16.nix { };
# These experiments are the extended versions of the previous
# ones. We split them so we can keep a reasonable execution time
big.granularity = granularity.override { enableExtended = true; };
big.ss = granularity.override { enableExtended = true; };
};
hpcg = rec {
granularity = callPackage ./hpcg/granularity.nix { };
ss = callPackage ./hpcg/scaling.nix { };
ws = ss.override { enableStrong=false; };
size = callPackage ./hpcg/size.nix { };
big.ss = ss.override { enableExtended = true; };
};
heat = rec {
granularity = callPackage ./heat/granularity.nix { };
cache = granularity.override { enablePerf = true; };
ctf = granularity.override { enableCTF = true; };
};
bigsort = rec {
genseq = callPackage ./bigsort/genseq.nix {
n = toString (1024 * 1024 * 1024 / 8); # 1 GB input size
dram = toString (1024 * 1024 * 1024); # 1 GB chunk
};
shuffle = callPackage ./bigsort/shuffle.nix {
inputTre = genseq;
n = toString (1024 * 1024 * 1024 / 8); # 1 GB input size
dram = toString (1024 * 1024 * 1024); # 1 GB chunk
inherit (bsc.garlic.pp) resultFromTrebuchet;
};
sort = callPackage ./bigsort/sort.nix {
inputTre = shuffle;
inherit (bsc.garlic.pp) resultFromTrebuchet;
removeOutput = false;
};
};
slurm = {
cpu = callPackage ./slurm/cpu.nix { };
sigsegv = callPackage ./slurm/sigsegv.nix { };
exit1 = callPackage ./slurm/exit1.nix { };
};
lulesh = {
test = callPackage ./lulesh/test.nix { };
};
fwi = rec {
granularity = callPackage ./fwi/granularity.nix { };
ss = callPackage ./fwi/ss.nix { };
reuse = callPackage ./fwi/reuse.nix { };
io = callPackage ./fwi/io.nix { };
# Extended experiments
big.io = io.override { enableExtended = true; };
};
osu = rec {
latency = callPackage ./osu/latency.nix { };
latencyShm = latency.override { interNode = false; };
latencyMt = latency.override { enableMultithread = true; };
latencyMtShm = latency.override { enableMultithread = true; interNode = true; };
bw = callPackage ./osu/bw.nix { };
impi = callPackage ./osu/impi.nix { };
bwShm = bw.override { interNode = false; };
mtu = callPackage ./osu/mtu.nix { };
eager = callPackage ./osu/eager.nix { };
};
examples = {
granularity = callPackage ./examples/granularity.nix { };
};
cn6 = {
timediff = callPackage ./cn6/timediff.nix { };
nbody = callPackage ./cn6/nbody.nix { };
};
}

View File

@ -1,85 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
}:
with lib;
let
# Initial variable configuration
varConf = with bsc; {
gitBranch = [
"garlic/mpi+isend+seq"
"garlic/tampi+isend+oss+taskloop"
"garlic/tampi+isend+oss+taskfor"
"garlic/tampi+isend+oss+task"
"garlic/mpi+isend+seq"
"garlic/mpi+isend+oss+task"
"garlic/mpi+isend+omp+fork"
"garlic/tampi+isend+oss+taskloopfor"
];
};
machineConfig = targetMachine.config;
# Generate the complete configuration for each unit
genConf = with bsc; c: targetMachine.config // rec {
expName = "lulesh";
unitName = "${expName}-test";
inherit (machineConfig) hw;
# options
iterations = 10;
size = 30;
gitBranch = c.gitBranch;
# Repeat the execution of each unit several times
loops = 10;
# Resources
qos = "debug";
cpusPerTask = hw.cpusPerSocket;
ntasksPerNode = 1;
nodes = 1;
time = "02:00:00";
jobName = unitName;
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
/* Lulesh options:
-q : quiet mode - suppress all stdout
-i <iterations> : number of cycles to run
-s <size> : length of cube mesh along side
-r <numregions> : Number of distinct regions (def: 11)
-b <balance> : Load balance between regions of a domain (def: 1)
-c <cost> : Extra cost of more expensive regions (def: 1)
-f <numfiles> : Number of files to split viz dump into (def: (np+10)/9)
-p : Print out progress
-v : Output viz file (requires compiling with -DVIZ_MESH
-h : This message
*/
exec = {nextStage, conf, ...}: with conf; stages.exec {
inherit nextStage;
argv = [ "-i" iterations "-s" size ];
};
apps = bsc.garlic.apps;
program = {nextStage, conf, ...}: apps.lulesh.override {
inherit (conf) gitBranch;
};
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,37 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, stages
, numactl
, garlicTools
}:
with lib;
with garlicTools;
rec {
getConfigs = {varConf, genConf}: stdexp.buildConfigs {
inherit varConf genConf;
};
exec = {nextStage, conf, ...}: stages.exec
(
{
inherit nextStage;
argv = with conf; [ "-t" timesteps "-p" particles ];
}
# Use numactl to use the interleave policy if requested (default is
# false)
// optionalAttrs (conf.interleaveMem or false) {
program = "${numactl}/bin/numactl --interleave=all ${stageProgram nextStage}";
}
);
program = {nextStage, conf, ...}: bsc.garlic.apps.nbody.override {
inherit (conf) blocksize gitBranch;
};
pipeline = stdexp.stdPipeline ++ [ exec program ];
}

View File

@ -1,60 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
, callPackage
}:
with lib;
with garlicTools;
let
# Initial variable configuration
varConf = {
blocksize = range2 64 2048;
gitBranch = [
# "garlic/mpi+send+oss+task"
# "garlic/tampi+send+oss+task"
"garlic/tampi+isend+oss+task"
];
};
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
hw = targetMachine.config.hw;
particles = 8 * 1024 * hw.cpusPerSocket;
timesteps = 10;
blocksize = c.blocksize;
gitBranch = c.gitBranch;
expName = "nbody-granularity";
unitName = expName +
"-${toString gitBranch}" +
"-bs${toString blocksize}";
loops = 10;
qos = "debug";
cpusPerTask = hw.cpusPerSocket;
ntasksPerNode = hw.socketsPerNode;
nodes = 1;
time = "02:00:00";
jobName = unitName;
};
common = callPackage ./common.nix {};
inherit (common) getConfigs pipeline;
configs = getConfigs {
inherit varConf genConf;
};
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,64 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
, numactl
, callPackage
}:
with lib;
with garlicTools;
let
# Initial variable configuration
varConf = {
blocksize = range2 256 1024;
gitBranch = [ "garlic/tampi+send+oss+task" ];
attachToSocket = [ true false ];
interleaveMem = [ true false ];
};
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
hw = targetMachine.config.hw;
particles = 4 * 1024 * hw.cpusPerSocket;
timesteps = 10;
inherit (c) attachToSocket interleaveMem gitBranch blocksize;
expName = "nbody-numa";
unitName = expName +
"-${toString gitBranch}" +
"-bs.${toString blocksize}" +
"-tpn.${toString ntasksPerNode}" +
"-interleave.${if (interleaveMem) then "yes" else "no"}";
loops = 10;
qos = "debug";
cpusPerTask = if (attachToSocket)
then hw.cpusPerSocket
else hw.cpusPerNode;
ntasksPerNode = if (attachToSocket)
then hw.socketsPerNode
else 1;
nodes = 4;
time = "02:00:00";
jobName = unitName;
};
common = callPackage ./common.nix {};
inherit (common) getConfigs pipeline;
configs = getConfigs {
inherit varConf genConf;
};
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,60 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
}:
with lib;
with garlicTools;
let
# Initial variable configuration
varConf = {
blocksize = [ 128 256 512 1024 2048 4096 ];
};
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
hw = targetMachine.config.hw;
particles = 4096 * hw.cpusPerSocket;
timesteps = 10;
blocksize = c.blocksize;
gitBranch = "garlic/oss+task";
expName = "nbody-granularity";
unitName = expName + "-bs${toString blocksize}";
loops = 30;
qos = "debug";
ntasksPerNode = 1;
nodes = 1;
time = "02:00:00";
cpusPerTask = hw.cpusPerSocket;
jobName = unitName;
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
exec = {nextStage, conf, ...}: stages.exec {
inherit nextStage;
argv = [ "-t" conf.timesteps "-p" conf.particles ];
};
program = {nextStage, conf, ...}: with conf; bsc.garlic.apps.nbody.override {
inherit (conf) blocksize gitBranch;
};
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,104 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
# Options for the experiment
, enableCTF ? false
# Number of cases tested
, steps ? 7
# nbody iterations
, timesteps ? 10
# nbody total number of particles
, particles ? null
, gitBranch ? "garlic/tampi+send+oss+task"
, loops ? 10
, nblocks0 ? null
}:
with lib;
with garlicTools;
let
defaultOpt = var: def: if (var != null) then var else def;
machineConfig = targetMachine.config;
inherit (machineConfig) hw;
# Initial variable configuration
varConf = with bsc; {
# Create a list with values 2^n with n from 0 to (steps - 1) inclusive
i = expRange 2 0 (steps - 1);
};
# Generate the complete configuration for each unit
genConf = var: fix (self: var // targetMachine.config // {
expName = "nbody-nblocks";
unitName = "${self.expName}${toString self.nblocks}";
inherit (machineConfig) hw;
# nbody options
particles = defaultOpt particles (4096 * self.hw.cpusPerSocket);
nblocks0 = defaultOpt nblocks0 (self.hw.cpusPerSocket / 2);
# The number of blocks is then computed from the multiplier "i" and
# the initial number of blocks "nblocks0"
nblocks = self.i * self.nblocks0;
totalTasks = self.ntasksPerNode * self.nodes;
particlesPerTask = self.particles / self.totalTasks;
blocksize = self.particlesPerTask / self.nblocks;
cc = bsc.icc;
mpi = bsc.impi;
cflags = "-g";
inherit timesteps gitBranch enableCTF loops;
# Resources
qos = "debug";
cpusPerTask = self.hw.cpusPerSocket;
ntasksPerNode = self.hw.socketsPerNode;
nodes = 1;
jobName = self.unitName;
});
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
perf = {nextStage, conf, ...}: with conf; stages.perf {
inherit nextStage;
perfOptions = "record --call-graph dwarf -o \\$\\$.perf";
};
ctf = {nextStage, conf, ...}: with conf; stages.exec {
inherit nextStage;
env = optionalString (conf.enableCTF) ''
export NANOS6_CONFIG_OVERRIDE="version.instrument=ctf,\
instrument.ctf.converter.enabled=false"
'';
};
exec = {nextStage, conf, ...}: with conf; stages.exec {
inherit nextStage;
argv = [ "-t" timesteps "-p" particles ];
};
program = {nextStage, conf, ...}: with conf;
let
customPkgs = stdexp.replaceMpi conf.mpi;
in
customPkgs.apps.nbody.override ({
inherit cc blocksize mpi gitBranch cflags;
});
pipeline = stdexp.stdPipeline ++ [ ctf exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,110 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
# Options for the experiment
, enableCTF ? false
# Number of cases tested
, steps ? 6
# nbody iterations
, timesteps ? 10
# nbody total number of particles
, particles ? null
, loops ? 10
, nblocks0 ? null
}:
with lib;
with garlicTools;
let
defaultOpt = var: def: if (var != null) then var else def;
machineConfig = targetMachine.config;
inherit (machineConfig) hw;
# Initial variable configuration
varConf = with bsc; {
# Create a list with values 2^n with n from 0 to (steps - 1) inclusive
i = expRange 2 0 (steps - 1);
nodes = [ 1 2 4 8 16 ];
gitBranch = [
"garlic/tampi+send+oss+task"
"garlic/tampi+isend+oss+task"
"garlic/mpi+send+oss+task"
];
};
# Generate the complete configuration for each unit
genConf = var: fix (self: var // targetMachine.config // {
expName = "nbody-scaling";
unitName = self.expName +
"-nb${toString self.nblocks}"+
"-nodes${toString self.nodes}";
inherit (machineConfig) hw;
# nbody options
particles = defaultOpt particles (4096 * self.hw.cpusPerSocket);
nblocks0 = defaultOpt nblocks0 (self.hw.cpusPerSocket / 2);
# The number of blocks is then computed from the multiplier "i" and
# the initial number of blocks "nblocks0"
nblocks = self.i * self.nblocks0;
totalTasks = self.ntasksPerNode * self.nodes;
particlesPerTask = self.particles / self.totalTasks;
blocksize = self.particlesPerTask / self.nblocks;
cc = bsc.icc;
mpi = bsc.impi;
cflags = "-g";
inherit timesteps enableCTF loops;
# Resources
qos = "debug";
cpusPerTask = self.hw.cpusPerSocket;
ntasksPerNode = self.hw.socketsPerNode;
jobName = self.unitName;
});
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
perf = {nextStage, conf, ...}: with conf; stages.perf {
inherit nextStage;
perfOptions = "record --call-graph dwarf -o \\$\\$.perf";
};
ctf = {nextStage, conf, ...}: with conf; stages.exec {
inherit nextStage;
env = optionalString (conf.enableCTF) ''
export NANOS6_CONFIG_OVERRIDE="version.instrument=ctf,\
instrument.ctf.converter.enabled=false"
'';
};
exec = {nextStage, conf, ...}: with conf; stages.exec {
inherit nextStage;
argv = [ "-t" timesteps "-p" particles ];
};
program = {nextStage, conf, ...}: with conf;
let
customPkgs = stdexp.replaceMpi conf.mpi;
in
customPkgs.apps.nbody.override ({
inherit (conf) cc blocksize mpi gitBranch cflags;
});
pipeline = stdexp.stdPipeline ++ [ ctf exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,72 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
}:
with lib;
let
# Initial variable configuration
varConf = with bsc; {
numProcsAndParticles = [ 1 2 4 8 16 32 48 ];
input = [
{ numParticles=1 ; cpuMask="0x1"; }
{ numParticles=2 ; cpuMask="0x3"; }
{ numParticles=4 ; cpuMask="0xf"; }
{ numParticles=8 ; cpuMask="0xff"; }
{ numParticles=16; cpuMask="0xffff"; }
{ numParticles=32; cpuMask="0xffffffff"; }
{ numParticles=48; cpuMask="0xffffffffffff"; }
];
};
# Generate the complete configuration for each unit
genConf = with bsc; c: targetMachine.config // rec {
# nbody options
inherit (c.input) numParticles cpuMask;
particles = 1024 * numParticles * 2;
timesteps = 10;
blocksize = 1024;
cc = icc;
mpi = impi;
gitBranch = "garlic/oss+task";
# Repeat the execution of each unit 30 times
loops = 30;
# Resources
qos = "debug";
ntasksPerNode = 1;
nodes = 1;
time = "02:00:00";
cpuBind = "verbose,mask_cpu:${cpuMask}";
jobName = "nbody-bs-${toString numParticles}-${gitBranch}";
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
exec = {nextStage, conf, ...}: with conf; stages.exec {
inherit nextStage;
argv = [ "-t" timesteps "-p" particles ];
};
program = {nextStage, conf, ...}: with conf;
let
customPkgs = stdexp.replaceMpi conf.mpi;
in
customPkgs.apps.nbody.override {
inherit cc blocksize mpi gitBranch;
};
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,63 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
}:
with lib;
let
# Initial variable configuration
varConf = with bsc; {
numProcs = [ 1 2 4 8 16 32 48 ];
};
# Generate the complete configuration for each unit
genConf = with bsc; c: targetMachine.config // rec {
# nbody options
particles = 1024 * 64;
timesteps = 10;
blocksize = 1024;
inherit (c) numProcs;
cc = icc;
mpi = impi;
gitBranch = "garlic/mpi+send";
# Repeat the execution of each unit 30 times
loops = 30;
# Resources
qos = "debug";
ntasksPerNode = numProcs;
nodes = 1;
time = "02:00:00";
cpuBind = "sockets,verbose";
jobName = "nbody-bs-${toString numProcs}-${gitBranch}";
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
exec = {nextStage, conf, ...}: with conf; stages.exec {
inherit nextStage;
argv = [ "-t" timesteps "-p" particles ];
};
program = {nextStage, conf, ...}: with conf;
let
customPkgs = stdexp.replaceMpi conf.mpi;
in
customPkgs.apps.nbody.override {
inherit cc blocksize mpi gitBranch;
};
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,63 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
}:
with lib;
let
# Initial variable configuration
varConf = with bsc; {
cpuMask = [ "0x1" "0x3" "0xf" "0xff" "0xffff" "0xffffffff" "0xffffffffffff" ];
};
# Generate the complete configuration for each unit
genConf = with bsc; c: targetMachine.config // rec {
# nbody options
particles = 1024 * 64;
timesteps = 10;
blocksize = 1024;
inherit (c) cpuMask;
cc = icc;
mpi = impi;
gitBranch = "garlic/oss+task";
# Repeat the execution of each unit 30 times
loops = 30;
# Resources
qos = "debug";
ntasksPerNode = 1;
nodes = 1;
time = "02:00:00";
cpuBind = "verbose,mask_cpu:${cpuMask}";
jobName = "nbody-bs-${cpuMask}-${gitBranch}";
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
exec = {nextStage, conf, ...}: with conf; stages.exec {
inherit nextStage;
argv = [ "-t" timesteps "-p" particles ];
};
program = {nextStage, conf, ...}: with conf;
let
customPkgs = stdexp.replaceMpi conf.mpi;
in
customPkgs.apps.nbody.override {
inherit cc blocksize mpi gitBranch;
};
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,59 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
, callPackage
}:
with lib;
with garlicTools;
let
# Initial variable configuration
varConf = {
blocksize = [ 128 ];
nodes = range2 1 16;
gitBranch = [
# "garlic/mpi+send+oss+task"
# "garlic/tampi+send+oss+task"
"garlic/tampi+isend+oss+task"
];
};
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
hw = targetMachine.config.hw;
particles = 8 * 1024 * hw.cpusPerSocket;
timesteps = 10;
inherit (c) blocksize nodes gitBranch;
expName = "nbody-scaling";
unitName = expName +
"-${toString gitBranch}" +
"-nodes${toString nodes}";
loops = 5;
qos = "debug";
ntasksPerNode = hw.socketsPerNode;
time = "02:00:00";
cpusPerTask = hw.cpusPerSocket;
jobName = unitName;
};
common = callPackage ./common.nix {};
inherit (common) getConfigs pipeline;
configs = getConfigs {
inherit varConf genConf;
};
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,60 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
# Should we test the network (true) or the shared memory (false)?
, interNode ? true
}:
with builtins;
with lib;
let
machineConfig = targetMachine.config;
# Initial variable configuration
varConf = with bsc; {
mpi = [ impi bsc.openmpi mpich ]; #psmpi ];
};
# Generate the complete configuration for each unit
genConf = with bsc; c: targetMachine.config // rec {
inherit (machineConfig) hw;
nodes = if interNode then 2 else 1;
ntasksPerNode = if interNode then 1 else 2;
cpusPerTask = 1;
time = "00:10:00";
qos = "debug";
loops = 30;
expName = "osu-bw-${mpi.name}";
unitName = expName;
jobName = expName;
inherit (c) mpi;
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
exec = {nextStage, conf, ...}: with conf; stages.exec {
inherit nextStage;
program = "${nextStage}/bin/osu_bw";
};
program = {nextStage, conf, ...}: bsc.osumb.override {
# Use the specified MPI implementation
inherit (conf) mpi;
};
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,84 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
}:
with builtins;
with lib;
let
machineConfig = targetMachine.config;
# Initial variable configuration
varConf = with bsc; {
sizeKB = range 5 25;
mpi = [ impi ];
#mpi = [ impi bsc.openmpi mpich ]; #psmpi ];
PSM2_MQ_EAGER_SDMA_SZ_KB = [ 16 20 24 ];
PSM2_MTU_KB = [ 10 ];
};
# Generate the complete configuration for each unit
genConf = with bsc; c: targetMachine.config // rec {
inherit (machineConfig) hw;
nodes = 2;
ntasksPerNode = 1;
cpusPerTask = 1;
time = "00:30:00";
qos = "debug";
loops = 10;
iterations = 50000;
#FIXME: Notice the switchover is 16000 and MTU is 10240
PSM2_MQ_EAGER_SDMA_SZ = PSM2_MQ_EAGER_SDMA_SZ_KB * 1000;
PSM2_MTU = PSM2_MTU_KB * 1024;
expName = "osu-bw";
unitName = expName +
"-size.${toString sizeKB}K" +
"-mtu.${toString PSM2_MTU_KB}K" +
"-sdma.${toString PSM2_MQ_EAGER_SDMA_SZ_KB}K";
jobName = expName;
inherit (c) mpi sizeKB
PSM2_MQ_EAGER_SDMA_SZ_KB
PSM2_MTU_KB;
size = sizeKB * 1024;
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
exec = {nextStage, conf, ...}: with conf; stages.exec {
inherit nextStage;
program = "${nextStage}/bin/osu_bw";
env = ''
export PSM2_MQ_EAGER_SDMA_SZ=${toString PSM2_MQ_EAGER_SDMA_SZ}
export PSM2_MTU=${toString PSM2_MTU}
export PSM2_TRACEMASK=0x101
export PSM2_MQ_PRINT_STATS=-1
'';
argv = [
"-m" "${toString size}:${toString size}"
"-i" iterations
];
};
program = {nextStage, conf, ...}: bsc.osumb.override {
# Use the specified MPI implementation
inherit (conf) mpi;
};
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,69 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
# Should we test the network (true) or the shared memory (false)?
, interNode ? true
}:
with builtins;
with lib;
let
machineConfig = targetMachine.config;
# Initial variable configuration
varConf = with bsc; {
threshold = [ 8000 16000 32000 64000 ];
#threshold = [ 4096 8192 10240 ];
};
# Generate the complete configuration for each unit
genConf = with bsc; c: targetMachine.config // rec {
inherit (machineConfig) hw;
nodes = if interNode then 2 else 1;
ntasksPerNode = if interNode then 1 else 2;
mpi = impi;
cpusPerTask = 1;
time = "00:10:00";
qos = "debug";
loops = 10;
expName = "osu-impi-rndv";
unitName = expName + "-${toString threshold}";
jobName = expName;
inherit (c) threshold;
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
exec = {nextStage, conf, ...}: stages.exec {
inherit nextStage;
env = ''
export PSM2_MQ_RNDV_SHM_THRESH=${toString conf.threshold}
export PSM2_MQ_RNDV_HFI_THRESH=${toString conf.threshold}
export PSM2_MQ_EAGER_SDMA_SZ=${toString conf.threshold}
#export PSM2_MTU=${toString conf.threshold}
export PSM2_TRACEMASK=0x101
'';
program = "${nextStage}/bin/osu_bw";
};
program = {nextStage, conf, ...}: bsc.osumb.override {
# Use the specified MPI implementation
inherit (conf) mpi;
};
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,69 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
# Should we test the network (true) or the shared memory (false)?
, interNode ? true
, enableMultithread ? false
}:
with builtins;
with lib;
let
machineConfig = targetMachine.config;
# Initial variable configuration
varConf = with bsc; {
mpi = [ impi bsc.openmpi mpich ]; #psmpi ];
};
# Generate the complete configuration for each unit
genConf = with bsc; c: targetMachine.config // rec {
inherit (machineConfig) hw;
nodes = if interNode then 2 else 1;
ntasksPerNode = if interNode then 1 else 2;
cpusPerTask = if (enableMultithread) then hw.cpusPerSocket else 1;
time = "00:10:00";
qos = "debug";
loops = 30;
expName = "osu-latency-${mpi.name}";
unitName = expName;
jobName = expName;
inherit (c) mpi;
inherit enableMultithread;
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
exec = {nextStage, conf, ...}: with conf; stages.exec {
inherit nextStage;
program = if (enableMultithread) then
"${nextStage}/bin/osu_latency_mt"
else
"${nextStage}/bin/osu_latency";
argv = optionals (enableMultithread) [
"-t" "${toString conf.cpusPerTask}:${toString conf.cpusPerTask}"
];
};
program = {nextStage, conf, ...}: bsc.osumb.override {
# Use the specified MPI implementation
inherit (conf) mpi;
};
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,84 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
}:
with builtins;
with lib;
let
machineConfig = targetMachine.config;
# Initial variable configuration
varConf = with bsc; {
sizeKB = range 5 25;
mpi = [ impi ];
#mpi = [ impi bsc.openmpi mpich ]; #psmpi ];
PSM2_MQ_EAGER_SDMA_SZ_KB = [ 16 ];
PSM2_MTU_KB = [ 8 10 ];
};
# Generate the complete configuration for each unit
genConf = with bsc; c: targetMachine.config // rec {
inherit (machineConfig) hw;
nodes = 2;
ntasksPerNode = 1;
cpusPerTask = 1;
time = "00:30:00";
qos = "debug";
loops = 10;
iterations = 50000;
#FIXME: Notice the switchover is 16000 and MTU is 10240
PSM2_MQ_EAGER_SDMA_SZ = PSM2_MQ_EAGER_SDMA_SZ_KB * 1000;
PSM2_MTU = PSM2_MTU_KB * 1024;
expName = "osu-bw";
unitName = expName +
"-size.${toString sizeKB}K" +
"-mtu.${toString PSM2_MTU_KB}K" +
"-sdma.${toString PSM2_MQ_EAGER_SDMA_SZ_KB}K";
jobName = expName;
inherit (c) mpi sizeKB
PSM2_MQ_EAGER_SDMA_SZ_KB
PSM2_MTU_KB;
size = sizeKB * 1024;
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
exec = {nextStage, conf, ...}: with conf; stages.exec {
inherit nextStage;
program = "${nextStage}/bin/osu_bw";
env = ''
export PSM2_MQ_EAGER_SDMA_SZ=${toString PSM2_MQ_EAGER_SDMA_SZ}
export PSM2_MTU=${toString PSM2_MTU}
export PSM2_TRACEMASK=0x101
export PSM2_MQ_PRINT_STATS=-1
'';
argv = [
"-m" "${toString size}:${toString size}"
"-i" iterations
];
};
program = {nextStage, conf, ...}: bsc.osumb.override {
# Use the specified MPI implementation
inherit (conf) mpi;
};
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,132 +0,0 @@
#######################################################################
# Saiph, granularity experiment:
#
# App:Heat 3D - garlic/tampi+isend+oss+task+simd branch
# App details:
# 3D mesh of ~400*400*400 points
# nbgx = global blocks in the X dimension
# nbgy = global blocks in the Y dimension
# nbgz = global blocks in the Z dimension
# --> nbgx*nbgy*nbgz = global distributed blocks
# nbly = local blocks in the Y dimension
# nblz = local blocks in the Z dimension
# --> nbly*nblz = local blocks (#tasks)
#
# Granularity experiment configuration:
# Single-core run
# MPI binded to sockets: MPI procs = 2
# Mesh distributed across third dimension to ensure contiguous
# communications
# --> nbgx = 1, nbgy = 1
# First dimension cannot be locally blocked (simd reasons)
# Second and third dimension local blocking limited by local mesh size
#
#######################################################################
# Common packages, tools and options
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
}:
with lib;
with garlicTools;
let
# Variable configurations
varConf = with targetMachine.config; {
# Local blocks per dimension
nblx = [ 1 ]; # SIMD
nbly = range2 1 (hw.cpusPerNode * 8);
nblz = [ 8 ];
sizex = [ 3 ];
gitBranch = [ "garlic/tampi+isend+oss+task+simd" ];
};
# Generate the complete configuration for each unit
genConf = c: targetMachine.config // rec {
# Experiment, units and job names
expName = "saiph-granularity";
unitName = "${expName}"
+ "-N${toString nodes}"
+ "-nbg.x${toString nbgx}.y${toString nbgy}.z${toString nbgz}"
+ "-nbl.x${toString nblx}.y${toString nbly}.z${toString nblz}";
jobName = unitName;
# saiph options
totalTasks = ntasksPerNode * nodes;
nodes = 1;
enableManualDist = true; # allows to manually set nbg{x-y-z}
nbgx = 1;
nbgy = 1;
nbgz = totalTasks; # forcing distribution by last dim
inherit (c) nblx nbly nblz gitBranch sizex;
blocksPerTask = nblx * nbly * nblz * 1.0;
blocksPerCpu = blocksPerTask / cpusPerTask;
# fix a specific commit
gitCommit = "8052494d7dc62bef95ebaca9938e82fb029686f6";
# Repeat the execution of each unit 10 times
loops = 10;
# Resources
inherit (targetMachine.config) hw;
qos = "debug";
ntasksPerNode = hw.socketsPerNode; # MPI binded to sockets
cpusPerTask = hw.cpusPerSocket; # Using the 24 CPUs of each socket
};
#*** Compute the final set of configurations ***
# Compute the array of configurations: cartesian product of all
# factors
allConfigs = stdexp.buildConfigs {
inherit varConf genConf;
};
# Filter to remove non-desired configurations:
# --> tasks/proc < 0.5
# --> nblz > 50
isGoodConfig = c:
let
maxNblz = c.cpusPerTask * 2;
in
! (c.blocksPerCpu < 0.5 || c.nblz > maxNblz);
configs = filter (isGoodConfig) allConfigs;
#*** Sets the env/argv of the program ***
exec = {nextStage, conf, ...}: stages.exec {
inherit nextStage;
env = ''
export OMP_NUM_THREADS=${toString conf.cpusPerTask}
'';
};
#*** Configure the program according to the app ***
program = {nextStage, conf, ...}: bsc.apps.saiph.override {
inherit (conf) enableManualDist
nbgx nbgy nbgz nblx nbly nblz
sizex
gitBranch gitCommit;
L3SizeKB = conf.hw.cacheSizeKB.L3;
cachelineBytes = conf.hw.cachelineBytes;
};
#*** Add stages to the pipeline ***
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,122 +0,0 @@
######################################################################################
# Saiph, scalability experiment:
#
# App:Heat 3D - garlic/tampi+isend+oss+task+simd branch
# App details:
# 3D mesh of ~400*400*400 points
# nbgx = global blocks in the X dimension
# nbgy = global blocks in the Y dimension
# nbgz = global blocks in the Z dimension
# --> nbgx*nbgy*nbgz = global distributed blocks
# nbly = local blocks in the Y dimension
# nblz = local blocks in the Z dimension
# --> nbly*nblz = local blocks (#tasks)
#
# Scalability experiment configuration:
# From a single-core granularity experiment, use a suited local blocking set:
# --> nbly*nblz >= 48 (at least 3tasks/proc)
# MPI binded to sockets: MPI procs = 2*nodes
# Mesh distributed across third dimension to ensure contiguous communications
# --> nbgx = 1, nbgy = 1
# Global distribution limited by global mesh size
# First dimension cannot be locally blocked (simd reasons)
# Second and third dimension local blocking limited by local mesh size
#
######################################################################################
# Common packages, tools and options
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
}:
with lib;
with garlicTools;
let
#*** Variable configurations ***
varConf = with targetMachine.config; {
# FIXME: None of those selected nbl* and problem size is able to give good
# efficiency when testing strong scaling. We should find better values.
# Local blocks per dimension
nblx = [ 1 ]; # SIMD
nbly = [ 32 ];
nblz = [ 8 ];
sizex = [ 3 6 ];
gitBranch = [ "garlic/tampi+isend+oss+task+simd" ];
nodes = range2 1 8;
};
#*** Generate the complete configuration for each unit ***
genConf = c: targetMachine.config // rec {
# Experiment, units and job names
expName = "saiph-ss";
unitName = "${expName}"
+ "-N${toString nodes}"
+ "-nbg.x${toString nbgx}.y${toString nbgy}.z${toString nbgz}"
+ "-nbl.x${toString nblx}.y${toString nbly}.z${toString nblz}";
jobName = unitName;
# saiph options
enableManualDist = true; # allows to manually set nbg{x-y-z}
nbgx = 1;
nbgy = 1;
nbgz = nodes * ntasksPerNode; # forcing distribution by last dim
inherit (c) nblx nbly nblz nodes sizex;
gitBranch = "garlic/tampi+isend+oss+task+simd";
gitCommit = "8052494d7dc62bef95ebaca9938e82fb029686f6"; # fix a specific commit
blocksPerTask = nblx * nbly * nblz * 1.0;
blocksPerCpu = blocksPerTask / cpusPerTask;
# Repeat the execution of each unit 10 times
loops = 10;
# Resources
inherit (targetMachine.config) hw;
qos = "debug";
ntasksPerNode = hw.socketsPerNode; # MPI binded to sockets
cpusPerTask = hw.cpusPerSocket; # Using the 24 CPUs of each socket
};
#*** Compute the final set of configurations ***
# Compute the array of configurations: cartesian product of all factors
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
#*** Sets the env/argv of the program ***
exec = {nextStage, conf, ...}: with conf; stages.exec {
inherit nextStage;
env = ''
export OMP_NUM_THREADS=${toString hw.cpusPerSocket}
'';
};
#*** Configure the program according to the app ***
program = {nextStage, conf, ...}: bsc.apps.saiph.override {
inherit (conf) enableManualDist
nbgx nbgy nbgz nblx nbly nblz
sizex
gitBranch gitCommit;
L3SizeKB = conf.hw.cacheSizeKB.L3;
cachelineBytes = conf.hw.cachelineBytes;
};
#*** Add stages to the pipeline ***
pipeline = stdexp.stdPipeline ++ [ exec program ];
in
stdexp.genExperiment { inherit configs pipeline; }

View File

@ -1,63 +0,0 @@
{
stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, garlicTools
}:
with lib;
with garlicTools;
let
machineConfig = targetMachine.config;
inherit (machineConfig) hw;
# Initial variable configuration
varConf = with bsc; {
# Create a list of cpus per task by computing the divisors of the number of
# cpus per socket, example: divisors 24 = [ 1 2 3 4 6 8 12 24 ]
cpusPerTask = divisors hw.cpusPerSocket;
};
# Generate the complete configuration for each unit
genConf = with bsc; c: targetMachine.config // rec {
expName = "cpu";
unitName = "${expName}.${toString cpusPerTask}";
inherit (machineConfig) hw;
# Repeat the execution of each unit 30 times
loops = 1;
# Resources
qos = "debug";
inherit (c) cpusPerTask;
# As cpusPerTask is a divisor of the cpusPerSocket and thus cpusPerNode, we
# know the remainder is zero:
ntasksPerNode = hw.cpusPerNode / cpusPerTask;
nodes = 1;
jobName = unitName;
};
# Compute the array of configurations
configs = stdexp.buildConfigs {
inherit varConf genConf;
};
exec = {nextStage, conf, ...}: with conf; stages.exec {
inherit nextStage;
env = "date";
};
program = {nextStage, conf, ...}: bsc.dummy;
pipeline = stdexp.stdPipeline ++ [ program ];
in
stdexp.genExperiment { inherit configs pipeline; }

Some files were not shown because too many files have changed in this diff Show More