Sparkleholic commited on
Commit
ad8f031
·
1 Parent(s): 131a21e

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

ggml/CMakeLists.txt CHANGED
@@ -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})
ggml/src/ggml-vulkan/CMakeLists.txt CHANGED
@@ -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
- add_subdirectory(vulkan-shaders)
77
-
78
- set (_ggml_vk_genshaders_cmd vulkan-shaders-gen)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 (NOT CMAKE_CROSSCOMPILING)
87
- set(_ggml_vk_genshaders_cmd "$<TARGET_FILE_DIR:vulkan-shaders-gen>/${_ggml_vk_genshaders_cmd}")
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} ${_ggml_vk_genshaders_cmd}
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
 
ggml/src/ggml-vulkan/cmake/host-toolchain.cmake.in ADDED
@@ -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()
ggml/src/ggml-vulkan/vulkan-shaders/CMakeLists.txt CHANGED
@@ -1,9 +1,11 @@
1
  find_package (Threads REQUIRED)
2
- find_package(Vulkan COMPONENTS glslc REQUIRED)
 
 
 
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)
 
ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp CHANGED
@@ -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;