bandoti commited on
Commit
f8fd66d
·
1 Parent(s): 4d1bd4f

cmake: simplify vulkan shader test logic (llama/13263)

Browse files
ggml/src/ggml-vulkan/CMakeLists.txt CHANGED
@@ -15,6 +15,32 @@ function(detect_host_compiler)
15
  set(HOST_CXX_COMPILER "${HOST_CXX_COMPILER}" PARENT_SCOPE)
16
  endfunction()
17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  if (Vulkan_FOUND)
19
  message(STATUS "Vulkan found")
20
 
@@ -23,69 +49,35 @@ if (Vulkan_FOUND)
23
  ../../include/ggml-vulkan.h
24
  )
25
 
26
- # Compile a test shader to determine whether GL_KHR_cooperative_matrix is supported.
27
- # If it's not, there will be an error to stderr.
28
- # If it's supported, set a define to indicate that we should compile those shaders
29
- execute_process(COMMAND ${Vulkan_GLSLC_EXECUTABLE} -o - -fshader-stage=compute --target-env=vulkan1.3 "${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_coopmat_support.comp"
30
- OUTPUT_VARIABLE glslc_output
31
- ERROR_VARIABLE glslc_error)
32
-
33
- if (${glslc_error} MATCHES ".*extension not supported: GL_KHR_cooperative_matrix.*")
34
- message(STATUS "GL_KHR_cooperative_matrix not supported by glslc")
35
- set(GGML_VULKAN_COOPMAT_GLSLC_SUPPORT OFF)
36
- else()
37
- message(STATUS "GL_KHR_cooperative_matrix supported by glslc")
38
- set(GGML_VULKAN_COOPMAT_GLSLC_SUPPORT ON)
39
- add_compile_definitions(GGML_VULKAN_COOPMAT_GLSLC_SUPPORT)
40
- endif()
41
-
42
- # Compile a test shader to determine whether GL_NV_cooperative_matrix2 is supported.
43
- # If it's not, there will be an error to stderr.
44
- # If it's supported, set a define to indicate that we should compile those shaders
45
- execute_process(COMMAND ${Vulkan_GLSLC_EXECUTABLE} -o - -fshader-stage=compute --target-env=vulkan1.3 "${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_coopmat2_support.comp"
46
- OUTPUT_VARIABLE glslc_output
47
- ERROR_VARIABLE glslc_error)
48
-
49
- if (${glslc_error} MATCHES ".*extension not supported: GL_NV_cooperative_matrix2.*")
50
- message(STATUS "GL_NV_cooperative_matrix2 not supported by glslc")
51
- set(GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT OFF)
52
- else()
53
- message(STATUS "GL_NV_cooperative_matrix2 supported by glslc")
54
- set(GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT ON)
55
- add_compile_definitions(GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT)
56
- endif()
57
 
58
- # Compile a test shader to determine whether GL_EXT_integer_dot_product is supported.
59
- # If it's not, there will be an error to stderr.
60
- # If it's supported, set a define to indicate that we should compile those shaders
61
- execute_process(COMMAND ${Vulkan_GLSLC_EXECUTABLE} -o - -fshader-stage=compute --target-env=vulkan1.3 "${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_integer_dot_support.comp"
62
- OUTPUT_VARIABLE glslc_output
63
- ERROR_VARIABLE glslc_error)
64
 
65
- if (${glslc_error} MATCHES ".*extension not supported: GL_EXT_integer_dot_product.*")
66
- message(STATUS "GL_EXT_integer_dot_product not supported by glslc")
67
- set(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT OFF)
68
- else()
69
- message(STATUS "GL_EXT_integer_dot_product supported by glslc")
70
- set(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT ON)
71
- add_compile_definitions(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT)
72
- endif()
73
 
74
- # Compile a test shader to determine whether GL_EXT_bfloat16 is supported.
75
- # If it's not, there will be an error to stderr.
76
- # If it's supported, set a define to indicate that we should compile those shaders
77
- execute_process(COMMAND ${Vulkan_GLSLC_EXECUTABLE} -o - -fshader-stage=compute --target-env=vulkan1.3 "${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_bfloat16_support.comp"
78
- OUTPUT_VARIABLE glslc_output
79
- ERROR_VARIABLE glslc_error)
80
 
