From 5f757e59d798d400b5fab336f8e77f6360072b19 Mon Sep 17 00:00:00 2001
From: olga <odatskov@cern.ch>
Date: Tue, 16 Jun 2020 10:10:20 +0200
Subject: [PATCH] Adding an orchestrator for simpletrack including CI benchmark
 mode tests

---
 lhc/simpletrack/.simpletrack-ci.yml  | 67 +++++++++++-----------
 lhc/simpletrack/CHANGELOG.md         |  5 ++
 lhc/simpletrack/Dockerfile.intel     |  7 ++-
 lhc/simpletrack/Dockerfile.nvidia    |  7 ++-
 lhc/simpletrack/Dockerfile.pocl      |  9 ++-
 lhc/simpletrack/README.md            | 12 ++--
 lhc/simpletrack/lhc-simpletrack.sh   | 83 ++++++++++++++++++++++++++++
 lhc/simpletrack/lhc-simpletrack.spec |  2 +-
 8 files changed, 146 insertions(+), 46 deletions(-)
 create mode 100755 lhc/simpletrack/lhc-simpletrack.sh

diff --git a/lhc/simpletrack/.simpletrack-ci.yml b/lhc/simpletrack/.simpletrack-ci.yml
index 9d16d71..0379095 100644
--- a/lhc/simpletrack/.simpletrack-ci.yml
+++ b/lhc/simpletrack/.simpletrack-ci.yml
@@ -2,6 +2,7 @@
 stages:
 - build
 - test
+- benchmark
 
 .job_template: &job_build
   stage: build
@@ -14,52 +15,54 @@ stages:
   - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
   - export HEP_TAG=`grep HEPWL_DOCKERIMAGETAG lhc/simpletrack/lhc-simpletrack.spec | cut -d "=" -f 2`
 
-nvidia:
+.job_template: &job_test
+  stage: test
+  environment:
+    name: test/$CI_COMMIT_REF_NAME
+  script: [ "echo test" ]
+
+.job_template: &job_benchmark
+  stage: benchmark
+  environment:
+    name: test/$CI_COMMIT_REF_NAME
+  script: [ "echo test" ]
+  variables:
+    BENCHMARK: "device"
+  artifacts:
+    paths:
+    - jobs/
+ 
+build:nvidia:
   <<: *job_build
   script:
-  - mkdir public && wget http://img.shields.io/badge/${HEP_TAG}-Failed-red?style=flat-square -O public/build_simpletrack_nvidia.svg
   - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/lhc/simpletrack/Dockerfile.nvidia --destination ${CI_REGISTRY_IMAGE}/lhc/simpletrack:nvidia-$HEP_TAG --destination ${CI_REGISTRY_IMAGE}/lhc/simpletrack:nvidia-latest
-  - wget http://img.shields.io/badge/${HEP_TAG}-Done-green?style=flat-square -O public/build_simpletrack_nvidia.svg
-  artifacts:
-    paths:
-    - public/build_simpletrack_nvidia.svg
 
-intel:
+build:intel:
   <<: *job_build
   script:
-  - mkdir public && wget http://img.shields.io/badge/${HEP_TAG}-Failed-red?style=flat-square -O public/build_simpletrack_intel.svg
   - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/lhc/simpletrack/Dockerfile.intel  --destination ${CI_REGISTRY_IMAGE}/lhc/simpletrack:intel-$HEP_TAG --destination ${CI_REGISTRY_IMAGE}/lhc/simpletrack:intel-latest
-  - wget http://img.shields.io/badge/${HEP_TAG}-Done-green?style=flat-square -O public/build_simpletrack_intel.svg
-  artifacts:
-    paths:
-    - public/build_simpletrack_intel.svg
 
-pocl:
+build:pocl:
   <<: *job_build
   script:
