From 7d1d1d7a129c63bf91eea45691bb87312fdc87e8 Mon Sep 17 00:00:00 2001
From: Jean-Baptiste Keck <Jean-Baptiste.Keck@imag.fr>
Date: Sun, 19 Apr 2020 22:28:05 +0200
Subject: [PATCH] fixed regression in advection autotuning, ci should work now

---
 ci/docker_images/ubuntu/bionic/Dockerfile     | 20 +-----------
 ci/scripts/build_and_debug.sh                 | 32 +++++++++++++++++++
 ci/utils/run_debug.sh                         | 26 +++++++++++++++
 .../codegen/kernels/directional_advection.py  | 19 ++++++++---
 test_ci.sh                                    | 10 +++---
 test_examples.sh                              | 10 +++---
 6 files changed, 85 insertions(+), 32 deletions(-)
 create mode 100755 ci/scripts/build_and_debug.sh
 create mode 100755 ci/utils/run_debug.sh

diff --git a/ci/docker_images/ubuntu/bionic/Dockerfile b/ci/docker_images/ubuntu/bionic/Dockerfile
index 9c020ccee..3e615c27d 100644
--- a/ci/docker_images/ubuntu/bionic/Dockerfile
+++ b/ci/docker_images/ubuntu/bionic/Dockerfile
@@ -20,13 +20,6 @@ RUN pip install --upgrade numpy setuptools cffi wheel pytest
 RUN pip install --upgrade backports.weakref backports.tempfile scipy sympy matplotlib mpi4py gmpy2 psutil py-cpuinfo Mako subprocess32 editdistance portalocker colors.py tee primefac pycairo weave argparse_color_formatter networkx pyvis
 RUN CC=mpicc HDF5_MPI="ON" pip install --upgrade --no-binary=h5py h5py
 
-# For documentation
-# RUN pip install --upgrade sphinx sphinxcontrib-bibtex sphinx_bootstrap_theme strip-hints
-# RUN cd /tmp  git clone https://github.com/sphinx-contrib/doxylink.git  cd doxylink/sphinxcontrib/doxylink && \
-# mv doxylink.py doxylink.py3  strip-hints doxylink.py3 > doxylink.py  rm doxylink.py3 && \
-# mv parsing.py parsing.py3  strip-hints parsing.py3 > parsing.py  rm parsing.py3 && \
-# cd ../..  python setup.py install
-
 # llvm + numba + llvmlite (llvmlite 0.32 has a bug with llvm8)
 RUN apt-get install -y llvm-8-dev libclang-8-dev clang-8
 ENV LLVM_CONFIG=llvm-config-8
@@ -43,18 +36,7 @@ RUN cd /tmp && \
  cd - && \
  rm -Rf /tmp/patchelf
 
-# Intel OpenCl runtime
-#RUN cd /tmp \
-#&& mkdir intel \
-#&& cd intel \
-#&& wget http://registrationcenter-download.intel.com/akdlm/irc_nas/vcp/15532/l_opencl_p_18.1.0.015.tgz \ 
-#&& tar -xvzf l_opencl_p_18.1.0.015.tgz \
-#&& cd l_opencl_p_18.1.0.015 \
-#&& sed -i "s/ACCEPT_EULA=decline/ACCEPT_EULA=accept/g" "silent.cfg" \
-#&& ./install.sh --silent ./silent.cfg \
-#&& cd /tmp \
-#&& rm -Rf /tmp/intel
-
+# Intel experimental OpenCL platform with SYCL support (2020-02)
 ENV LD_LIBRARY_PATH "/opt/intel/oclcpuexp/x64:${LD_LIBRARY_PATH}"
 RUN mkdir -p /opt/intel/oclcpuexp && \
  wget https://github.com/intel/llvm/releases/download/2020-02/oclcpuexp-2020.10.3.0.04_rel.tar.gz && \
