From 1eac779fbe2ca1ac1268a4d3bf2ae2f394c753eb Mon Sep 17 00:00:00 2001 From: Junil Kim Date: Fri, 22 Nov 2024 11:37:14 +0900 Subject: [PATCH 1/3] fix: ggml: fix vulkan-shaders-gen build The vulkan-shaders-gen target was not being built correctly in case of cross-compilation. Other outputs need to be built for the cross compile target, but vulkan-shaders-gen needs to be built for the host. --- ggml/src/ggml-vulkan/CMakeLists.txt | 36 +++++++++++++++++-- .../ggml-vulkan/vulkan-shaders/CMakeLists.txt | 6 +++- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/ggml/src/ggml-vulkan/CMakeLists.txt b/ggml/src/ggml-vulkan/CMakeLists.txt index 6d46e5f24..e81a79a2a 100644 --- a/ggml/src/ggml-vulkan/CMakeLists.txt +++ b/ggml/src/ggml-vulkan/CMakeLists.txt @@ -1,3 +1,6 @@ +cmake_minimum_required(VERSION 3.19) +cmake_policy(SET CMP0114 NEW) + find_package(Vulkan COMPONENTS glslc REQUIRED) if (Vulkan_FOUND) @@ -59,9 +62,32 @@ if (Vulkan_FOUND) add_compile_definitions(GGML_VULKAN_RUN_TESTS) endif() - add_subdirectory(vulkan-shaders) - - set (_ggml_vk_genshaders_cmd vulkan-shaders-gen) + if (NOT CMAKE_CROSSCOMPILING) + add_subdirectory(vulkan-shaders) + else() + include(ExternalProject) + # Native build through ExternalProject_Add + ExternalProject_Add( + vulkan-shaders-gen + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders + CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release + -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR} + -DCMAKE_TOOLCHAIN_FILE= + -DCMAKE_SYSROOT= + -DCMAKE_C_FLAGS=-O2 + -DCMAKE_CXX_FLAGS=-O2 + -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER + -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=NEVER + -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=NEVER + -DCMAKE_C_COMPILER=gcc + -DCMAKE_CXX_COMPILER=g++ + BUILD_COMMAND ${CMAKE_COMMAND} --build . + INSTALL_COMMAND ${CMAKE_COMMAND} --install . + INSTALL_DIR ${CMAKE_BINARY_DIR} + ) + ExternalProject_Add_StepTargets(vulkan-shaders-gen build install) + endif() + set (_ggml_vk_genshaders_cmd ${CMAKE_BINARY_DIR}/bin/vulkan-shaders-gen) set (_ggml_vk_header ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.hpp) set (_ggml_vk_source ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.cpp) set (_ggml_vk_input_dir ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders) @@ -69,6 +95,10 @@ if (Vulkan_FOUND) file(GLOB _ggml_vk_shader_deps "${_ggml_vk_input_dir}/*.comp") + if (CMAKE_CROSSCOMPILING) + set(_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen-build vulkan-shaders-gen-install) + endif() + add_custom_command( OUTPUT ${_ggml_vk_header} ${_ggml_vk_source} diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/CMakeLists.txt b/ggml/src/ggml-vulkan/vulkan-shaders/CMakeLists.txt index bd0c74cb1..8f496d6c6 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/CMakeLists.txt +++ b/ggml/src/ggml-vulkan/vulkan-shaders/CMakeLists.txt @@ -3,7 +3,11 @@ find_package(Vulkan COMPONENTS glslc REQUIRED) set(TARGET vulkan-shaders-gen) add_executable(${TARGET} vulkan-shaders-gen.cpp) -install(TARGETS ${TARGET} RUNTIME) +if (${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + install(TARGETS ${TARGET} RUNTIME) +else() + install(TARGETS ${TARGET} RUNTIME DESTINATION bin) +endif() target_compile_features(${TARGET} PRIVATE cxx_std_17) target_link_libraries(vulkan-shaders-gen PUBLIC Threads::Threads) target_link_libraries(vulkan-shaders-gen PRIVATE Vulkan::Vulkan) From 602295bb6d12589925fe7fe46ba135365a44b457 Mon Sep 17 00:00:00 2001 From: Junil Kim Date: Thu, 28 Nov 2024 12:40:04 +0900 Subject: [PATCH 2/3] refactor: ggml: Improve vulkan-shaders-gen toolchain setup - Add GGML_SHADERS_GEN_TOOLCHAIN CMake option. - Auto-detect host toolchain if not set. --- ggml/CMakeLists.txt | 3 ++ ggml/src/ggml-vulkan/CMakeLists.txt | 67 ++++++++++++++++++++++++----- 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/ggml/CMakeLists.txt b/ggml/CMakeLists.txt index e33d97482..e270735ec 100644 --- a/ggml/CMakeLists.txt +++ b/ggml/CMakeLists.txt @@ -185,6 +185,9 @@ option(GGML_OPENCL_PROFILING "ggml: use OpenCL profiling (increas option(GGML_OPENCL_EMBED_KERNELS "ggml: embed kernels" ON) option(GGML_OPENCL_USE_ADRENO_KERNELS "ggml: use optimized kernels for Adreno" ON) +# toolchain for vulkan-shaders-gen +set (GGML_SHADERS_GEN_TOOLCHAIN "" CACHE FILEPATH "ggml: toolchain file for vulkan-shaders-gen") + # extra artifacts option(GGML_BUILD_TESTS "ggml: build tests" ${GGML_STANDALONE}) option(GGML_BUILD_EXAMPLES "ggml: build examples" ${GGML_STANDALONE}) diff --git a/ggml/src/ggml-vulkan/CMakeLists.txt b/ggml/src/ggml-vulkan/CMakeLists.txt index e81a79a2a..f2e986c12 100644 --- a/ggml/src/ggml-vulkan/CMakeLists.txt +++ b/ggml/src/ggml-vulkan/CMakeLists.txt @@ -3,6 +3,39 @@ cmake_policy(SET CMP0114 NEW) find_package(Vulkan COMPONENTS glslc REQUIRED) +function(detect_host_compiler) + if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") + find_program(MSVC_COMPILER cl) + find_program(GNU_C_COMPILER gcc) + find_program(GNU_CXX_COMPILER g++) + if (MSVC_COMPILER) + set(HOST_C_COMPILER "${MSVC_COMPILER}" PARENT_SCOPE) + set(HOST_CXX_COMPILER "${MSVC_COMPILER}" PARENT_SCOPE) + elseif (CLANG_C_COMPILER AND CLANG_CXX_COMPILER) + set(HOST_C_COMPILER "${CLANG_C_COMPILER}" PARENT_SCOPE) + set(HOST_CXX_COMPILER "${CLANG_CXX_COMPILER}" PARENT_SCOPE) + else() + message(WARNING "Neither MSVC nor clang found") + endif() + elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux") + find_program(CLANG_C_COMPILER clang) + find_program(CLANG_CXX_COMPILER clang++) + find_program(GNU_C_COMPILER gcc) + find_program(GNU_CXX_COMPILER g++) + if (GNU_C_COMPILER AND GNU_CXX_COMPILER) + set(HOST_C_COMPILER "${GNU_C_COMPILER}" PARENT_SCOPE) + set(HOST_CXX_COMPILER "${GNU_CXX_COMPILER}" PARENT_SCOPE) + elseif (CLANG_C_COMPILER AND CLANG_CXX_COMPILER) + set(HOST_C_COMPILER "${CLANG_C_COMPILER}" PARENT_SCOPE) + set(HOST_CXX_COMPILER "${CLANG_CXX_COMPILER}" PARENT_SCOPE) + else() + message(WARNING "Neither clang nor gcc found") + endif() + else() + message(WARNING "Unsupported host system: ${CMAKE_HOST_SYSTEM_NAME}") + endif() +endfunction() + if (Vulkan_FOUND) message(STATUS "Vulkan found") @@ -65,22 +98,36 @@ if (Vulkan_FOUND) if (NOT CMAKE_CROSSCOMPILING) add_subdirectory(vulkan-shaders) else() + if (GGML_SHADERS_GEN_TOOLCHAIN) + set(HOST_CMAKE_TOOLCHAIN_FILE ${GGML_SHADERS_GEN_TOOLCHAIN}) + else() + detect_host_compiler() + if (NOT HOST_C_COMPILER OR NOT HOST_CXX_COMPILER) + message(FATAL_ERROR "Host compiler not found") + else() + message(STATUS "Host compiler: ${HOST_C_COMPILER} ${HOST_CXX_COMPILER}") + endif() + file(WRITE ${CMAKE_BINARY_DIR}/host_toolchain.cmake + "set(CMAKE_BUILD_TYPE Release)\n" + "set(CMAKE_C_FLAGS -O2)\n" + "set(CMAKE_CXX_FLAGS -O2)\n" + "set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n" + "set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)\n" + "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)\n" + "set(CMAKE_C_COMPILER ${HOST_C_COMPILER})\n" + "set(CMAKE_CXX_COMPILER ${HOST_CXX_COMPILER})\n" + ) + set(HOST_CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR}/host_toolchain.cmake) + endif() + message(STATUS "vulkan-shaders-gen toolchain file: ${HOST_CMAKE_TOOLCHAIN_FILE}") + include(ExternalProject) # Native build through ExternalProject_Add ExternalProject_Add( vulkan-shaders-gen SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders - CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release + CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${HOST_CMAKE_TOOLCHAIN_FILE} -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR} - -DCMAKE_TOOLCHAIN_FILE= - -DCMAKE_SYSROOT= - -DCMAKE_C_FLAGS=-O2 - -DCMAKE_CXX_FLAGS=-O2 - -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER - -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=NEVER - -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=NEVER - -DCMAKE_C_COMPILER=gcc - -DCMAKE_CXX_COMPILER=g++ BUILD_COMMAND ${CMAKE_COMMAND} --build . INSTALL_COMMAND ${CMAKE_COMMAND} --install . INSTALL_DIR ${CMAKE_BINARY_DIR} From 7c1a6853e59db5c41ab943d3f41019eef837e966 Mon Sep 17 00:00:00 2001 From: Junil Kim Date: Tue, 24 Dec 2024 12:52:04 +0900 Subject: [PATCH 3/3] refactor: ggml: Improve vulkan-shaders-gen toolchain setup Use configure_file to generate host_toolchain.cmake from template --- ggml/src/ggml-vulkan/CMakeLists.txt | 15 ++------------- ggml/src/ggml-vulkan/host_toolchain.cmake.in | 8 ++++++++ 2 files changed, 10 insertions(+), 13 deletions(-) create mode 100644 ggml/src/ggml-vulkan/host_toolchain.cmake.in diff --git a/ggml/src/ggml-vulkan/CMakeLists.txt b/ggml/src/ggml-vulkan/CMakeLists.txt index f2e986c12..1f1e5d6ea 100644 --- a/ggml/src/ggml-vulkan/CMakeLists.txt +++ b/ggml/src/ggml-vulkan/CMakeLists.txt @@ -17,7 +17,7 @@ function(detect_host_compiler) else() message(WARNING "Neither MSVC nor clang found") endif() - elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux") + else() find_program(CLANG_C_COMPILER clang) find_program(CLANG_CXX_COMPILER clang++) find_program(GNU_C_COMPILER gcc) @@ -31,8 +31,6 @@ function(detect_host_compiler) else() message(WARNING "Neither clang nor gcc found") endif() - else() - message(WARNING "Unsupported host system: ${CMAKE_HOST_SYSTEM_NAME}") endif() endfunction() @@ -107,16 +105,7 @@ if (Vulkan_FOUND) else() message(STATUS "Host compiler: ${HOST_C_COMPILER} ${HOST_CXX_COMPILER}") endif() - file(WRITE ${CMAKE_BINARY_DIR}/host_toolchain.cmake - "set(CMAKE_BUILD_TYPE Release)\n" - "set(CMAKE_C_FLAGS -O2)\n" - "set(CMAKE_CXX_FLAGS -O2)\n" - "set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n" - "set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)\n" - "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)\n" - "set(CMAKE_C_COMPILER ${HOST_C_COMPILER})\n" - "set(CMAKE_CXX_COMPILER ${HOST_CXX_COMPILER})\n" - ) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/host_toolchain.cmake.in ${CMAKE_BINARY_DIR}/host_toolchain.cmake @ONLY) set(HOST_CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR}/host_toolchain.cmake) endif() message(STATUS "vulkan-shaders-gen toolchain file: ${HOST_CMAKE_TOOLCHAIN_FILE}") diff --git a/ggml/src/ggml-vulkan/host_toolchain.cmake.in b/ggml/src/ggml-vulkan/host_toolchain.cmake.in new file mode 100644 index 000000000..f4d7480e0 --- /dev/null +++ b/ggml/src/ggml-vulkan/host_toolchain.cmake.in @@ -0,0 +1,8 @@ +set(CMAKE_BUILD_TYPE Release) +set(CMAKE_C_FLAGS -O2) +set(CMAKE_CXX_FLAGS -O2) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) +set(CMAKE_C_COMPILER @HOST_C_COMPILER@) +set(CMAKE_CXX_COMPILER @HOST_CXX_COMPILER@)