81
- if (${glslc_error} MATCHES ".*extension not supported: GL_EXT_bfloat16.*")
82
- message(STATUS "GL_EXT_bfloat16 not supported by glslc")
83
- set(GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT OFF)
84
- else()
85
- message(STATUS "GL_EXT_bfloat16 supported by glslc")
86
- set(GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT ON)
87
- add_compile_definitions(GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT)
88
- endif()
89
 
90
  target_link_libraries(ggml-vulkan PRIVATE Vulkan::Vulkan)
91
  target_include_directories(ggml-vulkan PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
@@ -124,16 +116,8 @@ if (Vulkan_FOUND)
124
  add_compile_definitions(GGML_VULKAN_RUN_TESTS)
125
  endif()
126
 
127
- if (NOT CMAKE_CROSSCOMPILING)
128
- add_subdirectory(vulkan-shaders)
129
- if (MSVC)
130
- foreach(CONFIG ${CMAKE_CONFIGURATION_TYPES})
131
- string(TOUPPER ${CONFIG} CONFIG)
132
- set_target_properties(vulkan-shaders-gen PROPERTIES
133
- RUNTIME_OUTPUT_DIRECTORY_${CONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
134
- endforeach()
135
- endif()
136
- else()
137
  if (GGML_VULKAN_SHADERS_GEN_TOOLCHAIN)
138
  set(HOST_CMAKE_TOOLCHAIN_FILE ${GGML_VULKAN_SHADERS_GEN_TOOLCHAIN})
139
  else()
@@ -146,25 +130,31 @@ if (Vulkan_FOUND)
146
  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/host-toolchain.cmake.in ${CMAKE_BINARY_DIR}/host-toolchain.cmake @ONLY)
147
  set(HOST_CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR}/host-toolchain.cmake)
148
  endif()
149
- message(STATUS "vulkan-shaders-gen toolchain file: ${HOST_CMAKE_TOOLCHAIN_FILE}")
 
 
 
 
 
 
150
 
151
- include(ExternalProject)
152
- # Native build through ExternalProject_Add
153
- ExternalProject_Add(
154
- vulkan-shaders-gen
155
- SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders
156
- CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${HOST_CMAKE_TOOLCHAIN_FILE}
157
- -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}
158
- -DGGML_VULKAN_COOPMAT_GLSLC_SUPPORT=${GGML_VULKAN_COOPMAT_GLSLC_SUPPORT}
159
- -DGGML_VULKAN_COOPMAT2_GLSLC_SUPPORT=${GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT}
160
- -DGGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT=${GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT}
161
- -DGGML_VULKAN_BFLOAT16_GLSLC_SUPPORT=${GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT}
162
- BUILD_COMMAND ${CMAKE_COMMAND} --build .
163
- INSTALL_COMMAND ${CMAKE_COMMAND} --install .
164
- INSTALL_DIR ${CMAKE_BINARY_DIR}
165
- )
166
- ExternalProject_Add_StepTargets(vulkan-shaders-gen build install)
167
  endif()
 
 
 
 
 
 
 
 
 
 
 
 
168
  set (_ggml_vk_host_suffix $<IF:$<STREQUAL:${CMAKE_HOST_SYSTEM_NAME},Windows>,.exe,>)
169
  set (_ggml_vk_genshaders_cmd ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/vulkan-shaders-gen${_ggml_vk_host_suffix})
170
  set (_ggml_vk_header ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.hpp)
@@ -175,9 +165,8 @@ if (Vulkan_FOUND)
175
  file(GLOB _ggml_vk_shader_deps "${_ggml_vk_input_dir}/*.comp")
176
  set (_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen)
177
 
178
- if (CMAKE_CROSSCOMPILING)
179
- set(_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen-build vulkan-shaders-gen-install)
180
- endif()
181
 
