Remove unused experiments

This commit is contained in:
Rodrigo Arias 2020-10-09 20:17:35 +02:00
parent 4de20d3aa5
commit aa1ffa5208
5 changed files with 0 additions and 606 deletions

View File

@ -1,64 +0,0 @@
{
pkgs
, callPackage
, callPackages
}:
let
garlic = {
# Load some helper functions to generate app variants
inherit (import ./gen.nix) genApps genApp genConfigs;
mpptest = callPackage ./mpptest { };
ppong = callPackage ./ppong {
mpi = pkgs.mpi;
};
nbody = callPackage ./nbody {
cc = pkgs.icc;
mpi = pkgs.impi;
tampi = pkgs.tampi;
gitBranch = "garlic/seq";
};
runWrappers = {
sbatch = callPackage ./stages/sbatch.nix { };
srun = callPackage ./stages/srun.nix { };
launch = callPackage ./stages/launcher.nix { };
control = callPackage ./stages/control.nix { };
nixsetup= callPackage ./stages/nix-setup.nix { };
argv = callPackage ./stages/argv.nix { };
statspy = callPackage ./stages/statspy.nix { };
extrae = callPackage ./stages/extrae.nix { };
stagen = callPackage ./stages/stagen.nix { };
};
# Perf is tied to a linux kernel specific version
linuxPackages = pkgs.linuxPackages_4_4;
perfWrapper = callPackage ./perf.nix {
perf = pkgs.linuxPackages.perf;
};
exp = {
noise = callPackage ./exp/noise.nix { };
nbody = {
bs = callPackage ./exp/nbody/bs.nix {
pkgs = pkgs // garlic;
};
mpi = callPackage ./exp/nbody/mpi.nix { };
};
osu = rec {
latency-internode = callPackage ./exp/osu/latency.nix { };
latency-intranode = callPackage ./exp/osu/latency.nix {
interNode = false;
};
latency = latency-internode;
};
};
};
in
garlic

View File

