From acc456c1a9ecf8e1b8483de277e2b9c9bcc0992e Mon Sep 17 00:00:00 2001
From: Jean-Baptiste Keck <Jean-Baptiste.Keck@imag.fr>
Date: Sun, 19 Apr 2020 14:42:54 +0200
Subject: [PATCH] fix docker image

---
 ci/docker_images/ubuntu/bionic/Dockerfile | 99 ++++++++++++++++-------
 ci/scripts/build.sh                       |  0
 ci/scripts/build_and_test.sh              | 28 +++++++
 ci/scripts/install.sh                     |  0
 ci/scripts/version.sh                     |  0
 ci/utils/build_docker_image.sh            |  6 ++
 ci/utils/pull_docker_image.sh             |  4 +
 ci/utils/push_docker_image.sh             |  5 ++
 ci/utils/run_ci.sh                        | 24 ++++++
 ci/utils/run_docker_image.sh              |  4 +
 hysop/backend/device/opencl/opencl_env.py |  3 +-
 test_ci_docker.sh                         |  1 +
 12 files changed, 145 insertions(+), 29 deletions(-)
 mode change 100644 => 100755 ci/scripts/build.sh
 create mode 100755 ci/scripts/build_and_test.sh
 mode change 100644 => 100755 ci/scripts/install.sh
 mode change 100644 => 100755 ci/scripts/version.sh
 create mode 100755 ci/utils/build_docker_image.sh
 create mode 100755 ci/utils/pull_docker_image.sh
 create mode 100755 ci/utils/push_docker_image.sh
 create mode 100755 ci/utils/run_ci.sh
 create mode 100755 ci/utils/run_docker_image.sh
 create mode 120000 test_ci_docker.sh

diff --git a/ci/docker_images/ubuntu/bionic/Dockerfile b/ci/docker_images/ubuntu/bionic/Dockerfile
index bbacf57fa..9c020ccee 100644
--- a/ci/docker_images/ubuntu/bionic/Dockerfile
+++ b/ci/docker_images/ubuntu/bionic/Dockerfile
@@ -12,7 +12,7 @@ RUN apt-get update
 RUN apt-get full-upgrade -y
 
 # get build tools and required libraries
-RUN apt-get install -y expat unzip xz-utils automake libtool pkg-config cmake git vim ssh clang gcc gfortran cython swig lsb-core cpio libnuma1 libpciaccess0 libreadline-dev libboost-all-dev libblas-dev liblapack-dev libcgal-dev libatlas-base-dev libopenblas-dev libgfortran3 libgcc1 libopenmpi-dev libhdf5-openmpi-dev libfftw3-dev libfftw3-mpi-dev libgmp-dev libmpfr-dev libmpc-dev libsparsehash-dev libcairo-dev libcairomm-1.0-dev python python-dev python-pip python-tk opencl-headers ocl-icd-libopencl1 clinfo 
+RUN apt-get install -y expat unzip xz-utils automake libtool pkg-config cmake git vim ssh clang gcc gfortran cython swig lsb-core cpio libnuma1 libpciaccess0 libreadline-dev libboost-all-dev libblas-dev liblapack-dev libcgal-dev libatlas-base-dev libopenblas-dev libgfortran3 libgcc1 libopenmpi-dev libhdf5-openmpi-dev libfftw3-dev libfftw3-mpi-dev libgmp-dev libmpfr-dev libmpc-dev libsparsehash-dev libcairo-dev libcairomm-1.0-dev libflint-dev python python-dev python-pip python-tk opencl-headers
 
 # python packages using pip
 RUN pip install --upgrade pip
@@ -43,23 +43,61 @@ RUN cd /tmp && \
  cd - && \
  rm -Rf /tmp/patchelf
 