-  - mkdir public && wget http://img.shields.io/badge/${HEP_TAG}-Failed-red?style=flat-square -O public/build_simpletrack_pocl.svg
   - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/lhc/simpletrack/Dockerfile.pocl  --destination ${CI_REGISTRY_IMAGE}/lhc/simpletrack:pocl-$HEP_TAG --destination ${CI_REGISTRY_IMAGE}/lhc/simpletrack:pocl-latest
-  - wget http://img.shields.io/badge/${HEP_TAG}-Done-green?style=flat-square -O public/build_simpletrack_pocl.svg
-  artifacts:
-    paths:
-    - public/build_simpletrack_pocl.svg
 
-intel-test:
-  stage: test
+test:intel:
+  <<: *job_test
   image:
     name: gitlab-registry.cern.ch/hep-benchmarks/hep-workloads-gpu/lhc/simpletrack:intel-latest
-    entrypoint: [""]
-  environment:
-    name: test/$CI_COMMIT_REF_NAME
-  script:
-  - cd /simpletrack/examples/lhc && python3 benchmark_opencl.py -s && python3 benchmark_opencl.py -p 100 -t 5
 
-pocl-test:
-  stage: test
+test:pocl:
+  <<: *job_test
+  image:
+    name: gitlab-registry.cern.ch/hep-benchmarks/hep-workloads-gpu/lhc/simpletrack:pocl-latest
+
+bench:intel:
+  <<: *job_benchmark
+  image:
+    name: gitlab-registry.cern.ch/hep-benchmarks/hep-workloads-gpu/lhc/simpletrack:intel-latest
+
+bench:pocl:
+  <<: *job_benchmark
   image:
     name: gitlab-registry.cern.ch/hep-benchmarks/hep-workloads-gpu/lhc/simpletrack:pocl-latest
-    entrypoint: [""]
-  environment:
-    name: test/$CI_COMMIT_REF_NAME
-  script:
-  - cd /simpletrack/examples/lhc && python3 benchmark_opencl.py -s && python3 benchmark_opencl.py -p 100 -t 5
diff --git a/lhc/simpletrack/CHANGELOG.md b/lhc/simpletrack/CHANGELOG.md
index eea2fa9..89edc7a 100644
--- a/lhc/simpletrack/CHANGELOG.md
+++ b/lhc/simpletrack/CHANGELOG.md
@@ -1,3 +1,8 @@
+# 0.2.0 (June 16th 2020)
+
+FEATURES:
+* Added "benchmark" mode to run and generate json output for the runs.
+
 # 0.1.0 (June 13th 2020)
 
 FEATURES:
diff --git a/lhc/simpletrack/Dockerfile.intel b/lhc/simpletrack/Dockerfile.intel
index e42a0b0..2c1b6a4 100644
--- a/lhc/simpletrack/Dockerfile.intel
+++ b/lhc/simpletrack/Dockerfile.intel
@@ -3,6 +3,7 @@ FROM debian:latest
 ENV PARTICLES 20000
 ENV TURNS 15
 ENV DEVICE "0.0"
+ENV BENCHMARK ""
 
 ENV INTEL_OCL_DIR "/opt/intel/oclcpuexp"
 ENV INTEL_TBB_DIR "/opt/intel/tbb"
@@ -37,6 +38,8 @@ RUN mkdir -p ${INTEL_NEO_DIR} && cd ${INTEL_NEO_DIR} \
 
 RUN mkdir /.cache && chmod -R 777 /.cache \
     && git clone https://github.com/rdemaria/simpletrack \
-    && cd simpletrack && pip3 install pyopencl && pip3 install -e .
+    && cd simpletrack && pip3 install pyopencl && pip3 install -e . 
 
