Spaces:
Running
fix: ggml: fix vulkan-shaders-gen build (llama/10448)
Browse files* 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.
* refactor: ggml: Improve vulkan-shaders-gen toolchain setup
- Add GGML_SHADERS_GEN_TOOLCHAIN CMake option.
- Auto-detect host toolchain if not set.
* refactor: ggml: Improve vulkan-shaders-gen toolchain setup
Use configure_file to generate host_toolchain.cmake from template
* fix: ggml: Fix compile error
Fix compile error not finding vulkan-shaders-gen
* fix: vulkan-shaders-gen build and path handling
Fix build issues with vulkan-shaders-gen:
- Add target dependency for correct build order
- Use CMAKE_HOST_SYSTEM_NAME for executable suffix
- Fix MSVC output directory in host toolchain
- Normalize path handling for cross-compilation
* fix: improve host compiler detection in vulkan shader build
Improve host compiler detection for vulkan shader generation:
- Add NO_CMAKE_FIND_ROOT_PATH to all compiler searches
- Consolidate compiler detection logic
- Fix Windows-specific MSVC detection
- Ensure correct compiler search in cross-compilation
* refactor: Simplify CMake function for detecting host compiler
Simplified the CMake function to improve the process of detecting the host compiler.
* fix: Remove unnecessary Vulkan library linkage in CMakeLists.txt
Since `vulkan-shader-gen.cpp` only requires the `glslc` executable
and not the Vulkan headers or libraries, CMakeLists.txt needs to
be corrected.
(See: ecc93d0558fc3ecb8a5af69d2ece02fae4710ade)
* refactor: Rename host_toolchain.cmake.in
- Rename host_toolchain.cmake.in to cmake/host-toolchain.cmake.in
* refactor: GGML_VULKAN_SHADERS_GEN_TOOLCHAIN
Rename the macro GGML_SHADERS_GEN_TOOLCHAIN to GGML_VULKAN_SHADERS_GEN_TOOLCHAIN
|
@@ -185,6 +185,9 @@ option(GGML_OPENCL_PROFILING "ggml: use OpenCL profiling (increas
|
|
| 185 |
option(GGML_OPENCL_EMBED_KERNELS "ggml: embed kernels" ON)
|
| 186 |
option(GGML_OPENCL_USE_ADRENO_KERNELS "ggml: use optimized kernels for Adreno" ON)
|
| 187 |
|
|
|
|
|
|
|
|
|
|
| 188 |
# extra artifacts
|
| 189 |
option(GGML_BUILD_TESTS "ggml: build tests" ${GGML_STANDALONE})
|
| 190 |
option(GGML_BUILD_EXAMPLES "ggml: build examples" ${GGML_STANDALONE})
|
|
|
|
| 185 |
option(GGML_OPENCL_EMBED_KERNELS "ggml: embed kernels" ON)
|
| 186 |
option(GGML_OPENCL_USE_ADRENO_KERNELS "ggml: use optimized kernels for Adreno" ON)
|
| 187 |
|
| 188 |
+
# toolchain for vulkan-shaders-gen
|
| 189 |
+
set (GGML_VULKAN_SHADERS_GEN_TOOLCHAIN "" CACHE FILEPATH "ggml: toolchain file for vulkan-shaders-gen")
|
| 190 |
+
|
| 191 |
# extra artifacts
|
| 192 |
option(GGML_BUILD_TESTS "ggml: build tests" ${GGML_STANDALONE})
|
| 193 |
option(GGML_BUILD_EXAMPLES "ggml: build examples" ${GGML_STANDALONE})
|
|
@@ -1,5 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
find_package(Vulkan COMPONENTS glslc REQUIRED)
|
| 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
if (Vulkan_FOUND)
|
| 4 |
message(STATUS "Vulkan found")
|
| 5 |
|
|
@@ -73,19 +88,56 @@ if (Vulkan_FOUND)
|
|
| 73 |
add_compile_definitions(GGML_VULKAN_RUN_TESTS)
|
| 74 |
endif()
|
| 75 |
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
set (_ggml_vk_header ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.hpp)
|
| 80 |
set (_ggml_vk_source ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.cpp)
|
| 81 |
set (_ggml_vk_input_dir ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders)
|
| 82 |
set (_ggml_vk_output_dir ${CMAKE_CURRENT_BINARY_DIR}/vulkan-shaders.spv)
|
| 83 |
|
| 84 |
file(GLOB _ggml_vk_shader_deps "${_ggml_vk_input_dir}/*.comp")
|
|
|
|
| 85 |
|
| 86 |
-
if (
|
| 87 |
-
set(
|
| 88 |
-
endif
|
| 89 |
|
| 90 |
add_custom_command(
|
| 91 |
OUTPUT ${_ggml_vk_header}
|
|
@@ -99,7 +151,7 @@ if (Vulkan_FOUND)
|
|
| 99 |
--target-cpp ${_ggml_vk_source}
|
| 100 |
--no-clean
|
| 101 |
|
| 102 |
-
DEPENDS ${_ggml_vk_shader_deps}
|
| 103 |
COMMENT "Generate vulkan shaders"
|
| 104 |
)
|
| 105 |
|
|
|
|
| 1 |
+
cmake_minimum_required(VERSION 3.19)
|
| 2 |
+
cmake_policy(SET CMP0114 NEW)
|
| 3 |
+
|
| 4 |
find_package(Vulkan COMPONENTS glslc REQUIRED)
|
| 5 |
|
| 6 |
+
function(detect_host_compiler)
|
| 7 |
+
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
|
| 8 |
+
find_program(HOST_C_COMPILER NAMES cl gcc clang NO_CMAKE_FIND_ROOT_PATH)
|
| 9 |
+
find_program(HOST_CXX_COMPILER NAMES cl g++ clang++ NO_CMAKE_FIND_ROOT_PATH)
|
| 10 |
+
else()
|
| 11 |
+
find_program(HOST_C_COMPILER NAMES gcc clang NO_CMAKE_FIND_ROOT_PATH)
|
| 12 |
+
find_program(HOST_CXX_COMPILER NAMES g++ clang++ NO_CMAKE_FIND_ROOT_PATH)
|
| 13 |
+
endif()
|
| 14 |
+
set(HOST_C_COMPILER "${HOST_C_COMPILER}" PARENT_SCOPE)
|
| 15 |
+
set(HOST_CXX_COMPILER "${HOST_CXX_COMPILER}" PARENT_SCOPE)
|
| 16 |
+
endfunction()
|
| 17 |
+
|
| 18 |
if (Vulkan_FOUND)
|
| 19 |
message(STATUS "Vulkan found")
|
| 20 |
|
|
|
|
| 88 |
add_compile_definitions(GGML_VULKAN_RUN_TESTS)
|
| 89 |
endif()
|
| 90 |
|
| 91 |
+
if (NOT CMAKE_CROSSCOMPILING)
|
| 92 |
+
add_subdirectory(vulkan-shaders)
|
| 93 |
+
if (MSVC)
|
| 94 |
+
foreach(CONFIG ${CMAKE_CONFIGURATION_TYPES})
|
| 95 |
+
string(TOUPPER ${CONFIG} CONFIG)
|
| 96 |
+
set_target_properties(vulkan-shaders-gen PROPERTIES
|
| 97 |
+
RUNTIME_OUTPUT_DIRECTORY_${CONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
|
| 98 |
+
endforeach()
|
| 99 |
+
endif()
|
| 100 |
+
else()
|
| 101 |
+
if (GGML_VULKAN_SHADERS_GEN_TOOLCHAIN)
|
| 102 |
+
set(HOST_CMAKE_TOOLCHAIN_FILE ${GGML_VULKAN_SHADERS_GEN_TOOLCHAIN})
|
| 103 |
+
else()
|
| 104 |
+
detect_host_compiler()
|
| 105 |
+
if (NOT HOST_C_COMPILER OR NOT HOST_CXX_COMPILER)
|
| 106 |
+
message(FATAL_ERROR "Host compiler not found")
|
| 107 |
+
else()
|
| 108 |
+
message(STATUS "Host compiler: ${HOST_C_COMPILER} ${HOST_CXX_COMPILER}")
|
| 109 |
+
endif()
|
| 110 |
+
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/host-toolchain.cmake.in ${CMAKE_BINARY_DIR}/host-toolchain.cmake @ONLY)
|
| 111 |
+
set(HOST_CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR}/host-toolchain.cmake)
|
| 112 |
+
endif()
|
| 113 |
+
message(STATUS "vulkan-shaders-gen toolchain file: ${HOST_CMAKE_TOOLCHAIN_FILE}")
|
| 114 |
+
|
| 115 |
+
include(ExternalProject)
|
| 116 |
+
# Native build through ExternalProject_Add
|
| 117 |
+
ExternalProject_Add(
|
| 118 |
+
vulkan-shaders-gen
|
| 119 |
+
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders
|
| 120 |
+
CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${HOST_CMAKE_TOOLCHAIN_FILE}
|
| 121 |
+
-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}
|
| 122 |
+
BUILD_COMMAND ${CMAKE_COMMAND} --build .
|
| 123 |
+
INSTALL_COMMAND ${CMAKE_COMMAND} --install .
|
| 124 |
+
INSTALL_DIR ${CMAKE_BINARY_DIR}
|
| 125 |
+
)
|
| 126 |
+
ExternalProject_Add_StepTargets(vulkan-shaders-gen build install)
|
| 127 |
+
endif()
|
| 128 |
+
set (_ggml_vk_host_suffix $<IF:$<STREQUAL:${CMAKE_HOST_SYSTEM_NAME},Windows>,.exe,>)
|
| 129 |
+
set (_ggml_vk_genshaders_cmd ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/vulkan-shaders-gen${_ggml_vk_host_suffix})
|
| 130 |
set (_ggml_vk_header ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.hpp)
|
| 131 |
set (_ggml_vk_source ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.cpp)
|
| 132 |
set (_ggml_vk_input_dir ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders)
|
| 133 |
set (_ggml_vk_output_dir ${CMAKE_CURRENT_BINARY_DIR}/vulkan-shaders.spv)
|
| 134 |
|
| 135 |
file(GLOB _ggml_vk_shader_deps "${_ggml_vk_input_dir}/*.comp")
|
| 136 |
+
set (_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen)
|
| 137 |
|
| 138 |
+
if (CMAKE_CROSSCOMPILING)
|
| 139 |
+
set(_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen-build vulkan-shaders-gen-install)
|
| 140 |
+
endif()
|
| 141 |
|
| 142 |
add_custom_command(
|
| 143 |
OUTPUT ${_ggml_vk_header}
|
|
|
|
| 151 |
--target-cpp ${_ggml_vk_source}
|
| 152 |
--no-clean
|
| 153 |
|
| 154 |
+
DEPENDS ${_ggml_vk_shader_deps}
|
| 155 |
COMMENT "Generate vulkan shaders"
|
| 156 |
)
|
| 157 |
|
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
set(CMAKE_BUILD_TYPE Release)
|
| 2 |
+
set(CMAKE_C_FLAGS -O2)
|
| 3 |
+
set(CMAKE_CXX_FLAGS -O2)
|
| 4 |
+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
| 5 |
+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
|
| 6 |
+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
|
| 7 |
+
set(CMAKE_C_COMPILER @HOST_C_COMPILER@)
|
| 8 |
+
set(CMAKE_CXX_COMPILER @HOST_CXX_COMPILER@)
|
| 9 |
+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY @CMAKE_RUNTIME_OUTPUT_DIRECTORY@)
|
| 10 |
+
|
| 11 |
+
if("@CMAKE_C_COMPILER_ID@" STREQUAL "MSVC")
|
| 12 |
+
foreach(CONFIG IN ITEMS DEBUG RELEASE MINSIZEREL RELWITHDEBINFO)
|
| 13 |
+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
|
| 14 |
+
endforeach()
|
| 15 |
+
endif()
|
|
@@ -1,9 +1,11 @@
|
|
| 1 |
find_package (Threads REQUIRED)
|
| 2 |
-
|
|
|
|
|
|
|
|
|
|
| 3 |
|
| 4 |
set(TARGET vulkan-shaders-gen)
|
| 5 |
add_executable(${TARGET} vulkan-shaders-gen.cpp)
|
| 6 |
install(TARGETS ${TARGET} RUNTIME)
|
| 7 |
target_compile_features(${TARGET} PRIVATE cxx_std_17)
|
| 8 |
target_link_libraries(vulkan-shaders-gen PUBLIC Threads::Threads)
|
| 9 |
-
target_link_libraries(vulkan-shaders-gen PRIVATE Vulkan::Vulkan)
|
|
|
|
| 1 |
find_package (Threads REQUIRED)
|
| 2 |
+
find_program(GLSLC_EXECUTABLE glslc)
|
| 3 |
+
if(NOT GLSLC_EXECUTABLE)
|
| 4 |
+
message(FATAL_ERROR "glslc not found.")
|
| 5 |
+
endif()
|
| 6 |
|
| 7 |
set(TARGET vulkan-shaders-gen)
|
| 8 |
add_executable(${TARGET} vulkan-shaders-gen.cpp)
|
| 9 |
install(TARGETS ${TARGET} RUNTIME)
|
| 10 |
target_compile_features(${TARGET} PRIVATE cxx_std_17)
|
| 11 |
target_link_libraries(vulkan-shaders-gen PUBLIC Threads::Threads)
|
|
|
|
@@ -30,8 +30,6 @@
|
|
| 30 |
#include <fcntl.h>
|
| 31 |
#endif
|
| 32 |
|
| 33 |
-
#include <vulkan/vulkan_core.h>
|
| 34 |
-
|
| 35 |
#define ASYNCIO_CONCURRENCY 64
|
| 36 |
|
| 37 |
std::mutex lock;
|
|
|
|
| 30 |
#include <fcntl.h>
|
| 31 |
#endif
|
| 32 |
|
|
|
|
|
|
|
| 33 |
#define ASYNCIO_CONCURRENCY 64
|
| 34 |
|
| 35 |
std::mutex lock;
|