-# Intel OpenCl
+# 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
+
+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 && \
+ tar -xvzf oclcpuexp-2020.10.3.0.04_rel.tar.gz && \
+ mv x64/ /opt/intel/oclcpuexp/ && \
+ mv clbltfnshared.rtl /opt/intel/oclcpuexp/ && \
+ rm -rf x64 *.rtl oclcpuexp* && \
+ wget https://github.com/oneapi-src/oneTBB/releases/download/v2020.2/tbb-2020.2-lin.tgz && \
+ tar -xvzf tbb-2020.2-lin.tgz && \
+ mv tbb/lib/intel64/gcc4.8/* /opt/intel/oclcpuexp/x64/ && \
+ rm -f /usr/local/lib/libOpenCL.so && \
+ rm -f /usr/local/lib/libOpenCL.so && \
+ rm -f /usr/local/lib/libOpenCL.so.1 && \
+ rm -f /usr/local/lib/libOpenCL.so.2.0 && \
+ ln -s /opt/intel/oclcpuexp/x64/libOpenCL.so /usr/local/lib/libOpenCL.so && \
+ ln -s /opt/intel/oclcpuexp/x64/libOpenCL.so.1 /usr/local/lib/libOpenCL.so.1 && \
+ ln -s /opt/intel/oclcpuexp/x64/libOpenCL.so.2.0 /usr/local/lib/libOpenCL.so.2.0 && \
+ mkdir -p /etc/OpenCL/vendors && \
+ echo /opt/intel/oclcpuexp/x64/libintelocl.so > /etc/OpenCL/vendors/intel_expcpu.icd && \
+ rm -rf /tmp/tbb*
+
+# clinfo 2.2.18 (2018)
 RUN cd /tmp && \
- mkdir intel && \
- cd intel && \
- wget http://registrationcenter-download.intel.com/akdlm/irc_nas/12556/opencl_runtime_16.1.2_x64_rh_6.4.0.37.tgz && \
- tar -xvzf opencl_runtime_16.1.2_x64_rh_6.4.0.37.tgz && \
- cd opencl_runtime_16.1.2_x64_rh_6.4.0.37 && \
- ls -la && \
- sed -i "s/ACCEPT_EULA=decline/ACCEPT_EULA=accept/g" "silent.cfg" && \
- ./install.sh --silent ./silent.cfg && \
- cd /tmp && \
- rm -Rf /tmp/intel
-https://software.intel.com/en-us/articles/opencl-runtime-release-notes/#181
+ wget https://github.com/Oblomov/clinfo/archive/2.2.18.04.06.tar.gz && \
+ tar -xvzf *.tar.gz && \
+ rm -f *.tar.gz && \
+ cd clinfo-* && \
+ make && \
+ mv clinfo /usr/local/bin && \
+ rm -rf /tmp/clinfo-*
 
-# Fix OpenCl ICD
-RUN ln -s /usr/lib/x86_64-linux-gnu/libOpenCL.so.1 /usr/lib/x86_64-linux-gnu/libOpenCL.so
-RUN ldconfig
+# clpeak 1.1.0 RC2 (2019)
+RUN cd /tmp && \
+ wget https://github.com/krrishnarraj/clpeak/archive/1.1.0-rc2.tar.gz && \
+ tar -xvzf *.tar.gz && \
+ rm -f *.tar.gz && \
+ cd clpeak-* && \
+ mkdir build && \
+ cd build/ && \
+ cmake .. && \
+ make && \
+ mv clpeak /usr/local/bin && \
+ rm -rf /tmp/clpeak-*
 
 # pyopencl
 RUN cd /tmp && \
@@ -85,18 +123,6 @@ RUN cd /tmp && \
  cd - && \
  rm -Rf /tmp/Oclgrind
 
-# clpeak
-RUN cd /tmp && \
- git clone https://github.com/krrishnarraj/clpeak && \
- cd clpeak/ && \
- mkdir build && \
- cd build/ && \
- cmake .. && \
- make && \
- mv clpeak /usr/local/bin/ && \
- cd - && \
- rm -Rf /tmp/clpeak
-
 # clFFT
 RUN cd /tmp && \
  ln -s /usr/local/lib /usr/local/lib64 && \
@@ -151,6 +177,23 @@ RUN cd /tmp && \
  cd /tmp && \
  rm -Rf /tmp/memory-tempfile
 
+# python flint
+RUN cd /tmp \
+  && wget https://github.com/fredrik-johansson/arb/archive/2.16.0.tar.gz \
+  && tar -xvzf 2.16.0.tar.gz \
+  && cd arb-2.16.0 \
+  && ./configure \
+  && make -j$(nproc) \
+  && make install \
+  && cd - \
+  && rm -rf arb-2.16.0
+RUN cd /tmp \
+  && git clone https://github.com/fredrik-johansson/python-flint \
+  && cd python-flint \
+  && pip install . \
+  && cd - \
+  && rm -rf python-flint
+
 # ensure all libraries are known by the runtime linker
 RUN ldconfig
 
diff --git a/ci/scripts/build.sh b/ci/scripts/build.sh
old mode 100644
new mode 100755
diff --git a/ci/scripts/build_and_test.sh b/ci/scripts/build_and_test.sh
new file mode 100755
index 000000000..44264d82b
--- /dev/null
+++ b/ci/scripts/build_and_test.sh
@@ -0,0 +1,28 @@
+#!/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'
+HYSOP_BUILD_DIR="${HYSOP_DIR}/build"
+HYSOP_INSTALL_DIR='/opt/hysop'
+
+cp -r /hysop "${HYSOP_DIR}"
+rm -rf "${HYSOP_BUILD_DIR}"
+
+SCRIPT_DIR="${HYSOP_DIR}/ci/scripts"
+cd "${HYSOP_DIR}"
+${SCRIPT_DIR}/version.sh
+${SCRIPT_DIR}/config.sh "${HYSOP_BUILD_DIR}" "${HYSOP_INSTALL_DIR}" "${CC}" "${CXX}" "${FC}"
+${SCRIPT_DIR}/build.sh "${HYSOP_BUILD_DIR}" "${CC}" "${CXX}" "${FC}"
+${SCRIPT_DIR}/install.sh "${HYSOP_BUILD_DIR}" "${HYSOP_INSTALL_DIR}"
+${SCRIPT_DIR}/test.sh "${HYSOP_INSTALL_DIR}" "${HYSOP_DIR}/hysop" "/cache"
diff --git a/ci/scripts/install.sh b/ci/scripts/install.sh
old mode 100644
new mode 100755
diff --git a/ci/scripts/version.sh b/ci/scripts/version.sh
old mode 100644
new mode 100755
diff --git a/ci/utils/build_docker_image.sh b/ci/utils/build_docker_image.sh
new file mode 100755
index 000000000..37751890c
--- /dev/null
+++ b/ci/utils/build_docker_image.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+set -euf -o pipefail
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+NTHREADS="$(python -c 'import psutil; print(psutil.cpu_count(logical=False))')"
+
+docker build --rm=true --build-arg "NTHREADS=$NTHREADS" "$@" -t 'keckj/hysop:bionic' -f "${SCRIPT_DIR}/../docker_images/ubuntu/bionic/Dockerfile" "${SCRIPT_DIR}/.."
diff --git a/ci/utils/pull_docker_image.sh b/ci/utils/pull_docker_image.sh
new file mode 100755
index 000000000..b0efca8ac
--- /dev/null
+++ b/ci/utils/pull_docker_image.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+set -euf -o pipefail
+docker logout
+docker pull keckj/hysop:bionic
diff --git a/ci/utils/push_docker_image.sh b/ci/utils/push_docker_image.sh
new file mode 100755
index 000000000..b19592e57
--- /dev/null
+++ b/ci/utils/push_docker_image.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+set -euf -o pipefail
+docker login
+docker push keckj/hysop:bionic
+docker logout
diff --git a/ci/utils/run_ci.sh b/ci/utils/run_ci.sh
new file mode 100755
index 000000000..927568a59
--- /dev/null
+++ b/ci/utils/run_ci.sh
@@ -0,0 +1,24 @@
+#!/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_test'
+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 "${CONTAINER_ID}" /hysop/ci/scripts/build_and_test.sh
diff --git a/ci/utils/run_docker_image.sh b/ci/utils/run_docker_image.sh
new file mode 100755
index 000000000..ac6e49cfc
--- /dev/null
+++ b/ci/utils/run_docker_image.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+set -euf -o pipefail
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+docker run -it -v "${SCRIPT_DIR}/../..:/hysop:ro" keckj/hysop:bionic
diff --git a/hysop/backend/device/opencl/opencl_env.py b/hysop/backend/device/opencl/opencl_env.py
index ed84e0f68..f85f5a7e9 100644
--- a/hysop/backend/device/opencl/opencl_env.py
+++ b/hysop/backend/device/opencl/opencl_env.py
@@ -566,13 +566,14 @@ Dumped OpenCL Kernel '{}'
         if not os.path.exists(dump_folder) and (main_rank == 0):
             os.makedirs(dump_folder)
 
-        if DEBUG:
+        if DEBUG and True:
             # dump kernel source while in debug mode
             dump_file=dump_folder+'/rk{}_{}_dump.cl'.format(
                 main_rank, kernel_name)
             print 'Dumping kernel src at \'{}\'.'.format(dump_file)
             with open(dump_file, 'w+') as f:
                 f.write(gpu_src)
+            build_opts += ['-g', '-s {}'.format(dump_file)]
         s_build_opts = ' '.join(build_opts)
 
         if VERBOSE:
diff --git a/test_ci_docker.sh b/test_ci_docker.sh
new file mode 120000
index 000000000..eb7ab4bbb
--- /dev/null
+++ b/test_ci_docker.sh
@@ -0,0 +1 @@
+ci/utils/run_ci.sh
\ No newline at end of file
-- 
GitLab