-ENTRYPOINT [ "/bin/bash", "-c", "cd /simpletrack/examples/lhc && python3 benchmark_opencl.py -p $PARTICLES -t $TURNS -d $DEVICE" ]
+COPY lhc/simpletrack/lhc-simpletrack.sh /simpletrack/examples/lhc/lhc-simpletrack.sh
+
+ENTRYPOINT [ "/bin/bash", "-c", "cd /simpletrack/examples/lhc && ./lhc-simpletrack.sh" ]
diff --git a/lhc/simpletrack/Dockerfile.nvidia b/lhc/simpletrack/Dockerfile.nvidia
index 2e278f4..6c1ea6d 100644
--- a/lhc/simpletrack/Dockerfile.nvidia
+++ b/lhc/simpletrack/Dockerfile.nvidia
@@ -3,6 +3,7 @@ FROM gitlab-registry.cern.ch/linuxsupport/cc7-base:latest
 ENV PARTICLES 20000
 ENV TURNS 15
 ENV DEVICE "0.0"
+ENV BENCHMARK ""
 
 ENV NVIDIA_VISIBLE_DEVICES all
 ENV NVIDIA_DRIVER_CAPABILITIES compute,utility
@@ -15,6 +16,8 @@ RUN distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
 RUN yum install -y python3 python3-devel python3-pip git gcc && pip3 install pyopencl \
     && mkdir /.cache && chmod -R 777 /.cache \
     && git clone https://github.com/rdemaria/simpletrack \
-    && cd simpletrack && pip3 install -e .
+    && cd simpletrack && pip3 install -e . 
 
-ENTRYPOINT [ "/bin/bash", "-c", "cd /simpletrack/examples/lhc && python3 benchmark_opencl.py -p $PARTICLES -t $TURNS -d $DEVICE" ]
+COPY lhc/simpletrack/lhc-simpletrack.sh /simpletrack/examples/lhc/lhc-simpletrack.sh
+
+ENTRYPOINT [ "/bin/bash", "-c", "cd /simpletrack/examples/lhc && ./lhc-simpletrack.sh" ]
diff --git a/lhc/simpletrack/Dockerfile.pocl b/lhc/simpletrack/Dockerfile.pocl
index 635ec1b..464af7f 100644
--- a/lhc/simpletrack/Dockerfile.pocl
+++ b/lhc/simpletrack/Dockerfile.pocl
@@ -1,12 +1,13 @@
 FROM debian:latest
 
 ARG LLVM_VERSION=7
-ENV OCL_ICD_VENDORS=/pocl/build/ocl-vendors
-ENV POCL_BUILDING=1
+ENV OCL_ICD_VENDORS "/pocl/build/ocl-vendors"
+ENV POCL_BUILDING "1"
 
 ENV PARTICLES 20000
 ENV TURNS 15
 ENV DEVICE "0.0"
+ENV BENCHMARK ""
 
 RUN apt update && apt upgrade -y \
     && apt-get install -y build-essential ocl-icd-libopencl1 cmake git gcc g++ libhwloc5 pkg-config python3-pip libclang-${LLVM_VERSION}-dev clang-${LLVM_VERSION} llvm-${LLVM_VERSION}-dev make ninja-build ocl-icd-libopencl1 ocl-icd-dev ocl-icd-opencl-dev libhwloc-dev zlib1g zlib1g-dev clinfo
@@ -19,4 +20,6 @@ RUN mkdir /.cache && chmod -R 777 /.cache/ \
     && git clone https://github.com/rdemaria/simpletrack.git \
     && cd simpletrack && pip3 install pyopencl && pip3 install -e . 
 
-ENTRYPOINT [ "/bin/bash", "-c", "cd /simpletrack/examples/lhc/ && python3 benchmark_opencl.py -p $PARTICLES -t $TURNS -d $DEVICE" ]
+COPY lhc/simpletrack/lhc-simpletrack.sh /simpletrack/examples/lhc/lhc-simpletrack.sh
+
+ENTRYPOINT [ "/bin/bash", "-c", "cd /simpletrack/examples/lhc/ && ./lhc-simpletrack.sh" ]
diff --git a/lhc/simpletrack/README.md b/lhc/simpletrack/README.md
index d003953..dab4e93 100644
--- a/lhc/simpletrack/README.md
+++ b/lhc/simpletrack/README.md
@@ -10,7 +10,6 @@ Docker images containing Simpletrack benchmark built a selection of GPU/CPU targ
 |--------------|:-------:|:-------:|:------:|
 | __GPU__      | :heavy_check_mark:  | :heavy_check_mark: |        |       
 | __CPU__      | :heavy_check_mark:  |         | :heavy_check_mark: |