182
  add_custom_command(
183
  OUTPUT ${_ggml_vk_header}
 
15
  set(HOST_CXX_COMPILER "${HOST_CXX_COMPILER}" PARENT_SCOPE)
16
  endfunction()
17
 
18
+ # Function to test shader extension support
19
+ # Parameters:
20
+ # EXTENSION_NAME - Name of the extension to test (e.g., "GL_EXT_integer_dot_product")
21
+ # TEST_SHADER_FILE - Path to the test shader file
22
+ # RESULT_VARIABLE - Name of the variable to set (ON/OFF) based on test result
23
+ function(test_shader_extension_support EXTENSION_NAME TEST_SHADER_FILE RESULT_VARIABLE)
24
+ execute_process(
25
+ COMMAND ${Vulkan_GLSLC_EXECUTABLE} -o - -fshader-stage=compute --target-env=vulkan1.3 "${TEST_SHADER_FILE}"
26
+ OUTPUT_VARIABLE glslc_output
27
+ ERROR_VARIABLE glslc_error
28
+ )
29
+
30
+ if (${glslc_error} MATCHES ".*extension not supported: ${EXTENSION_NAME}.*")
31
+ message(STATUS "${EXTENSION_NAME} not supported by glslc")
32
+ set(${RESULT_VARIABLE} OFF PARENT_SCOPE)
33
+ else()
34
+ message(STATUS "${EXTENSION_NAME} supported by glslc")
35
+ set(${RESULT_VARIABLE} ON PARENT_SCOPE)
36
+ add_compile_definitions(${RESULT_VARIABLE})
37
+
38
+ # Ensure the extension support is forwarded to vulkan-shaders-gen
39
+ list(APPEND VULKAN_SHADER_GEN_CMAKE_ARGS -D${RESULT_VARIABLE}=ON)
40
+ set(VULKAN_SHADER_GEN_CMAKE_ARGS "${VULKAN_SHADER_GEN_CMAKE_ARGS}" PARENT_SCOPE)
41
+ endif()
42
+ endfunction()
43
+
44
  if (Vulkan_FOUND)
45
  message(STATUS "Vulkan found")
46
 
 
49
  ../../include/ggml-vulkan.h
50
  )
51
 
52
+ set(VULKAN_SHADER_GEN_CMAKE_ARGS
53
+ -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}
54
+ -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
55
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
 
57
+ # Test all shader extensions
58
+ test_shader_extension_support(
59
+ "GL_KHR_cooperative_matrix"
60
+ "${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_coopmat_support.comp"
61
+ "GGML_VULKAN_COOPMAT_GLSLC_SUPPORT"
62
+ )
63
 
64
+ test_shader_extension_support(
65
+ "GL_NV_cooperative_matrix2"
66
+ "${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_coopmat2_support.comp"
67
+ "GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT"
68
+ )
 
 
 
69
 
70
+ test_shader_extension_support(
71
+ "GL_EXT_integer_dot_product"
72
+ "${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_integer_dot_support.comp"
73
+ "GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT"
74
+ )
 
75
 
76
+ test_shader_extension_support(
77
+ "GL_EXT_bfloat16"
78
+ "${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_bfloat16_support.comp"
79
+ "GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT"
80
+ )
 
 
 
81
 
82
  target_link_libraries(ggml-vulkan PRIVATE Vulkan::Vulkan)
83
  target_include_directories(ggml-vulkan PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
 
116
  add_compile_definitions(GGML_VULKAN_RUN_TESTS)
117
  endif()
118
 
119
+ # Set up toolchain for host compilation whether cross-compiling or not
120
+ if (CMAKE_CROSSCOMPILING)
 
 
 
 
 
 
 
 
121
  if (GGML_VULKAN_SHADERS_GEN_TOOLCHAIN)
122
  set(HOST_CMAKE_TOOLCHAIN_FILE ${GGML_VULKAN_SHADERS_GEN_TOOLCHAIN})
123
  else()
 
130
  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/host-toolchain.cmake.in ${CMAKE_BINARY_DIR}/host-toolchain.cmake @ONLY)
131
  set(HOST_CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR}/host-toolchain.cmake)
132
  endif()
133
+ else()
134
+ # For non-cross-compiling, use empty toolchain (use host compiler)
135
+ set(HOST_CMAKE_TOOLCHAIN_FILE "")
136
+ endif()
137
+
138
+ # Always use ExternalProject_Add approach
139
+ include(ExternalProject)
140
 
141
+ # Add toolchain file if cross-compiling
142
+ if (CMAKE_CROSSCOMPILING)
143
+ list(APPEND VULKAN_SHADER_GEN_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${HOST_CMAKE_TOOLCHAIN_FILE})
144
+ message(STATUS "vulkan-shaders-gen toolchain file: ${HOST_CMAKE_TOOLCHAIN_FILE}")
 
 
 
 
 
 
 
 
 
 
 
 
145
  endif()
