From f8ce2cc942146b664d6584fa5d2b3ed1a47cc8bb Mon Sep 17 00:00:00 2001
From: Florent Pruvost <florent.pruvost@inria.fr>
Date: Thu, 6 Mar 2025 16:44:32 +0100
Subject: [PATCH] benchs: push first version of jube scripts

---
 .gitlab-ci.yml                                | 13 +++
 guix-tools/scalfmm-manifest-gcc-mkl-bench.scm | 33 +++++++
 scripts/plafrim_level1.sh                     | 11 +++
 scripts/plafrim_level2.sh                     | 20 +++++
 scripts/plafrim_level3.sh                     | 85 ++++++++++++++++++
 scripts/scalfmm-accuracy.xml                  | 77 ++++++++++++++++
 scripts/scalfmm-time-omp.xml                  | 86 ++++++++++++++++++
 scripts/scalfmm-time-seq.xml                  | 88 +++++++++++++++++++
 8 files changed, 413 insertions(+)
 create mode 100644 guix-tools/scalfmm-manifest-gcc-mkl-bench.scm
 create mode 100755 scripts/plafrim_level1.sh
 create mode 100755 scripts/plafrim_level2.sh
 create mode 100755 scripts/plafrim_level3.sh
 create mode 100644 scripts/scalfmm-accuracy.xml
 create mode 100644 scripts/scalfmm-time-omp.xml
 create mode 100644 scripts/scalfmm-time-seq.xml

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8cdec8f3a..40a9a9996 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -78,6 +78,19 @@ test:
       #  coverage_format: cobertura
       #  path: coverage.xml
 
