1+ FROM --platform=linux/amd64 opensuse/leap:15.6 AS build
2+
3+ ARG ROCM_ZYPP_REPO_VERSION=6.4.2
4+ ARG ROCM_ZYPP_PACKAGES=
5+ ARG MPICH_VERSION=4.1.2
6+ ARG MPICH_URL=https://www.mpich.org/static/downloads/4.1.2/mpich-4.1.2.tar.gz
7+ ARG AMREX_SPACEDIM=3
8+ ARG AMREX_MPI=ON
9+ ARG AMREX_AMD_ARCH=gfx90a
10+ ARG DOCKERFILES_DIR=.github/workflows/dockerfiles/ROCm-DiskGalaxy
11+
12+ # Combine system updates, repo setup, and package installation
13+ RUN set -euo pipefail && \
14+ echo "rpm.install.excludedocs = yes" >> /etc/zypp/zypp.conf && \
15+ zypper --non-interactive refresh && \
16+ zypper --non-interactive update && \
17+ if ! zypper repos -E | grep -q devel_languages_perl; then \
18+ zypper --non-interactive addrepo https://download.opensuse.org/repositories/devel:/languages:/perl/15.6/devel:languages:perl.repo; \
19+ fi && \
20+ printf "[ROCm-%s]\n name=ROCm%s\n baseurl=https://repo.radeon.com/rocm/zyp/%s/main\n enabled=1\n gpgcheck=1\n gpgkey=https://repo.radeon.com/rocm/rocm.gpg.key\n " \
21+ "${ROCM_ZYPP_REPO_VERSION}" "${ROCM_ZYPP_REPO_VERSION}" "${ROCM_ZYPP_REPO_VERSION}" > /etc/zypp/repos.d/rocm.repo && \
22+ zypper --non-interactive --gpg-auto-import-keys refresh && \
23+ if [ -n "${ROCM_ZYPP_PACKAGES}" ]; then \
24+ zypper --non-interactive install --no-recommends ${ROCM_ZYPP_PACKAGES}; \
25+ else \
26+ zypper --non-interactive install --no-recommends \
27+ rocm-llvm hipcc hip-runtime-amd hip-devel hsa-rocr comgr \
28+ rocm-device-libs rocrand-devel hiprand-devel rocprim-devel rocsparse-devel; \
29+ fi && \
30+ zypper --non-interactive install --no-recommends \
31+ cmake git gcc13 gcc13-c++ libstdc++6-devel-gcc13 \
32+ make tar gzip wget patch hdf5-devel python3-devel && \
33+ ln -sf /usr/lib64/libefa.so.1 /usr/lib64/libefa.so && \
34+ zypper clean --all && \
35+ printf "%s\n " "/opt/rocm/lib" "/opt/rocm/lib64" >> /etc/ld.so.conf.d/rocm.conf && \
36+ ldconfig
37+
38+ ENV PATH="/opt/rocm/bin:${PATH}" \
39+ LD_LIBRARY_PATH="/opt/rocm/lib:${LD_LIBRARY_PATH}" \
40+ ROCM_PATH="/opt/rocm" \
41+ AMREX_AMD_ARCH="${AMREX_AMD_ARCH}" \
42+ CC="amdclang" \
43+ CXX="amdclang++"
44+
45+ COPY . /tmp/quokka-src
46+ WORKDIR /tmp/quokka-src
47+
48+ # Combine MPICH download, patch, and build
49+ RUN set -euo pipefail && \
50+ test -f CMakeLists.txt || { \
51+ echo "ERROR: Quokka source not found in the Docker build context." >&2; \
52+ echo "Build from the repo root, e.g.: docker build -f .github/workflows/dockerfiles/ROCm-DiskGalaxy/Dockerfile ." >&2; \
53+ exit 1; \
54+ } && \
55+ if [ -f "/tmp/quokka-src/${DOCKERFILES_DIR}/mpich-4.1.2-rocm-6.4-hip-pointer-attr.patch" ]; then \
56+ PATCH_PATH="/tmp/quokka-src/${DOCKERFILES_DIR}/mpich-4.1.2-rocm-6.4-hip-pointer-attr.patch" ; \
57+ elif [ -f "/tmp/quokka-src/mpich-4.1.2-rocm-6.4-hip-pointer-attr.patch" ]; then \
58+ PATCH_PATH="/tmp/quokka-src/mpich-4.1.2-rocm-6.4-hip-pointer-attr.patch" ; \
59+ else \
60+ echo "ERROR: MPICH patch not found." >&2; exit 1; \
61+ fi && \
62+ mkdir -p /tmp/build-mpich && \
63+ cd /tmp/build-mpich && \
64+ wget -q "${MPICH_URL}" -O "mpich-${MPICH_VERSION}.tar.gz" && \
65+ tar xzf "mpich-${MPICH_VERSION}.tar.gz" && \
66+ cd "mpich-${MPICH_VERSION}" && \
67+ patch -p1 < "$PATCH_PATH" && \
68+ ./configure --with-device=ch4:ofi --disable-fortran --prefix="/opt/mpich/${MPICH_VERSION}" && \
69+ make -j"$(nproc)" && \
70+ make install && \
71+ cd .. && \
72+ rm -rf mpich-4.1.2/ mpich-4.1.2.tar.gz /tmp/mpich-4.1.2-rocm-6.4-hip-pointer-attr.patch && \
73+ cd / && \
74+ rm -rf /tmp/build-mpich
75+
76+
77+ ENV MPICH_VERSION="${MPICH_VERSION}" \
78+ MPICH_DIR="/opt/mpich/${MPICH_VERSION}" \
79+ PATH="/opt/mpich/${MPICH_VERSION}/bin:${PATH}" \
80+ LD_LIBRARY_PATH="/opt/mpich/${MPICH_VERSION}/lib:${LD_LIBRARY_PATH}"
81+
82+ # Build Quokka
83+ RUN set -euo pipefail && \
84+ cmake -S . -B build \
85+ -DCMAKE_BUILD_TYPE=Release \
86+ -DAMReX_SPACEDIM="${AMREX_SPACEDIM}" \
87+ -DAMReX_GPU_BACKEND=HIP \
88+ -DAMReX_MPI="${AMREX_MPI}" \
89+ -DAMReX_GPU_ARCH="${AMREX_AMD_ARCH}" \
90+ -DCMAKE_C_COMPILER="${CC}" \
91+ -DCMAKE_CXX_COMPILER="${CXX}" \
92+ -DQUOKKA_PYTHON=OFF && \
93+ cmake --build build -j"$(nproc)" --target DiskGalaxy && \
94+ test -x build/src/problems/DiskGalaxy/DiskGalaxy
95+
96+ # Runtime stage (reduced image size)
97+ FROM --platform=linux/amd64 opensuse/leap:15.6
98+
99+ ARG MPICH_VERSION=4.1.2
100+
101+ COPY --from=build /opt/rocm /opt/rocm
102+ COPY --from=build /opt/mpich /opt/mpich
103+
104+ # Install runtime deps, cleanup, and setup user
105+ RUN set -euo pipefail && \
106+ zypper --non-interactive refresh && \
107+ zypper --non-interactive install --no-recommends libhdf5 libpciaccess0 libnuma1 libdrm2 libdrm_amdgpu1 && \
108+ zypper clean --all && \
109+ printf "%s\n " "/opt/rocm/lib" "/opt/rocm/lib64" >> /etc/ld.so.conf.d/rocm.conf && \
110+ rm -rf /opt/rocm/bin /opt/rocm/include /opt/rocm/share /opt/rocm/lib/cmake \
111+ /opt/rocm/llvm/bin /opt/rocm/llvm/include /opt/rocm/llvm/share /opt/rocm/llvm/lib/cmake && \
112+ find /opt/rocm -type f -name "*.a" -delete && \
113+ find /opt/rocm -type f -name "*.o" -delete && \
114+ find /opt/mpich -type f -name "*.a" -delete && \
115+ find /opt/mpich -type f -name "*.o" -delete && \
116+ ldconfig && \
117+ mkdir -p /opt/quokka/bin /opt/quokka/share/quokka/inputs /opt/quokka/share/quokka/extern/agora_data && \
118+ useradd -ms /bin/bash leap && \
119+ usermod -a -G render,video leap
120+
121+ COPY --from=build /tmp/quokka-src/build/src/problems/DiskGalaxy/DiskGalaxy /opt/quokka/bin/DiskGalaxy
122+ COPY --from=build /tmp/quokka-src/inputs/DiskGalaxy.in /opt/quokka/share/quokka/inputs/DiskGalaxy.in
123+ COPY --from=build /tmp/quokka-src/extern/agora_data/ /opt/quokka/share/quokka/extern/agora_data/
124+
125+ RUN chmod 0755 /opt/quokka/bin/DiskGalaxy && \
126+ chown -R leap /opt/quokka
127+
128+ ENV MPICH_VERSION="${MPICH_VERSION}" \
129+ PATH="/opt/quokka/bin:/opt/mpich/${MPICH_VERSION}/bin:${PATH}" \
130+ LD_LIBRARY_PATH="/opt/mpich/${MPICH_VERSION}/lib:${LD_LIBRARY_PATH}"
131+
132+ USER leap
133+ WORKDIR /home/leap
0 commit comments