146
+
147
+ # Native build through ExternalProject_Add
148
+ ExternalProject_Add(
149
+ vulkan-shaders-gen
150
+ SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders
151
+ CMAKE_ARGS ${VULKAN_SHADER_GEN_CMAKE_ARGS}
152
+ BUILD_COMMAND ${CMAKE_COMMAND} --build .
153
+ INSTALL_COMMAND ${CMAKE_COMMAND} --install .
154
+ INSTALL_DIR ${CMAKE_BINARY_DIR}
155
+ )
156
+ ExternalProject_Add_StepTargets(vulkan-shaders-gen build install)
157
+
158
  set (_ggml_vk_host_suffix $<IF:$<STREQUAL:${CMAKE_HOST_SYSTEM_NAME},Windows>,.exe,>)
159
  set (_ggml_vk_genshaders_cmd ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/vulkan-shaders-gen${_ggml_vk_host_suffix})
160
  set (_ggml_vk_header ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.hpp)
 
165
  file(GLOB _ggml_vk_shader_deps "${_ggml_vk_input_dir}/*.comp")
166
  set (_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen)
167
 
168
+ # Add build and install dependencies for all builds
169
+ set(_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen-build vulkan-shaders-gen-install)
 
170
 
171
  add_custom_command(
172
  OUTPUT ${_ggml_vk_header}
ggml/src/ggml-vulkan/vulkan-shaders/CMakeLists.txt CHANGED
@@ -5,18 +5,35 @@ find_package (Threads REQUIRED)
5
 
6
  if (GGML_VULKAN_COOPMAT_GLSLC_SUPPORT)
7
  add_compile_definitions(GGML_VULKAN_COOPMAT_GLSLC_SUPPORT)
 
8
  endif()
9
  if (GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT)
10
  add_compile_definitions(GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT)
 
11
  endif()
12
  if (GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT)
13
  add_compile_definitions(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT)
 
14
  endif()
15
  if (GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT)
16
  add_compile_definitions(GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT)
 
17
  endif()
 
18
  set(TARGET vulkan-shaders-gen)
19
  add_executable(${TARGET} vulkan-shaders-gen.cpp)
20
  install(TARGETS ${TARGET} RUNTIME)
21
  target_compile_features(${TARGET} PRIVATE cxx_std_17)
22
  target_link_libraries(vulkan-shaders-gen PUBLIC Threads::Threads)
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
  if (GGML_VULKAN_COOPMAT_GLSLC_SUPPORT)
7
  add_compile_definitions(GGML_VULKAN_COOPMAT_GLSLC_SUPPORT)
8
+ message(STATUS "Enabling coopmat glslc support")
9
  endif()
10
  if (GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT)
11
  add_compile_definitions(GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT)
12
+ message(STATUS "Enabling coopmat2 glslc support")
13
  endif()
14
  if (GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT)
15
  add_compile_definitions(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT)
16
+ message(STATUS "Enabling dot glslc support")
17
  endif()
18
  if (GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT)
19
  add_compile_definitions(GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT)
20
+ message(STATUS "Enabling bfloat16 glslc support")
21
  endif()
22
+
23
  set(TARGET vulkan-shaders-gen)
24
  add_executable(${TARGET} vulkan-shaders-gen.cpp)
25
  install(TARGETS ${TARGET} RUNTIME)
26
  target_compile_features(${TARGET} PRIVATE cxx_std_17)
27
  target_link_libraries(vulkan-shaders-gen PUBLIC Threads::Threads)
28
+
29
+ # Configure output directories for MSVC builds
30
+ if(MSVC)
31
+ # Get the main project's runtime output directory if possible
32
+ if(DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY)
33
+ foreach(CONFIG ${CMAKE_CONFIGURATION_TYPES})
34
+ string(TOUPPER ${CONFIG} CONFIG)
35
+ set_target_properties(${TARGET} PROPERTIES
36
+ RUNTIME_OUTPUT_DIRECTORY_${CONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
37
+ endforeach()
38
+ endif()
39
+ endif()