-| Latest build | [![intel build](https://gitlab.cern.ch/hep-benchmarks/hep-workloads-gpu/-/jobs/artifacts/master/raw/public/build_simpletrack_intel.svg?job=intel)](https://gitlab.cern.ch/hep-benchmarks/hep-workloads-gpu/-/commits/master)  | [![nvidia build](https://gitlab.cern.ch/hep-benchmarks/hep-workloads-gpu/-/jobs/artifacts/master/raw/public/build_simpletrack_nvidia.svg?job=nvidia)](https://gitlab.cern.ch/hep-benchmarks/hep-workloads-gpu/-/commits/master) | [![pocl build](https://gitlab.cern.ch/hep-benchmarks/hep-workloads-gpu/-/jobs/artifacts/master/raw/public/build_simpletrack_pocl.svg?job=pocl)](https://gitlab.cern.ch/hep-benchmarks/hep-workloads-gpu/-/commits/master) |
 
 # Usage
 
@@ -18,11 +17,12 @@ Docker images containing Simpletrack benchmark built a selection of GPU/CPU targ
 
 Default entrypoint accepts the following environment for benchmark execution:
 
-|           | Default  | Description         |
-|-----------|----------|---------------------|
-| PARTICLES | 20000    | Number of particles |
-| TURNS     | 15       | Number of turns     |
-| DEVICE    | "0.0"    | Platform ID         |
+| Variable      | Default  | Description         |
+|---------------|----------|---------------------|
+| __PARTICLES__ | 20000    | Number of particles |
+| __TURNS__     | 15       | Number of turns     |
+| __DEVICE__    | "0.0"    | Platform ID         |
+| __BENCHMARK__ | ""       | Enable specific benchmark mode with "all", "device" | 
 
 Docker example:
 
diff --git a/lhc/simpletrack/lhc-simpletrack.sh b/lhc/simpletrack/lhc-simpletrack.sh
new file mode 100755
index 0000000..5e20cdb
--- /dev/null
+++ b/lhc/simpletrack/lhc-simpletrack.sh
@@ -0,0 +1,83 @@
+#!/bin/bash
+
+########################
+function get_clinfo() { echo "$CLINFO_OUT" | grep -e "$1" | sed -r 's/\S+ \S+ \s+//1'; }
+########################
+
+########################
+function gen_devices() {
+########################
+  PLATFORMS="$(clinfo -l | grep "Platform" | cut -d"#" -f2 | cut -d":" -f1)"
+  DEVICES="$(clinfo -l | grep "Device" | cut -d"#" -f2 | cut -d":" -f1)"
+
+  for dev_id in $(seq 1 $(echo "$DEVICES" | wc -l))
+  do
+    id=`echo "$PLATFORMS" | head -n $dev_id | tail -1`.`echo "$DEVICES" | head -n $dev_id | tail -1`
+    dtype=`get_clinfo 'Device Type' | head -n $dev_id | tail -1 | xargs`
+    name=`get_clinfo 'Device Name' | head -n $dev_id | tail -1 | xargs`
+    dev_ver=`get_clinfo 'Device Version' | head -n $dev_id | tail -1 | xargs`
+    dri_ver=`get_clinfo 'Driver Version' | head -n $dev_id | tail -1 | xargs`
+    max_units=`get_clinfo 'Max compute units' | awk '{print $2}' | head -n $dev_id | tail -1 | xargs`
+
+    echo "\"device_id\":\"$id\",\"device_type\":\"$dtype\",\"device_name\":\"$name\",\"device_version\":\"$dev_ver\",\"driver_version\":\"$dri_ver\",\"max_units\":\"$max_units\""
+  done
+}
+
+#########################
+function log() {
+#########################
+  case $1 in
+    error)  shift 1; echo -e "\e[31m>>> ERROR:\e[0m $*\n" | tee -a $WORK_DIR/out.log ; exit 2 ;;
+    info)   shift 1; echo -e "\e[34m$*\e[0m\n" | tee -a $WORK_DIR/out.log ;;
+    silent) shift 1; echo "$*" >> $WORK_DIR/out.log ;;
+    *)      echo "$*" | tee -a $WORK_DIR/out.log ;
+  esac
+}
+
+##########################
+function run_benchmark() {
+##########################
+  OUT=$(python3 benchmark_opencl.py -p $PARTICLES -t $TURNS -d $1 2>&1 | tee $WORK_DIR/out.log)
+  RESULT=`echo "$OUT" | grep 'particles\*turns/seconds'` 
+
+  if [ "$RESULT" == "" ]; then log error "Failed to parse the output. Failed run?";
+  else echo $(echo $RESULT | cut -d' ' -f1 | xargs); fi
+}
+
+##########################
+function get_json() {
+##########################
+  dev_line=`echo "$DEVICES" | grep "\"device_id\":\"$1\""`
+  echo "{\"copies\":\"1\",\"threads_per_copy\":\"$TURNS\",\"events_per_thread\":\"$PARTICLES\",\"wl-scores\":{\"sim\":\"$2\"},\"device\":{$dev_line}}"
+}
+
+###################################
+####### Main ######################
+
+if [ ! "$CI_PROJECT_DIR" == "" ]; then WORK_DIR=$CI_PROJECT_DIR/jobs;
+else WORK_DIR=`pwd`/jobs; fi
+
+if [ ! -d $WORK_DIR ]; then mkdir -p $WORK_DIR; fi
+if [ -f $WORK_DIR/out.log ]; then rm $WORK_DIR/out.log; fi
+
+CLINFO_OUT=`echo "$(clinfo | tee $WORK_DIR/clinfo.log)"`
+
+if [ `echo $CLINFO_OUT | grep 'Number of platforms' | awk '{print $4}'` -eq 0 ]; then 
+	log error "No platforms found. Exiting.."; fi
+
+DEVICES="$(gen_devices | tee $WORK_DIR/devices.log)"
+log silent "Devices found:\n$DEVICES"
+
+case $BENCHMARK in
+  all)     list=( `echo "$DEVICES" | cut -d"\"" -f4 | xargs` );
+	   log info "Running benchmark for ${#list[@]} device(s)"; 
+	   for dev in "${list[@]}"
+	   do
+		   OUT=$(run_benchmark $dev); get_json $dev $OUT | tee -a $WORK_DIR/summary.json
+	   done ;;
+  device)  log info "Running benchmark for $DEVICE device";
+	   OUT=$(run_benchmark $DEVICE); get_json $DEVICE $OUT | tee -a $WORK_DIR/summary.json ;;
+  *)       python3 benchmark_opencl.py -p $PARTICLES -t $TURNS -d $DEVICE 2>&1 | tee -a $WORK_DIR/out.log;	  
+esac
+
+log info "\nFinished running simpletrack"
diff --git a/lhc/simpletrack/lhc-simpletrack.spec b/lhc/simpletrack/lhc-simpletrack.spec
index 33a0bb2..9da47f5 100644
--- a/lhc/simpletrack/lhc-simpletrack.spec
+++ b/lhc/simpletrack/lhc-simpletrack.spec
@@ -3,5 +3,5 @@ HEPWL_BMKOPTS="-p 20000 -t 15 -d \"0.0\""
 HEPWL_BMKDIR=
 HEPWL_BMKDESCRIPTION="Simpletrack OpenCL WIP of SixTrack"
 HEPWL_DOCKERIMAGENAME=lhc/simpletrack
-HEPWL_DOCKERIMAGETAG=0.1.0
+HEPWL_DOCKERIMAGETAG=0.2.0
 HEPWL_CVMFSREPOS=
-- 
GitLab