Rodrigo Arias Mallo
d68ce914ba
The awk script doesn't take in consideration the events close to the cut points, which are significative with low parallelism.
147 lines
3.6 KiB
Nix
147 lines
3.6 KiB
Nix
{
|
|
stdenv
|
|
, stdexp
|
|
, bsc
|
|
, targetMachine
|
|
, stages
|
|
, garlicTools
|
|
, enablePerf ? false
|
|
, enableCTF ? false
|
|
}:
|
|
|
|
with stdenv.lib;
|
|
with garlicTools;
|
|
|
|
let
|
|
# Initial variable configuration
|
|
varConf = with bsc; {
|
|
cbs = range2 32 4096;
|
|
rbs = range2 32 4096;
|
|
#cbs = [ 64 256 1024 4096 ];
|
|
#rbs = [ 32 128 512 1024 ];
|
|
#cbs = [ 4096 ];
|
|
#rbs = [ 512 ];
|
|
};
|
|
|
|
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
|
|
cbs = c.cbs;
|
|
rbs = c.rbs;
|
|
gitBranch = "garlic/tampi+isend+oss+task";
|
|
|
|
# Repeat the execution of each unit 30 times
|
|
loops = 1;
|
|
|
|
# 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;
|
|
};
|
|
|
|
# Compute the array of configurations
|
|
configs = 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, ...}: with conf; stages.exec {
|
|
inherit nextStage;
|
|
env = ''
|
|
export NANOS6_CONFIG_OVERRIDE="version.instrument=ctf,\
|
|
instrument.ctf.converter.enabled=false"
|
|
'';
|
|
# Only one process converts the trace, otherwise use:
|
|
# if [ $SLURM_PROCID == 0 ]; then
|
|
# ...
|
|
# fi
|
|
post = ''
|
|
if [ $SLURM_PROCID == 0 ]; then
|
|
sleep 2
|
|
for tracedir in trace_*; do
|
|
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 \
|
|
> $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
|
|
done
|
|
fi
|
|
'';
|
|
};
|
|
|
|
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; }
|