mirror of
https://github.com/ikawrakow/ik_llama.cpp.git
synced 2026-05-01 03:41:53 +00:00
Move Vulkan stuff inside if (GGML_VULKAN)
This commit is contained in:
@@ -643,8 +643,6 @@ if (GGML_RPC)
|
|||||||
set(GGML_SOURCES_RPC ggml-rpc.cpp)
|
set(GGML_SOURCES_RPC ggml-rpc.cpp)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(Vulkan COMPONENTS glslc REQUIRED)
|
|
||||||
|
|
||||||
function(detect_host_compiler)
|
function(detect_host_compiler)
|
||||||
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
|
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
|
||||||
find_program(HOST_C_COMPILER NAMES cl gcc clang NO_CMAKE_FIND_ROOT_PATH)
|
find_program(HOST_C_COMPILER NAMES cl gcc clang NO_CMAKE_FIND_ROOT_PATH)
|
||||||
@@ -657,71 +655,68 @@ function(detect_host_compiler)
|
|||||||
set(HOST_CXX_COMPILER "${HOST_CXX_COMPILER}" PARENT_SCOPE)
|
set(HOST_CXX_COMPILER "${HOST_CXX_COMPILER}" PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# Function to test shader extension support
|
|
||||||
# Parameters:
|
|
||||||
# EXTENSION_NAME - Name of the extension to test (e.g., "GL_EXT_integer_dot_product")
|
|
||||||
# TEST_SHADER_FILE - Path to the test shader file
|
|
||||||
# RESULT_VARIABLE - Name of the variable to set (ON/OFF) based on test result
|
|
||||||
function(test_shader_extension_support EXTENSION_NAME TEST_SHADER_FILE RESULT_VARIABLE)
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${Vulkan_GLSLC_EXECUTABLE} -o - -fshader-stage=compute --target-env=vulkan1.3 "${TEST_SHADER_FILE}"
|
|
||||||
OUTPUT_VARIABLE glslc_output
|
|
||||||
ERROR_VARIABLE glslc_error
|
|
||||||
)
|
|
||||||
|
|
||||||
if (${glslc_error} MATCHES ".*extension not supported: ${EXTENSION_NAME}.*")
|
|
||||||
message(STATUS "${EXTENSION_NAME} not supported by glslc")
|
|
||||||
set(${RESULT_VARIABLE} OFF PARENT_SCOPE)
|
|
||||||
else()
|
|
||||||
message(STATUS "${EXTENSION_NAME} supported by glslc")
|
|
||||||
set(${RESULT_VARIABLE} ON PARENT_SCOPE)
|
|
||||||
add_compile_definitions(${RESULT_VARIABLE})
|
|
||||||
|
|
||||||
# Ensure the extension support is forwarded to vulkan-shaders-gen
|
|
||||||
list(APPEND VULKAN_SHADER_GEN_CMAKE_ARGS -D${RESULT_VARIABLE}=ON)
|
|
||||||
set(VULKAN_SHADER_GEN_CMAKE_ARGS "${VULKAN_SHADER_GEN_CMAKE_ARGS}" PARENT_SCOPE)
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
if (GGML_VULKAN)
|
if (GGML_VULKAN)
|
||||||
find_package(Vulkan COMPONENTS glslc REQUIRED)
|
find_package(Vulkan COMPONENTS glslc REQUIRED)
|
||||||
|
|
||||||
if (Vulkan_FOUND)
|
if (Vulkan_FOUND)
|
||||||
message(STATUS "Vulkan found")
|
message(STATUS "Vulkan found")
|
||||||
|
|
||||||
# add vulkan test
|
# Function to test shader extension support
|
||||||
|
# Parameters:
|
||||||
set(VULKAN_SHADER_GEN_CMAKE_ARGS "")
|
# EXTENSION_NAME - Name of the extension to test (e.g., "GL_EXT_integer_dot_product")
|
||||||
|
# TEST_SHADER_FILE - Path to the test shader file
|
||||||
|
# RESULT_VARIABLE - Name of the variable to set (ON/OFF) based on test result
|
||||||
|
function(test_shader_extension_support EXTENSION_NAME TEST_SHADER_FILE RESULT_VARIABLE)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${Vulkan_GLSLC_EXECUTABLE} -o - -fshader-stage=compute --target-env=vulkan1.3 "${TEST_SHADER_FILE}"
|
||||||
|
OUTPUT_VARIABLE glslc_output
|
||||||
|
ERROR_VARIABLE glslc_error
|
||||||
|
)
|
||||||
|
|
||||||
# Test all shader extensions
|
if (${glslc_error} MATCHES ".*extension not supported: ${EXTENSION_NAME}.*")
|
||||||
test_shader_extension_support(
|
message(STATUS "${EXTENSION_NAME} not supported by glslc")
|
||||||
"GL_KHR_cooperative_matrix"
|
set(${RESULT_VARIABLE} OFF PARENT_SCOPE)
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_coopmat_support.comp"
|
else()
|
||||||
"GGML_VULKAN_COOPMAT_GLSLC_SUPPORT"
|
message(STATUS "${EXTENSION_NAME} supported by glslc")
|
||||||
)
|
set(${RESULT_VARIABLE} ON PARENT_SCOPE)
|
||||||
|
add_compile_definitions(${RESULT_VARIABLE})
|
||||||
|
|
||||||
test_shader_extension_support(
|
# Ensure the extension support is forwarded to vulkan-shaders-gen
|
||||||
"GL_NV_cooperative_matrix2"
|
list(APPEND VULKAN_SHADER_GEN_CMAKE_ARGS -D${RESULT_VARIABLE}=ON)
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_coopmat2_support.comp"
|
set(VULKAN_SHADER_GEN_CMAKE_ARGS "${VULKAN_SHADER_GEN_CMAKE_ARGS}" PARENT_SCOPE)
|
||||||
"GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT"
|
endif()
|
||||||
)
|
endfunction()
|
||||||
|
|
||||||
test_shader_extension_support(
|
# add vulkan test
|
||||||
"GL_EXT_integer_dot_product"
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_integer_dot_support.comp"
|
|
||||||
"GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT"
|
|
||||||
)
|
|
||||||
|
|
||||||
test_shader_extension_support(
|
set(VULKAN_SHADER_GEN_CMAKE_ARGS "")
|
||||||
"GL_EXT_bfloat16"
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_bfloat16_support.comp"
|
# Test all shader extensions
|
||||||
"GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT"
|
test_shader_extension_support(
|
||||||
)
|
"GL_KHR_cooperative_matrix"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_coopmat_support.comp"
|
||||||
|
"GGML_VULKAN_COOPMAT_GLSLC_SUPPORT"
|
||||||
|
)
|
||||||
|
|
||||||
# end vulkan test
|
test_shader_extension_support(
|
||||||
|
"GL_NV_cooperative_matrix2"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_coopmat2_support.comp"
|
||||||
|
"GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT"
|
||||||
|
)
|
||||||
|
|
||||||
|
test_shader_extension_support(
|
||||||
|
"GL_EXT_integer_dot_product"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_integer_dot_support.comp"
|
||||||
|
"GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT"
|
||||||
|
)
|
||||||
|
|
||||||
|
test_shader_extension_support(
|
||||||
|
"GL_EXT_bfloat16"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders/test_bfloat16_support.comp"
|
||||||
|
"GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT"
|
||||||
|
)
|
||||||
|
|
||||||
|
# end vulkan test
|
||||||
list(APPEND GGML_CDEF_PUBLIC GGML_USE_VULKAN)
|
list(APPEND GGML_CDEF_PUBLIC GGML_USE_VULKAN)
|
||||||
|
|
||||||
# Workaround to the "can't dereference invalidated vector iterator" bug in clang-cl debug build
|
# Workaround to the "can't dereference invalidated vector iterator" bug in clang-cl debug build
|
||||||
@@ -758,79 +753,79 @@ if (GGML_VULKAN)
|
|||||||
add_compile_definitions(GGML_VULKAN_RUN_TESTS)
|
add_compile_definitions(GGML_VULKAN_RUN_TESTS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Set up toolchain for host compilation whether cross-compiling or not
|
# Set up toolchain for host compilation whether cross-compiling or not
|
||||||
if (CMAKE_CROSSCOMPILING)
|
if (CMAKE_CROSSCOMPILING)
|
||||||
if (GGML_VULKAN_SHADERS_GEN_TOOLCHAIN)
|
if (GGML_VULKAN_SHADERS_GEN_TOOLCHAIN)
|
||||||
set(HOST_CMAKE_TOOLCHAIN_FILE ${GGML_VULKAN_SHADERS_GEN_TOOLCHAIN})
|
set(HOST_CMAKE_TOOLCHAIN_FILE ${GGML_VULKAN_SHADERS_GEN_TOOLCHAIN})
|
||||||
else()
|
else()
|
||||||
detect_host_compiler()
|
detect_host_compiler()
|
||||||
if (NOT HOST_C_COMPILER OR NOT HOST_CXX_COMPILER)
|
if (NOT HOST_C_COMPILER OR NOT HOST_CXX_COMPILER)
|
||||||
message(FATAL_ERROR "Host compiler not found")
|
message(FATAL_ERROR "Host compiler not found")
|
||||||
else()
|
else()
|
||||||
message(STATUS "Host compiler: ${HOST_C_COMPILER} ${HOST_CXX_COMPILER}")
|
message(STATUS "Host compiler: ${HOST_C_COMPILER} ${HOST_CXX_COMPILER}")
|
||||||
endif()
|
endif()
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/host-toolchain.cmake.in ${CMAKE_BINARY_DIR}/host-toolchain.cmake @ONLY)
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/host-toolchain.cmake.in ${CMAKE_BINARY_DIR}/host-toolchain.cmake @ONLY)
|
||||||
set(HOST_CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR}/host-toolchain.cmake)
|
set(HOST_CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR}/host-toolchain.cmake)
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
# For non-cross-compiling, use empty toolchain (use host compiler)
|
# For non-cross-compiling, use empty toolchain (use host compiler)
|
||||||
set(HOST_CMAKE_TOOLCHAIN_FILE "")
|
set(HOST_CMAKE_TOOLCHAIN_FILE "")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(ExternalProject)
|
include(ExternalProject)
|
||||||
|
|
||||||
if (CMAKE_CROSSCOMPILING)
|
if (CMAKE_CROSSCOMPILING)
|
||||||
list(APPEND VULKAN_SHADER_GEN_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${HOST_CMAKE_TOOLCHAIN_FILE})
|
list(APPEND VULKAN_SHADER_GEN_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${HOST_CMAKE_TOOLCHAIN_FILE})
|
||||||
message(STATUS "vulkan-shaders-gen toolchain file: ${HOST_CMAKE_TOOLCHAIN_FILE}")
|
message(STATUS "vulkan-shaders-gen toolchain file: ${HOST_CMAKE_TOOLCHAIN_FILE}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
ExternalProject_Add(
|
ExternalProject_Add(
|
||||||
vulkan-shaders-gen
|
vulkan-shaders-gen
|
||||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders
|
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders
|
||||||
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/$<CONFIG>
|
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/$<CONFIG>
|
||||||
-DCMAKE_INSTALL_BINDIR=.
|
-DCMAKE_INSTALL_BINDIR=.
|
||||||
-DCMAKE_BUILD_TYPE=$<CONFIG>
|
-DCMAKE_BUILD_TYPE=$<CONFIG>
|
||||||
${VULKAN_SHADER_GEN_CMAKE_ARGS}
|
${VULKAN_SHADER_GEN_CMAKE_ARGS}
|
||||||
|
|
||||||
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config $<CONFIG>
|
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config $<CONFIG>
|
||||||
|
|
||||||
# NOTE: When DESTDIR is set using Makefile generators and
|
# NOTE: When DESTDIR is set using Makefile generators and
|
||||||
# "make install" triggers the build step, vulkan-shaders-gen
|
# "make install" triggers the build step, vulkan-shaders-gen
|
||||||
# would be installed into the DESTDIR prefix, so it is unset
|
# would be installed into the DESTDIR prefix, so it is unset
|
||||||
# to ensure that does not happen.
|
# to ensure that does not happen.
|
||||||
|
|
||||||
INSTALL_COMMAND ${CMAKE_COMMAND} -E env --unset=DESTDIR
|
INSTALL_COMMAND ${CMAKE_COMMAND} -E env --unset=DESTDIR
|
||||||
${CMAKE_COMMAND} --install . --config $<CONFIG>
|
${CMAKE_COMMAND} --install . --config $<CONFIG>
|
||||||
)
|
)
|
||||||
|
|
||||||
set (_ggml_vk_host_suffix $<IF:$<STREQUAL:${CMAKE_HOST_SYSTEM_NAME},Windows>,.exe,>)
|
set (_ggml_vk_host_suffix $<IF:$<STREQUAL:${CMAKE_HOST_SYSTEM_NAME},Windows>,.exe,>)
|
||||||
set (_ggml_vk_genshaders_dir "${CMAKE_BINARY_DIR}/$<CONFIG>")
|
set (_ggml_vk_genshaders_dir "${CMAKE_BINARY_DIR}/$<CONFIG>")
|
||||||
set (_ggml_vk_genshaders_cmd "${_ggml_vk_genshaders_dir}/vulkan-shaders-gen${_ggml_vk_host_suffix}")
|
set (_ggml_vk_genshaders_cmd "${_ggml_vk_genshaders_dir}/vulkan-shaders-gen${_ggml_vk_host_suffix}")
|
||||||
set (_ggml_vk_header "${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.hpp")
|
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_source "${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.cpp")
|
||||||
set (_ggml_vk_input_dir "${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders")
|
set (_ggml_vk_input_dir "${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders")
|
||||||
set (_ggml_vk_output_dir "${CMAKE_CURRENT_BINARY_DIR}/vulkan-shaders.spv")
|
set (_ggml_vk_output_dir "${CMAKE_CURRENT_BINARY_DIR}/vulkan-shaders.spv")
|
||||||
|
|
||||||
file(GLOB _ggml_vk_shader_files CONFIGURE_DEPENDS "${_ggml_vk_input_dir}/*.comp")
|
file(GLOB _ggml_vk_shader_files CONFIGURE_DEPENDS "${_ggml_vk_input_dir}/*.comp")
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${_ggml_vk_header}
|
OUTPUT ${_ggml_vk_header}
|
||||||
${_ggml_vk_source}
|
${_ggml_vk_source}
|
||||||
|
|
||||||
COMMAND ${_ggml_vk_genshaders_cmd}
|
COMMAND ${_ggml_vk_genshaders_cmd}
|
||||||
--glslc ${Vulkan_GLSLC_EXECUTABLE}
|
--glslc ${Vulkan_GLSLC_EXECUTABLE}
|
||||||
--input-dir ${_ggml_vk_input_dir}
|
--input-dir ${_ggml_vk_input_dir}
|
||||||
--output-dir ${_ggml_vk_output_dir}
|
--output-dir ${_ggml_vk_output_dir}
|
||||||
--target-hpp ${_ggml_vk_header}
|
--target-hpp ${_ggml_vk_header}
|
||||||
--target-cpp ${_ggml_vk_source}
|
--target-cpp ${_ggml_vk_source}
|
||||||
--no-clean
|
--no-clean
|
||||||
|
|
||||||
DEPENDS ${_ggml_vk_shader_files}
|
DEPENDS ${_ggml_vk_shader_files}
|
||||||
${_ggml_vk_shader_gens_sources}
|
${_ggml_vk_shader_gens_sources}
|
||||||
vulkan-shaders-gen
|
vulkan-shaders-gen
|
||||||
|
|
||||||
COMMENT "Generate vulkan shaders"
|
COMMENT "Generate vulkan shaders"
|
||||||
)
|
)
|
||||||
|
|
||||||
set(GGML_HEADERS_VULKAN ${CMAKE_CURRENT_SOURCE_DIR}/../include/ggml-vulkan.h ${_ggml_vk_header})
|
set(GGML_HEADERS_VULKAN ${CMAKE_CURRENT_SOURCE_DIR}/../include/ggml-vulkan.h ${_ggml_vk_header})
|
||||||
set(GGML_SOURCES_VULKAN ggml-vulkan.cpp ${_ggml_vk_source})
|
set(GGML_SOURCES_VULKAN ggml-vulkan.cpp ${_ggml_vk_source})
|
||||||
|
|||||||
Reference in New Issue
Block a user