diff --git a/ci/scripts/build_and_debug.sh b/ci/scripts/build_and_debug.sh
new file mode 100755
index 000000000..c5a1e1501
--- /dev/null
+++ b/ci/scripts/build_and_debug.sh
@@ -0,0 +1,32 @@
+#!/usr/bin/env bash
+set -euf -o pipefail
+
+# /hysop should be mounted as read only by run_tests_in_docker.sh
+if [[ ! -d '/hysop' ]]; then
+    echo "This script should not be called from host, but from within a docker image."
+    echo " => /hysop has not been mounted (see hysop/ci/utils/run_tests_in_docker.sh)."
+    exit 1
+fi
+
+CC=gcc-7
+CXX=g++-7
+FC=gfortran-7
+
+HYSOP_DIR='/tmp/hysop'
+
+cp -r /hysop "${HYSOP_DIR}"
+rm -rf "${HYSOP_DIR}/build"
+
+cd "${HYSOP_DIR}"
+mkdir build
+cd build
+cmake -DCMAKE_BUILD_TYPE=Debug ..
+make -j8
+make install
+cd -
+rm -rf build
+
+apt-get update
+apt-get install -y gdb python-dbg
+
+bash
diff --git a/ci/utils/run_debug.sh b/ci/utils/run_debug.sh
new file mode 100755
index 000000000..a2f85712c
--- /dev/null
+++ b/ci/utils/run_debug.sh
@@ -0,0 +1,26 @@
+
+
+#!/usr/bin/env bash
+set -feu -o pipefail
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+DOCKER_IMG='keckj/hysop:bionic'
+CONTAINER_ID='hysop_build_and_debug'
+HYSOP_CACHE_DIR="${HOME}/.cache/hysop"
+
+if [[ ! -d "${HYSOP_CACHE_DIR}" ]]; then
+    mkdir -p "${HYSOP_CACHE_DIR}"
+fi
+
+function remove_img() {
+    docker stop "${CONTAINER_ID}" || true
+    docker rm "${CONTAINER_ID}" || true
+} 
+trap remove_img INT TERM EXIT KILL
+
+remove_img
+
+docker logout
+docker pull "${DOCKER_IMG}"
+docker create -v "${SCRIPT_DIR}/../..:/hysop:ro" -v "${HYSOP_CACHE_DIR}:/cache:ro" --name="${CONTAINER_ID}" -it "${DOCKER_IMG}"
+docker start "${CONTAINER_ID}"
+docker exec -it "${CONTAINER_ID}" /hysop/ci/scripts/build_and_debug.sh
diff --git a/hysop/backend/device/codegen/kernels/directional_advection.py b/hysop/backend/device/codegen/kernels/directional_advection.py
index dcec71473..3c27a5bff 100644
--- a/hysop/backend/device/codegen/kernels/directional_advection.py
+++ b/hysop/backend/device/codegen/kernels/directional_advection.py
@@ -600,11 +600,20 @@ class DirectionalAdvectionKernelGenerator(KernelCodeGenerator):
                 s.jumpline()
 
                 if is_cached and not has_bilevel:
-                    code='event_t event = async_work_group_copy({dst}, {src}, {ne}, {event});'.format(
-                            dst=Vc, src=line_velocity, ne=V_cache_width, event=0)
-                    s.append(code)
-                    code = 'wait_group_events(1, &event);'
-                    s.append(code)
+                    if tuning_mode:
+                        loop = 'int {i}={Lx}; {i}<{N}; {i}+={gsize}'.format(
+                                i='idx', N=V_cache_width, 
+                                Lx=local_id[0], gsize=local_size[0])
+                        with s._for_(loop):
+                            code='{dst}[{i}] = 0.5;'.format(i='idx', dst=Vc)
+                            s.append(code)
+                        s.barrier(_local=True)
+                    else:
+                        code='event_t event = async_work_group_copy({dst}, {src}, {ne}, {event});'.format(
+                                dst=Vc, src=line_velocity, ne=V_cache_width, event=0)
+                        s.append(code)
+                        code = 'wait_group_events(1, &event);'
+                        s.append(code)
                     s.jumpline()
                 elif has_bilevel and not velocity_cache_full_length:
                     # We must load velocity cache line on the fly
diff --git a/test_ci.sh b/test_ci.sh
index 6d4c7e65d..8521dead6 100755
--- a/test_ci.sh
+++ b/test_ci.sh
@@ -1,12 +1,14 @@
 #!/bin/bash
-set -e
+set -fe -o pipefail
+
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 
 if [ -z "$HYSOP_ROOT" ]; then
-    HYSOP_ROOT=$(pwd)
+    HYSOP_ROOT="${SCRIPT_DIR}"
     echo "Warning: HYSOP_ROOT has not been set."
-    echo "Setting HYSOP_ROOT to '$HYSOP_ROOT'"
+    echo "Setting HYSOP_ROOT to '${HYSOP_ROOT}'"
 fi
 
-$HYSOP_ROOT/ci/scripts/test.sh $HYSOP_ROOT $HYSOP_ROOT/hysop
+${HYSOP_ROOT}/ci/scripts/test.sh ${HYSOP_ROOT} ${HYSOP_ROOT}/hysop
 
 exit 0
diff --git a/test_examples.sh b/test_examples.sh
index 3c99a0ce1..5162b3ca6 100755
--- a/test_examples.sh
+++ b/test_examples.sh
@@ -1,15 +1,17 @@
 #!/bin/bash
-set -e
+set -fe -o pipefail
+
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 
 if [ -z "$HYSOP_ROOT" ]; then
-    HYSOP_ROOT=$(pwd)
+    HYSOP_ROOT="${SCRIPT_DIR}"
     echo "Warning: HYSOP_ROOT has not been set."
-    echo "Setting HYSOP_ROOT to '$HYSOP_ROOT'"
+    echo "Setting HYSOP_ROOT to '${HYSOP_ROOT}'"
 fi
 
 export DO_TESTS=false
 export DO_LONG_TESTS=false
 export DO_EXAMPLES=true
-$HYSOP_ROOT/ci/scripts/test.sh $HYSOP_ROOT $HYSOP_ROOT/hysop
+${HYSOP_ROOT}/ci/scripts/test.sh ${HYSOP_ROOT} ${HYSOP_ROOT}/hysop
 
 exit 0
-- 
GitLab