+benchmark:
+  stage: test
+  tags: ['plafrim']
+  #extends: .only-main-mr
+  needs: []
+  script:
+    - ./scripts/plafrim_level1.sh
+  artifacts:
+    when: always
+    paths:
+      - bench.sqlite3
+      - ./*.csv
+
 pages:
   stage: deploy
   when: manual
diff --git a/guix-tools/scalfmm-manifest-gcc-mkl-bench.scm b/guix-tools/scalfmm-manifest-gcc-mkl-bench.scm
new file mode 100644
index 000000000..7fa7b2a66
--- /dev/null
+++ b/guix-tools/scalfmm-manifest-gcc-mkl-bench.scm
@@ -0,0 +1,33 @@
+;; What follows is a "manifest" equivalent to the command line you gave.
+;; You can store it in a file that you may then pass to any 'guix' command
+;; that accepts a '--manifest' (or '-m') option.
+
+(specifications->manifest
+  (list "bash"
+        "cmake"
+        "coreutils"
+        "curl"
+        "findutils"
+        "gcc-toolchain@11"
+        "git"
+        "grep"
+        "inetutils"
+        "intel-oneapi-mkl"
+        "jq"
+        "jube-with-yaml"
+        "make"
+        "ncurses"
+        "nss-certs"
+	"python"
+        "python-certifi"
+        "python-click"
+	"python-colorama"
+        "python-elasticsearch"
+        "python-matplotlib"
+        "python-pandas"
+        "python-pyyaml"
+        "python-setuptools"
+        "sed"
+        "slurm"
+        "sqlite"))
+
diff --git a/scripts/plafrim_level1.sh b/scripts/plafrim_level1.sh
new file mode 100755
index 000000000..391c279fe
--- /dev/null
+++ b/scripts/plafrim_level1.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+set -x
+
+# Submit slurm jobs
+sbatch --wait --job-name=scalfmm --output=scalfmm.out --nodes=1 --time=01:00:00 --constraint=suroit --exclusive --ntasks-per-node=1 ./scripts/plafrim_level2.sh
+err=$?
+
+cat scalfmm.out
+
+# exit with error code from the sbatch command
+exit $err
diff --git a/scripts/plafrim_level2.sh b/scripts/plafrim_level2.sh
new file mode 100755
index 000000000..d8cd9781d
--- /dev/null
+++ b/scripts/plafrim_level2.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+set -x
+
+# to avoid a lock during fetching git branches in parallel
+export XDG_CACHE_HOME=/tmp/guix-$$
+
+# save guix commits
+guix time-machine -C .guix/scalfmm-channels.scm -- describe --format=json > guix.json
+
+exec guix time-machine -C .guix/scalfmm-channels.scm -- shell \
+       --pure --preserve="^CI|proxy$|^SLURM" \
+       -m .guix/scalfmm-manifest-gcc-mkl-bench.scm \
+       -- /bin/bash --norc ./scripts/plafrim_level3.sh
+err=$?
+
+# clean tmp
+rm -rf /tmp/guix-$$
+
+# exit with error code from the guix command
+exit $err
diff --git a/scripts/plafrim_level3.sh b/scripts/plafrim_level3.sh
new file mode 100755
index 000000000..c4179019e
--- /dev/null
+++ b/scripts/plafrim_level3.sh
@@ -0,0 +1,85 @@
+#!/usr/bin/env bash
+set -ex
+
+export HFI_NO_CPUAFFINITY=1
+export MKLROOT=$GUIX_ENVIRONMENT
+
+if [[ -z "${CI_COMMIT_SHA}" ]]; then
+  export GIT_COMMIT=`git rev-parse HEAD`
+else
+  export GIT_COMMIT=$CI_COMMIT_SHA
+  export GIT_CONFIG_COUNT=1
+  export GIT_CONFIG_KEY_0=safe.directory
+  export GIT_CONFIG_VALUE_0=*
+fi
+export GIT_COMMIT_DATE=`git show --no-patch --format=%ci $GIT_COMMIT`
+
+if [[ -z "${CI_HOSTNAME}" ]]; then
+  export CI_HOSTNAME=`hostname`
+fi
+
+# configuration and compilation
+#if [ -d build ]; then
+#  rm build -r
+#fi
+cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-O3 -march=native" -Dscalfmm_BUILD_BENCH=ON -Dscalfmm_USE_MKL=ON
+cmake --build build --target fmm-computation-seq
+cmake --build build --target fmm-computation-omp
+export SCALFMM_EXE_DIR=$PWD/build/bench/Release
+
+# clean old benchmarks
+if [ -d scripts/results ]; then
+  rm scripts/results -r
+fi
+# Execute benchmark commands
+jube run scripts/scalfmm-accuracy.xml --id 1
+jube run scripts/scalfmm-time-seq.xml --id 2
+jube run scripts/scalfmm-time-omp.xml --id 3
+
+# parse log files
+jube analyse scripts/results --id 1
+jube analyse scripts/results --id 2
+jube analyse scripts/results --id 3
+
+# reports in csv
+jube result scripts/results --id 1 -o accuracy_csv > scalfmm_accuracy.csv
+jube result scripts/results --id 2 -o timeseq_csv > scalfmm_timeseq.csv
+jube result scripts/results --id 3 -o timeomp_csv > scalfmm_timeomp.csv
+cat scalfmm_accuracy.csv
+cat scalfmm_timeseq.csv
+cat scalfmm_timeomp.csv
+
+# get current database file scalfmm.sqlite3 stored on gitlab
+if [[ ! -z "${CI_JOB_TOKEN}" ]]; then
+  export PACKAGEID=`curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://gitlab.inria.fr/api/v4/projects/$CI_PROJECT_ID/packages" |jq '.[0].id'`
+  if [[ "${PACKAGEID}" != "null" ]]; then
+    export FILEID=`curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://gitlab.inria.fr/api/v4/projects/$CI_PROJECT_ID/packages/$PACKAGEID/package_files" |jq '.[0].id'`
+    if [[ "${FILEID}" != "null" ]]; then
+      curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://gitlab.inria.fr/api/v4/projects/$CI_PROJECT_ID/packages/generic/benchmark/latest/scalfmm.sqlite3" -o scalfmm.sqlite3
+    fi
+  fi
+fi
+
+# update scalfmm.sqlite3 database
+jube result scripts/results --id 1 -o accuracy
+jube result scripts/results --id 2 -o timeseq
+jube result scripts/results --id 3 -o timeomp
+
+# upload updated scalfmm.sqlite3 on gitlab
+if [[ ! -z "${CI_JOB_TOKEN}" ]]; then
+  # get package id of the database stored on gitlab
+  export PACKAGEID=`curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://gitlab.inria.fr/api/v4/projects/$CI_PROJECT_ID/packages" |jq '.[0].id'`
+  if [[ "${PACKAGEID}" != "null" ]]; then
+    # get file id of the database on gitlab
+    export FILEID=`curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://gitlab.inria.fr/api/v4/projects/$CI_PROJECT_ID/packages/$PACKAGEID/package_files" |jq '.[0].id'`
+    if [[ "${FILEID}" != "null" ]]; then
+      # delete previous database version on gitlab if exists
+      curl --request DELETE --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://gitlab.inria.fr/api/v4/projects/$CI_PROJECT_ID/packages/$PACKAGEID/package_files/$FILEID"
+    fi
+  fi
+  #curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ./scalfmm.sqlite3 "https://gitlab.inria.fr/api/v4/projects/$CI_PROJECT_ID/packages/generic/benchmark/latest/scalfmm.sqlite3"
+fi
+
+# send results to the elasticsearch server
+#ls guix.json
+#python3 script/add_result.py -e https://elasticsearch.bordeaux.inria.fr -t concace -p "scalfmm" scalfmm.csv
diff --git a/scripts/scalfmm-accuracy.xml b/scripts/scalfmm-accuracy.xml
new file mode 100644
index 000000000..af35c8993
--- /dev/null
+++ b/scripts/scalfmm-accuracy.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jube>
+    <benchmark name="scalfmm_accuracy" outpath="results">
+        <comment>scalfmm accuracy tests</comment>
+
+        <!-- Cartesian product of input parameters -->
+        <parameterset name="param">
+            <parameter name="ndim"               type="int"   >1, 2, 3</parameter>
+            <!-- <parameter name="ndim"               type="int"   >2, 3</parameter> -->
+            <parameter name="kernel_type"        type="int"   >0, 6, 7</parameter>
+            <!-- <parameter name="kernel_type"        type="int"   >0, 7</parameter> -->
+            <parameter name="interp_type"        type="int"   >0, 1, 2, 3, 4</parameter>
+            <!-- <parameter name="interp_type"        type="int"   >2, 3</parameter> -->
+            <parameter name="nrun"               type="int"   >1</parameter>
+            <parameter name="nthread"            type="int"   >4</parameter>
+            <parameter name="groupsize"          type="int"   >1</parameter>
+            <parameter name="tree_height"        type="int"   >3, 4, 5</parameter>
+            <parameter name="interp_order"       type="int"   >3, 4, 5, 6, 7, 8, 9, 10, 11, 12</parameter>
+            <!-- <parameter name="interp_order"       type="int"   >3, 4</parameter> -->
+            <parameter name="command"            type="string">$SCALFMM_EXE_DIR/fmm-computation-seq --direct-computation --fmm-computation --dimension ${ndim} --group-size ${groupsize} --interp-settings ${interp_type} --kernel ${kernel_type} --order ${interp_order} --nb-runs ${nrun} --threads ${nthread} --tree-height ${tree_height}</parameter>
+        </parameterset>
+
+        <!-- Execution commands -->
+        <step name="run">
+            <use>param</use>
+            <do>echo "Commit = $GIT_COMMIT"</do>
+            <do>echo "Date = $GIT_COMMIT_DATE"</do>
+            <do>echo "Hostname = $CI_HOSTNAME"</do>
+            <do>$command</do>
+        </step>
+
+        <!-- Regex pattern -->
+        <patternset name="regexlog">
+            <pattern name="gitcommit" type="string">Commit = ([0-9a-f]{40}).*</pattern>
+            <pattern name="gitcommitdate" type="string">Date = (\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}\s\+\d{4}).*</pattern>
+            <pattern name="hostname" type="string">Hostname = $jube_pat_wrd</pattern>
+            <pattern name="error" type="float">Relative L2-norm = $jube_pat_fp</pattern>
+        </patternset>
+
+        <!-- Analyse -->
+        <analyser name="parse">
+            <!-- use a pattern set -->
+            <use>regexlog</use>
+            <analyse step="run">
+                <file>stdout</file> <!-- file which should be scanned -->
+            </analyse>
+        </analyser>
+
+        <!-- Create result table -->
+        <result>
+            <use>parse</use> <!-- use existing analyser -->
+            <table name="accuracy_csv" style="csv">
+                <column>gitcommit</column>
+                <column>gitcommitdate</column>
+                <column>hostname</column>
+                <column>ndim</column>
+                <column>kernel_type</column>
+                <column>interp_type</column>
+                <column>tree_height</column>
+                <column>interp_order</column>
+                <column>error</column>
+            </table>
+            <database name="accuracy" primekeys="gitcommit,gitcommitdate,hostname,ndim,kernel_type,interp_type,tree_height,interp_order,error" file="scalfmm.sqlite3">
+                <key>gitcommit</key>
+                <key>gitcommitdate</key>
+                <key>hostname</key>
+                <key>ndim</key>
+                <key>kernel_type</key>
+                <key>interp_type</key>
+                <key>tree_height</key>
+                <key>interp_order</key>
+                <key>error</key>
+            </database>
+        </result>
+
+    </benchmark>
+</jube>
diff --git a/scripts/scalfmm-time-omp.xml b/scripts/scalfmm-time-omp.xml
new file mode 100644
index 000000000..9395523ee
--- /dev/null
+++ b/scripts/scalfmm-time-omp.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jube>
+    <benchmark name="scalfmm_time_seq" outpath="results">
+        <comment>scalfmm OMP-tasks timing tests</comment>
+
+        <!-- Cartesian product of input parameters -->
+        <parameterset name="param">
+            <parameter name="ndim"               type="int"   >1, 2, 3</parameter>
+            <parameter name="ndim"               type="int"   >2</parameter>
+            <parameter name="kernel_type"        type="int"   >0</parameter>
+            <parameter name="interp_type"        type="int"   >2</parameter>
+            <parameter name="nrun"               type="int"   >1</parameter>
+            <parameter name="tree_height"        type="int"   >3, 4, 5</parameter>
+            <!-- <parameter name="tree_height"        type="int"   >5</parameter> -->
+            <parameter name="interp_order"       type="int"   >5</parameter>
+            <parameter name="size"               type="int"   >100000</parameter>
+            <parameter name="nthread"            type="int"   >1, 2, 4, 8, 16</parameter>
+            <!-- <parameter name="nthread"            type="int"   >1, 2, 4</parameter> -->
+            <parameter name="groupsize"          type="int"   >1, 5, 10, 100, 1000</parameter>
+            <!-- <parameter name="groupsize"          type="int"   >1, 5, 10, 100</parameter> -->
+            <parameter name="command"            type="string">$SCALFMM_EXE_DIR/fmm-computation-omp --fmm-computation --dimension ${ndim} --group-size ${groupsize} --interp-settings ${interp_type} --kernel ${kernel_type} --order ${interp_order} --nb-runs ${nrun} --threads ${nthread} --size ${size} --tree-height ${tree_height}</parameter>
+        </parameterset>
+
+        <!-- Execution commands -->
+        <step name="run">
+            <use>param</use>
+            <do>echo "Commit = $GIT_COMMIT"</do>
+            <do>echo "Date = $GIT_COMMIT_DATE"</do>
+            <do>echo "Hostname = $CI_HOSTNAME"</do>
+            <do>$command</do>
+        </step>
+
+        <!-- Regex pattern -->
+        <patternset name="regexlog">
+            <pattern name="gitcommit" type="string">Commit = ([0-9a-f]{40}).*</pattern>
+            <pattern name="gitcommitdate" type="string">Date = (\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}\s\+\d{4}).*</pattern>
+            <pattern name="hostname" type="string">Hostname = $jube_pat_wrd</pattern>
+            <pattern name="timefull" type="float">Full algo : $jube_pat_fp</pattern>
+        </patternset>
+
+        <!-- Analyse -->
+        <analyser name="parse">
+            <!-- use a pattern set -->
+            <use>regexlog</use>
+            <analyse step="run">
+                <file>stdout</file> <!-- file which should be scanned -->
+            </analyse>
+        </analyser>
+
+        <!-- Create result table -->
+        <result>
+            <use>parse</use> <!-- use existing analyser -->
+            <table name="timeomp_csv" style="csv">
+                <column>gitcommit</column>
+                <column>gitcommitdate</column>
+                <column>hostname</column>
+                <column>ndim</column>
+                <column>kernel_type</column>
+                <column>interp_type</column>
+                <column>nrun</column>
+                <column>tree_height</column>
+                <column>interp_order</column>
+                <column>size</column>
+                <column>nthread</column>
+                <column>groupsize</column>
+                <column>timefull_avg</column>
+            </table>
+            <database name="timeomp" primekeys="gitcommit,gitcommitdate,hostname,ndim,kernel_type,interp_type,nrun,tree_height,interp_order,size,nthread,groupsize,timefull_avg" file="scalfmm.sqlite3">
+                <key>gitcommit</key>
+                <key>gitcommitdate</key>
+                <key>hostname</key>
+                <key>ndim</key>
+                <key>kernel_type</key>
+                <key>interp_type</key>
+                <key>nrun</key>
+                <key>tree_height</key>
+                <key>interp_order</key>
+                <key>size</key>
+                <key>nthread</key>
+                <key>groupsize</key>
+                <key>timefull_avg</key>
+            </database>
+        </result>
+
+    </benchmark>
+</jube>
diff --git a/scripts/scalfmm-time-seq.xml b/scripts/scalfmm-time-seq.xml
new file mode 100644
index 000000000..43092c6f1
--- /dev/null
+++ b/scripts/scalfmm-time-seq.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jube>
+    <benchmark name="scalfmm_time_seq" outpath="results">
+        <comment>scalfmm sequential timing tests</comment>
+
+        <!-- Cartesian product of input parameters -->
+        <parameterset name="param">
+            <parameter name="ndim"               type="int"   >1, 2, 3</parameter>
+            <!-- <parameter name="ndim"               type="int"   >2</parameter> -->
+            <parameter name="kernel_type"        type="int"   >0</parameter>
+            <parameter name="interp_type"        type="int"   >1, 2, 4</parameter>
+            <!-- <parameter name="interp_type"        type="int"   >1</parameter> -->
+            <parameter name="nrun"               type="int"   >1</parameter>
+            <parameter name="nthread"            type="int"   >1</parameter>
+            <parameter name="groupsize"          type="int"   >1</parameter>
+            <parameter name="tree_height"        type="int"   >3, 4, 5</parameter>
+            <!-- <parameter name="tree_height"        type="int"   >3</parameter> -->
+            <parameter name="interp_order"       type="int"   >5</parameter>
+            <parameter name="size"               type="int"   >1000, 5000, 10000, 50000, 100000, 500000, 1000000</parameter>
+            <!-- <parameter name="size"               type="int"   >1000, 5000, 10000</parameter> -->
+            <parameter name="command"            type="string">$SCALFMM_EXE_DIR/fmm-computation-seq --fmm-computation --dimension ${ndim} --group-size ${groupsize} --interp-settings ${interp_type} --kernel ${kernel_type} --order ${interp_order} --nb-runs ${nrun} --threads ${nthread} --size ${size} --tree-height ${tree_height}</parameter>
+        </parameterset>
+
+        <!-- Execution commands -->
+        <step name="run">
+            <use>param</use>
+            <do>echo "Commit = $GIT_COMMIT"</do>
+            <do>echo "Date = $GIT_COMMIT_DATE"</do>
+            <do>echo "Hostname = $CI_HOSTNAME"</do>
+            <do>$command</do>
+        </step>
+
+        <!-- Regex pattern -->
+        <patternset name="regexlog">
+            <pattern name="gitcommit" type="string">Commit = ([0-9a-f]{40}).*</pattern>
+            <pattern name="gitcommitdate" type="string">Date = (\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}\s\+\d{4}).*</pattern>
+            <pattern name="hostname" type="string">Hostname = $jube_pat_wrd</pattern>
+            <pattern name="timefar"  type="float">\[time\]\[far time\]   : $jube_pat_fp</pattern>
+            <pattern name="timenear" type="float">\[time\]\[near time\]  : $jube_pat_fp</pattern>
+            <pattern name="timefull" type="float">\[time\]\[full algo\]  : $jube_pat_fp</pattern>
+        </patternset>
+
+        <!-- Analyse -->
+        <analyser name="parse">
+            <!-- use a pattern set -->
+            <use>regexlog</use>
+            <analyse step="run">
+                <file>stdout</file> <!-- file which should be scanned -->
+            </analyse>
+        </analyser>
+
+        <!-- Create result table -->
+        <result>
+            <use>parse</use> <!-- use existing analyser -->
+            <table name="timeseq_csv" style="csv">
+                <column>gitcommit</column>
+                <column>gitcommitdate</column>
+                <column>hostname</column>
+                <column>ndim</column>
+                <column>kernel_type</column>
+                <column>interp_type</column>
+                <column>nrun</column>
+                <column>tree_height</column>
+                <column>interp_order</column>
+                <column>size</column>
+                <column>timefar_avg</column>
+                <column>timenear_avg</column>
+                <column>timefull_avg</column>
+            </table>
+            <database name="timeseq" primekeys="gitcommit,gitcommitdate,hostname,ndim,kernel_type,interp_type,nrun,tree_height,interp_order,size,timefar_avg,timenear_avg,timefull_avg" file="scalfmm.sqlite3">
+                <key>gitcommit</key>
+                <key>gitcommitdate</key>
+                <key>hostname</key>
+                <key>ndim</key>
+                <key>kernel_type</key>
+                <key>interp_type</key>
+                <key>nrun</key>
+                <key>tree_height</key>
+                <key>interp_order</key>
+                <key>size</key>
+                <key>timefar_avg</key>
+                <key>timenear_avg</key>
+                <key>timefull_avg</key>
+            </database>
+        </result>
+
+    </benchmark>
+</jube>
-- 
GitLab