From d91c46737915ec8eddf178f923fa5d28f572c9c0 Mon Sep 17 00:00:00 2001 From: Gavin Zhao Date: Sun, 7 Jan 2024 12:14:23 -0500 Subject: [PATCH] ROCm: use native CMake HIP support CMake has become the recommended way to add HIP code into a project (see [here](https://rocm.docs.amd.com/en/docs-6.0.0/conceptual/cmake-packages.html#using-hip-in-cmake)). Most importantly, this separation of HIP compiler and the C/C++ compiler also allows user to choose a different compiler if desired, compared to the current situation where everything must be built with ROCm's clang. Makefile is unchanged. Signed-off-by: Gavin Zhao --- .devops/nix/package.nix | 5 ++--- CMakeLists.txt | 18 +++++++++--------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/.devops/nix/package.nix b/.devops/nix/package.nix index 43bdbd755..10c359bab 100644 --- a/.devops/nix/package.nix +++ b/.devops/nix/package.nix @@ -179,14 +179,13 @@ effectiveStdenv.mkDerivation ( ) ] ++ optionals useRocm [ - (cmakeFeature "CMAKE_C_COMPILER" "hipcc") - (cmakeFeature "CMAKE_CXX_COMPILER" "hipcc") + (cmakeFeature "CMAKE_HIP_COMPILER" "${rocmPackages.llvm.clang}/bin/clang") # Build all targets supported by rocBLAS. When updating search for TARGET_LIST_ROCM # in https://github.com/ROCmSoftwarePlatform/rocBLAS/blob/develop/CMakeLists.txt # and select the line that matches the current nixpkgs version of rocBLAS. # Should likely use `rocmPackages.clr.gpuTargets`. - "-DAMDGPU_TARGETS=gfx803;gfx900;gfx906:xnack-;gfx908:xnack-;gfx90a:xnack+;gfx90a:xnack-;gfx940;gfx941;gfx942;gfx1010;gfx1012;gfx1030;gfx1100;gfx1101;gfx1102" + (cmakeFeature "CMAKE_HIP_ARCHITECTURES" "gfx803;gfx900;gfx906:xnack-;gfx908:xnack-;gfx90a:xnack+;gfx90a:xnack-;gfx940;gfx941;gfx942;gfx1010;gfx1012;gfx1030;gfx1100;gfx1101;gfx1102") ] ++ optionals useMetalKit [ (lib.cmakeFeature "CMAKE_C_FLAGS" "-D__ARM_FEATURE_DOTPROD=1") ] ++ optionals useBlas [ (lib.cmakeFeature "LLAMA_BLAS_VENDOR" "OpenBLAS") ]; diff --git a/CMakeLists.txt b/CMakeLists.txt index 668669c6d..61ed13ac6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -398,15 +398,15 @@ if (LLAMA_CLBLAST) endif() if (LLAMA_HIPBLAS) - list(APPEND CMAKE_PREFIX_PATH /opt/rocm) - - if (NOT ${CMAKE_C_COMPILER_ID} MATCHES "Clang") - message(WARNING "Only LLVM is supported for HIP, hint: CC=/opt/rocm/llvm/bin/clang") - endif() - if (NOT ${CMAKE_CXX_COMPILER_ID} MATCHES "Clang") - message(WARNING "Only LLVM is supported for HIP, hint: CXX=/opt/rocm/llvm/bin/clang++") + if ($ENV{ROCM_PATH}) + set(ROCM_PATH $ENV{ROCM_PATH}) + else() + set(ROCM_PATH /opt/rocm) endif() + list(APPEND CMAKE_PREFIX_PATH ${ROCM_PATH}) + + enable_language(HIP) find_package(hip) find_package(hipblas) find_package(rocblas) @@ -430,8 +430,8 @@ if (LLAMA_HIPBLAS) target_compile_definitions(ggml-rocm PRIVATE GGML_CUDA_DMMV_X=${LLAMA_CUDA_DMMV_X}) target_compile_definitions(ggml-rocm PRIVATE GGML_CUDA_MMV_Y=${LLAMA_CUDA_MMV_Y}) target_compile_definitions(ggml-rocm PRIVATE K_QUANTS_PER_ITERATION=${LLAMA_CUDA_KQUANTS_ITER}) - set_source_files_properties(ggml-cuda.cu PROPERTIES LANGUAGE CXX) - target_link_libraries(ggml-rocm PRIVATE hip::device PUBLIC hip::host roc::rocblas roc::hipblas) + set_source_files_properties(ggml-cuda.cu PROPERTIES LANGUAGE HIP) + target_link_libraries(ggml-rocm PUBLIC hip::host roc::rocblas roc::hipblas) if (LLAMA_STATIC) message(FATAL_ERROR "Static linking not supported for HIP/ROCm")