@ -1,132 +0,0 @@
{
bsc
, stdenv
, nbody
, genApp
, genConfigs
, runWrappers
}:
with stdenv.lib;
let
# Set variable configuration for the experiment
varConfig = {
cc = [ bsc.icc ];
blocksize = [ 1024 ];
};
# Common configuration
common = {
# Compile time nbody config
gitBranch = "garlic/mpi+send";
mpi = bsc.impi;
# nbody runtime options
particles = 1024*128;
timesteps = 20;
loops = 1000;
# Resources
ntasksPerNode = "48";
nodes = "1";
# Stage configuration
enableSbatch = true;
enableControl = true;
enableExtrae = false;
enablePerf = false;
# MN4 path
nixPrefix = "/gpfs/projects/bsc15/nix";
};
# Compute the cartesian product of all configurations
configs = map (conf: conf // common) (genConfigs varConfig);
stageProgram = stage:
if stage ? programPath
then "${stage}${stage.programPath}" else "${stage}";
w = runWrappers;
sbatch = {stage, conf, ...}: with conf; w.sbatch {
program = stageProgram stage;
exclusive = true;
time = "02:00:00";
qos = "debug";
jobName = "nbody-bs";
inherit nixPrefix nodes ntasksPerNode;
};
control = {stage, conf, ...}: with conf; w.control {
program = stageProgram stage;
inherit loops;
};
srun = {stage, conf, ...}: with conf; w.srun {
program = stageProgram stage;
srunOptions = "--cpu-bind=verbose,rank";
inherit nixPrefix;
};
statspy = {stage, conf, ...}: with conf; w.statspy {
program = stageProgram stage;
};
perf = {stage, conf, ...}: with conf; w.perf {
program = stageProgram stage;
perfArgs = "sched record -a";
};
nixsetup = {stage, conf, ...}: with conf; w.nixsetup {
program = stageProgram stage;
};
extrae = {stage, conf, ...}: w.extrae {
program = stageProgram stage;
traceLib = "mpi"; # mpi -> libtracempi.so
configFile = ./extrae.xml;
};
argv = {stage, conf, ...}: w.argv {
program = stageProgram stage;
env = ''
set -e
export I_MPI_THREAD_SPLIT=1
'';
argv = ''( -t ${toString conf.timesteps}
-p ${toString conf.particles} )'';
};
nbodyFn = {stage, conf, ...}: with conf; nbody.override {
inherit cc blocksize mpi gitBranch;
};
stages = with common; []
# Use sbatch to request resources first
++ optional enableSbatch sbatch
# Repeats the next stages N times
++ optionals enableControl [ nixsetup control ]
# Executes srun to launch the program in the requested nodes, and
# immediately after enters the nix environment again, as slurmstepd launches
# the next stages from outside the namespace.
++ [ srun nixsetup ]
# Intrumentation with extrae
++ optional enableExtrae extrae
# Optionally profile the next stages with perf
++ optional enablePerf perf
# Execute the nbody app with the argv and env vars
++ [ argv nbodyFn ];
# List of actual programs to be executed
jobs = map (conf: w.stagen { inherit conf stages; }) configs;
in
# We simply run each program one after another
w.launch jobs

View File

@ -1,211 +0,0 @@
<?xml version='1.0'?>
<!-- Here comes the Extrae configuration.
As a general rule, "enabled" means that the feature is enabled :) If
it's not enabled, then the value can be set to some default.
-->
<!-- Must we activate the tracing? Which is the tracing mode? (detail/bursts) Where is it located? Which kind of trace? Version of the XML parser?-->
<trace enabled="yes"
home="/nix/store/j80mlqa12d1baifg30jsx2smv90akzvc-extrae"
initial-mode="detail"
type="paraver"
>
<!-- Configuration of some MPI dependant values -->
<mpi enabled="yes">
<!-- Gather counters in the MPI routines? -->
<counters enabled="yes" />
</mpi>
<!-- Emit information of the callstack -->
<callers enabled="yes">
<!-- At MPI calls, select depth level -->
<mpi enabled="yes">1-3</mpi>
<!-- At sampling points, select depth level -->
<sampling enabled="yes">1-5</sampling>
<!-- At dynamic memory system calls -->
<dynamic-memory enabled="no">1-3</dynamic-memory>
<!-- At I/O system calls -->
<input-output enabled="no">1-3</input-output>
<!-- At other system calls -->
<syscall enabled="no">1-3</syscall>
</callers>
<!-- Configuration of some OpenMP dependant values -->
<openmp enabled="no" ompt="no">
<!-- If the library instruments OpenMP, shall we gather info about locks?
Obtaining such information can make the final trace quite large.
-->
<locks enabled="no" />
<!-- Gather info about taskloops? -->
<taskloop enabled="no" />
<!-- Gather counters in the OpenMP routines? -->
<counters enabled="yes" />
</openmp>
<!-- Configuration of some pthread dependant values -->
<pthread enabled="no">
<!-- If the library instruments pthread, shall we gather info about locks,
mutexs and conds?
Obtaining such information can make the final trace quite large.
-->
<locks enabled="no" />
<!-- Gather counters in the pthread routines? -->
<counters enabled="yes" />
</pthread>
<!-- Configuration of User Functions -->
<user-functions enabled="no" list="/home/bsc41/bsc41273/user-functions.dat" exclude-automatic-functions="no">
<!-- Gather counters on the UF routines? -->
<counters enabled="yes" />
</user-functions>
<!-- Configure which software/hardware counters must be collected -->
<counters enabled="yes">
<!-- Configure the CPU hardware counters. You can define here as many sets
as you want. You can also define if MPI/OpenMP calls must report such
counters.
Starting-set property defines which set is chosen from every task.
Possible values are:
- cyclic : The sets are distributed in a cyclic fashion among all
tasks. So Task 0 takes set 1, Task 1 takes set 2,...
- block : The sets are distributed in block fashion among all tasks.
Task [0..i-1] takes set 1, Task [i..2*i-1] takes set 2, ...
- Number : All the tasks will start with the given set
(from 1..N).
-->
<cpu enabled="yes" starting-set-distribution="1">
<!-- In this example, we configure two sets of counters. The first will
be changed into the second after 5 calls to some collective
operation on MPI_COMM_WORLD. Once the second is activated, it will
turn to the first after 5seconds (aprox. depending on the MPI calls
granularity)
If you want that any set be counting forever, just don't set
changeat-globalops, or, changeat-time.
Each set has it's own properties.
domain -> in which domain must PAPI obtain the information (see
PAPI info)
changeat-globalops=num -> choose the next set after num
MPI_COMM_WORLD operations
changeat-time=numTime -> choose the next set after num Time
(for example 5s, 15m (for ms), 10M (for minutes),..)
-->
<set enabled="yes" domain="all">
PAPI_TOT_INS,PAPI_TOT_CYC
</set>
</cpu>
<!-- Do we want to gather information of the network counters?
Nowadays we can gather information about MX/GM cards.
-->
<network enabled="no" />
<!-- Obtain resource usage information -->
<resource-usage enabled="no" />
<!-- Obtain malloc statistics -->
<memory-usage enabled="no" />
</counters>
<!-- Define the characteristics of the tracing storage. If not defined,
or set, the tracing will send the traces to the current directory
with a default output name.
-->
<storage enabled="no">
<!-- The intermediate files will take the name of the application -->
<trace-prefix enabled="yes">TRACE</trace-prefix>
<!-- Stop the tracing when the intermediate file reaches this amount of MBs -->
<size enabled="no">5</size>
<!-- Where must we store the MPIT files while the app runs? -->
<temporal-directory enabled="yes">/scratch</temporal-directory>
<!-- Where must we store the MPIT files once the app ends? -->
<final-directory enabled="yes">/gpfs/scratch/bsc41/bsc41273</final-directory>
</storage>
<!-- Buffer configuration -->
<buffer enabled="yes">
<!-- How many events can we handle before any flush -->
<size enabled="yes">5000000</size>
<!-- Use the event buffer in a circular manner? You can use this option to
trace the last set of events. Needs MPI global routines operating on
MPI_COMM_WORLD communicator to be merged
-->
<circular enabled="no" />
</buffer>
<!-- Control tracing -->
<trace-control enabled="no">
<!-- We can start the application with a "latent tracing" and wake it up
once a control file is created. Use the property 'frequency' to
choose at which frequency this check must be done. If not supplied,
it will be checked every 100 global operations on MPI_COMM_WORLD.
-->
<file enabled="no" frequency="5M">/gpfs/scratch/bsc41/bsc41273/control</file>
<!--
-->
<global-ops enabled="no"></global-ops>
</trace-control>
<others enabled="yes">
<!-- Want to force a minimum amount of time of tracing? Here we force 10
minutes -->
<minimum-time enabled="no">10M</minimum-time>
<!-- Capture the following signals to finish cleanly -->
<finalize-on-signal enabled="yes"
SIGUSR1="no" SIGUSR2="no" SIGINT="yes"
SIGQUIT="yes" SIGTERM="yes" SIGXCPU="yes"
SIGFPE="yes" SIGSEGV="yes" SIGABRT="yes"
/>
<!-- Use instrumentation poitns to flush sampling buffer -->
<flush-sampling-buffer-at-instrumentation-point enabled="yes" />
</others>
<!-- Bursts library enabled? This requires an special library! -->
<bursts enabled="no">
<!-- Specify the threshold. This is mandatory! In this example, the
threshold is limitted to 500 microseconds
-->
<threshold enabled="yes">500u</threshold>
<!-- Report MPI statistics? -->
<mpi-statistics enabled="yes" />
</bursts>
<!-- Enable sampling capabilities using system clock.
Type may refer to: default, real, prof and virtual.
Period stands for the sampling period (50ms here)
plus a variability of 10ms, which means periods from
45 to 55ms.
-->
<sampling enabled="no" type="default" period="50m" variability="10m" />
<!-- Enable dynamic memory instrumentation (experimental) -->
<dynamic-memory enabled="no" />
<!-- Enable I/O (read, write) instrumentation (experimental) -->
<input-output enabled="no" internals="no"/>
<!-- Enable system calls instrumentation (experimental) -->
<syscall enabled="no" />
<!-- Do merge the intermediate tracefiles into the final tracefile?
Named according to the binary name
options:
synchronization = { default, task, node, no } (default is node)
max-memory = Number (in Mbytes) max memory used in merge step
joint-states = { yes, no } generate joint states?
keep-mpits = { yes, no } keep mpit files after merge?
-->
<merge enabled="yes"
synchronization="default"
tree-fan-out="16"
max-memory="512"
joint-states="yes"
keep-mpits="yes"
sort-addresses="yes"
overwrite="yes"
/>
</trace>

