From 13feee836439d84a44892bba298b692690c48fd3 Mon Sep 17 00:00:00 2001 From: BOUDAOUD34 <114594090+BOUDAOUD34@users.noreply.github.com> Date: Fri, 27 Sep 2024 10:19:38 +0200 Subject: [PATCH] =?UTF-8?q?CP2K:=20fix=20.mod=20file=20incompatibility=20o?= =?UTF-8?q?n=20ROCm=20by=20using=20USE,=20INTRINSIC=20d=E2=80=A6=20(#45848?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: U-PALLAS\boudaoud --- .../repos/builtin/packages/cp2k/package.py | 63 +++++++++++-------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/var/spack/repos/builtin/packages/cp2k/package.py b/var/spack/repos/builtin/packages/cp2k/package.py index e71368a0870..09e25d34d26 100644 --- a/var/spack/repos/builtin/packages/cp2k/package.py +++ b/var/spack/repos/builtin/packages/cp2k/package.py @@ -374,15 +374,31 @@ class Cp2k(MakefilePackage, CMakePackage, CudaPackage, ROCmPackage): # https://github.com/cp2k/cp2k/issues/3688 patch("d4-dispersion-bugfix-2024.3.patch", when="@2024.3") - # Patch for an undefined constant due to incompatible changes in ELPA - @when("@9.1:2022.2 +elpa") def patch(self): - if self.spec["elpa"].satisfies("@2022.05.001:"): - filter_file( - r"ELPA_2STAGE_REAL_INTEL_GPU", - "ELPA_2STAGE_REAL_INTEL_GPU_SYCL", - "src/fm/cp_fm_elpa.F", - ) + # Patch for an undefined constant due to incompatible changes in ELPA + if self.spec.satisfies("@9.1:2022.2 +elpa"): + if self.spec["elpa"].satisfies("@2022.05.001:"): + filter_file( + r"ELPA_2STAGE_REAL_INTEL_GPU", + "ELPA_2STAGE_REAL_INTEL_GPU_SYCL", + "src/fm/cp_fm_elpa.F", + ) + + # Patch for resolving .mod file conflicts in ROCm by implementing 'USE, INTRINSIC' + if self.spec.satisfies("+rocm"): + for directory, subdirectory, files in os.walk(os.getcwd()): + for i in files: + file_path = os.path.join(directory, i) + filter_file("USE ISO_C_BINDING", "USE,INTRINSIC :: ISO_C_BINDING", file_path) + filter_file( + "USE ISO_FORTRAN_ENV", "USE,INTRINSIC :: ISO_FORTRAN_ENV", file_path + ) + filter_file("USE omp_lib", "USE,INTRINSIC :: omp_lib", file_path) + filter_file("USE OMP_LIB", "USE,INTRINSIC :: OMP_LIB", file_path) + filter_file("USE iso_c_binding", "USE,INTRINSIC :: iso_c_binding", file_path) + filter_file( + "USE iso_fortran_env", "USE,INTRINSIC :: iso_fortran_env", file_path + ) def url_for_version(self, version): url = "https://github.com/cp2k/cp2k/releases/download/v{0}/cp2k-{0}.tar.bz2" @@ -410,6 +426,7 @@ def edit(self, pkg, spec, prefix): "cce": ["-O2"], "xl": ["-O3"], "aocc": ["-O2"], + "rocmcc": ["-O1"], } dflags = ["-DNDEBUG"] if spec.satisfies("@:2023.2") else [] @@ -451,7 +468,7 @@ def edit(self, pkg, spec, prefix): "-ffree-line-length-none", "-ggdb", # make sure we get proper Fortran backtraces ] - elif spec.satisfies("%aocc"): + elif spec.satisfies("%aocc") or spec.satisfies("%rocmcc"): fcflags += ["-ffree-form", "-Mbackslash"] elif spec.satisfies("%pgi") or spec.satisfies("%nvhpc"): fcflags += ["-Mfreeform", "-Mextend"] @@ -556,16 +573,7 @@ def edit(self, pkg, spec, prefix): ) ) else: - libs.append( - join_path( - elpa.libs.directories[0], - ( - "libelpa{elpa_suffix}.{dso_suffix}".format( - elpa_suffix=elpa_suffix, dso_suffix=dso_suffix - ) - ), - ) - ) + libs.append(elpa.libs.ld_flags) if spec.satisfies("@:4"): if elpa.satisfies("@:2014.5"): @@ -598,14 +606,14 @@ def edit(self, pkg, spec, prefix): cppflags += ["-D__LIBVORI"] libvori = spec["libvori"].libs ldflags += [libvori.search_flags] - libs += libvori + libs.append(libvori.ld_flags) libs += ["-lstdc++"] if spec.satisfies("+spglib"): cppflags += ["-D__SPGLIB"] spglib = spec["spglib"].libs ldflags += [spglib.search_flags] - libs += spglib + libs.append(spglib.ld_flags) cc = spack_cc if "~mpi" in spec else spec["mpi"].mpicc cxx = spack_cxx if "~mpi" in spec else spec["mpi"].mpicxx @@ -723,18 +731,20 @@ def edit(self, pkg, spec, prefix): if spec.satisfies("@2022: +rocm"): libs += [ - "-L{}".format(spec["rocm"].libs.directories[0]), - "-L{}/stubs".format(spec["rocm"].libs.directories[0]), + "-L{}".format(spec["hip"].prefix.lib), + "-lamdhip64", "-lhipblas", "-lhipfft", "-lstdc++", ] - cppflags += ["-D__OFFLOAD_HIP"] acc_compiler_var = "hipcc" acc_flags_var = "NVFLAGS" cppflags += ["-D__ACC"] cppflags += ["-D__DBCSR_ACC"] + cppflags += ["-D__HIP_PLATFORM_AMD__"] + cppflags += ["-D__GRID_HIP"] + gpuver = GPU_MAP[spec.variants["amdgpu_target"].value[0]] if spec.satisfies("smm=libsmm"): @@ -812,6 +822,9 @@ def fflags(var, lst): mkf.write(fflags("CXXFLAGS", cxxflags)) if spec.satisfies("+cuda"): mkf.write(fflags(acc_flags_var, nvflags)) + if "+rocm" in spec: + mkf.write("OFFLOAD_TARGET = hip\n") + mkf.write(fflags("FCFLAGS", fcflags)) mkf.write(fflags("LDFLAGS", ldflags)) mkf.write(fflags("LIBS", libs)) @@ -918,7 +931,7 @@ def fix_package_config(self): content += " " + self.spec["fftw-api"].libs.ld_flags fftw = self.spec["fftw-api"] - if fftw.name in ["fftw", "amdfftw"] and fftw.satisfies("+openmp"): + if fftw.name in ["fftw", "amdfftw", "cray-fftw"] and fftw.satisfies("+openmp"): content += " -lfftw3_omp" content += "\n"