View File

@ -1,180 +0,0 @@
{
stdenv
, nixpkgs
, pkgs
, genApp
, genConfigs
, runWrappers
}:
with stdenv.lib;
let
bsc = pkgs.bsc;
# Set variable configuration for the experiment
varConfig = {
cc = [ bsc.icc ];
mpi = [ bsc.impi ];
blocksize = [ 1024 ];
};
# Common configuration
common = {
# nbody runtime options
particles = 1024*4;
timesteps = 10;
# Resources
ntasksPerNode = "2";
nodes = "2";
# Stage configuration
enableRunexp = true;
enableSbatch = true;
enableControl = true;
enableExtrae = false;
enablePerf = false;
enableCtf = false;
# MN4 path
nixPrefix = "/gpfs/projects/bsc15/nix";
};
# Compute the cartesian product of all configurations
configs = map (conf: conf // common) (genConfigs varConfig);
stageProgram = stage:
if stage ? programPath
then "${stage}${stage.programPath}" else "${stage}";
w = runWrappers;
sbatch = {stage, conf, ...}: with conf; w.sbatch (
# Allow a user to define a custom reservation for the job in MareNostrum4,
# by setting the garlic.sbatch.reservation attribute in the
# ~/.config/nixpkgs/config.nix file. If the attribute is not set, no
# reservation is used. The user reservation may be overwritten by the
# experiment, if the reservation is set like with nodes or ntasksPerNode.
optionalAttrs (pkgs.config ? garlic.sbatch.reservation) {
inherit (pkgs.config.garlic.sbatch) reservation;
} // {
program = stageProgram stage;
exclusive = true;
time = "02:00:00";
qos = "debug";
jobName = "nbody-tampi";
inherit nixPrefix nodes ntasksPerNode;
}
);
control = {stage, conf, ...}: with conf; w.control {
program = stageProgram stage;
};
srun = {stage, conf, ...}: with conf; w.srun {
program = stageProgram stage;
srunOptions = "--cpu-bind=verbose,socket";
inherit nixPrefix;
};
statspy = {stage, conf, ...}: with conf; w.statspy {
program = stageProgram stage;
};
perf = {stage, conf, ...}: with conf; w.perf {
program = stageProgram stage;
perfArgs = "sched record -a";
};
isolate = {stage, conf, ...}: with conf; w.isolate {
program = stageProgram stage;
clusterName = "mn4";
inherit nixPrefix;
};
extrae = {stage, conf, ...}: w.extrae {
program = stageProgram stage;
traceLib = "mpi"; # mpi -> libtracempi.so
configFile = ./extrae.xml;
};
ctf = {stage, conf, ...}: w.argv {
program = stageProgram stage;
env = ''
export NANOS6=ctf
export NANOS6_CTF2PRV=0
'';
};
argv = {stage, conf, ...}: w.argv {
program = "${pkgs.coreutils}/bin/true";
env = ''
set -x
pwd
echo hi > hi
'';
};
bscOverlay = import ../../../overlay.nix;
genPkgs = newOverlay: nixpkgs {
overlays = [
bscOverlay
newOverlay
];
};
launch = w.launch.override {
nixPrefix = common.nixPrefix;
};
stages = with common; []
# Launch the experiment remotely
#++ optional enableRunexp runexp
# Use sbatch to request resources first
++ optional enableSbatch sbatch
# Repeats the next stages N times
++ optionals enableControl [ isolate control ]
# Executes srun to launch the program in the requested nodes, and
# immediately after enters the nix environment again, as slurmstepd launches
# the next stages from outside the namespace.
++ [ srun isolate ]
# Intrumentation with extrae
++ optional enableExtrae extrae
# Optionally profile the next stages with perf
++ optional enablePerf perf
# Optionally profile nanos6 with the new ctf
++ optional enableCtf ctf
++ [ argv ];
# List of actual programs to be executed
jobs = map (conf: w.stagen { inherit conf stages; }) configs;
launcher = launch jobs;
runexp = stage: w.runexp {
program = stageProgram stage;
nixPrefix = common.nixPrefix;
};
isolatedRun = stage: isolate {
inherit stage;
conf = common;
};
final = runexp (isolatedRun launcher);
in
# We simply run each program one after another
#launch jobs
final

View File

@ -243,25 +243,6 @@ let
hybrid = callPackage ./garlic/exp/creams/ss+hybrid.nix { }; hybrid = callPackage ./garlic/exp/creams/ss+hybrid.nix { };
}; };
}; };
osu = rec {
latency-internode = callPackage ./garlic/exp/osu/latency.nix { };
latency-intranode = callPackage ./garlic/exp/osu/latency.nix {
interNode = false;
};
latency = latency-internode;
};
test = {
rw = callPackage ./garlic/exp/test/rw.nix {
pkgs = self // self.bsc.garlic;
nixpkgs = import <nixpkgs>;
genApp = self.bsc.garlic.genApp;
genConfigs = self.bsc.garlic.genConfigs;
stages = self.bsc.garlic.stages;
};
# mpi = callPackage ./bsc/garlic/exp/nbody/mpi.nix { };
};
}; };
}; };