mirror of
https://github.com/ggerganov/llama.cpp.git
synced 2024-11-15 07:19:53 +00:00
add vulkan and kompute
This commit is contained in:
parent
efdd713023
commit
646e91a642
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@ -747,7 +747,7 @@ jobs:
|
|||||||
id: clone_kompute
|
id: clone_kompute
|
||||||
if: ${{ matrix.build == 'kompute-x64' }}
|
if: ${{ matrix.build == 'kompute-x64' }}
|
||||||
run: |
|
run: |
|
||||||
git submodule update --init ggml/src/kompute
|
git submodule update --init ggml/src/ggml-kompute/kompute
|
||||||
|
|
||||||
- name: Download OpenBLAS
|
- name: Download OpenBLAS
|
||||||
id: get_openblas
|
id: get_openblas
|
||||||
|
@ -244,246 +244,6 @@ if (GGML_SYCL)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (GGML_VULKAN)
|
|
||||||
find_package(Vulkan COMPONENTS glslc REQUIRED)
|
|
||||||
|
|
||||||
if (Vulkan_FOUND)
|
|
||||||
message(STATUS "Vulkan found")
|
|
||||||
|
|
||||||
list(APPEND GGML_CDEF_PUBLIC GGML_USE_VULKAN)
|
|
||||||
|
|
||||||
# Workaround to the "can't dereference invalidated vector iterator" bug in clang-cl debug build
|
|
||||||
# Posssibly relevant: https://stackoverflow.com/questions/74748276/visual-studio-no-displays-the-correct-length-of-stdvector
|
|
||||||
if (MSVC AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|
||||||
add_compile_definitions(_ITERATOR_DEBUG_LEVEL=0)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GGML_VULKAN_CHECK_RESULTS)
|
|
||||||
add_compile_definitions(GGML_VULKAN_CHECK_RESULTS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GGML_VULKAN_DEBUG)
|
|
||||||
add_compile_definitions(GGML_VULKAN_DEBUG)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GGML_VULKAN_MEMORY_DEBUG)
|
|
||||||
add_compile_definitions(GGML_VULKAN_MEMORY_DEBUG)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GGML_VULKAN_SHADER_DEBUG_INFO)
|
|
||||||
add_compile_definitions(GGML_VULKAN_SHADER_DEBUG_INFO)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GGML_VULKAN_PERF)
|
|
||||||
add_compile_definitions(GGML_VULKAN_PERF)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GGML_VULKAN_VALIDATE)
|
|
||||||
add_compile_definitions(GGML_VULKAN_VALIDATE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GGML_VULKAN_RUN_TESTS)
|
|
||||||
add_compile_definitions(GGML_VULKAN_RUN_TESTS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_subdirectory(vulkan-shaders)
|
|
||||||
|
|
||||||
set (_ggml_vk_genshaders_cmd 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)
|
|
||||||
set (_ggml_vk_output_dir ${CMAKE_CURRENT_BINARY_DIR}/vulkan-shaders.spv)
|
|
||||||
|
|
||||||
file(GLOB _ggml_vk_shader_deps "${_ggml_vk_input_dir}/*.comp")
|
|
||||||
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${_ggml_vk_header}
|
|
||||||
${_ggml_vk_source}
|
|
||||||
|
|
||||||
COMMAND ${_ggml_vk_genshaders_cmd}
|
|
||||||
--glslc ${Vulkan_GLSLC_EXECUTABLE}
|
|
||||||
--input-dir ${_ggml_vk_input_dir}
|
|
||||||
--output-dir ${_ggml_vk_output_dir}
|
|
||||||
--target-hpp ${_ggml_vk_header}
|
|
||||||
--target-cpp ${_ggml_vk_source}
|
|
||||||
--no-clean
|
|
||||||
|
|
||||||
DEPENDS ${_ggml_vk_shader_deps}
|
|
||||||
COMMENT "Generate vulkan shaders"
|
|
||||||
)
|
|
||||||
|
|
||||||
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})
|
|
||||||
|
|
||||||
list(APPEND GGML_EXTRA_LIBS_PRIVATE Vulkan::Vulkan)
|
|
||||||
list(APPEND GGML_EXTRA_INCLUDES ${CMAKE_CURRENT_BINARY_DIR})
|
|
||||||
else()
|
|
||||||
message(WARNING "Vulkan not found")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GGML_KOMPUTE)
|
|
||||||
add_compile_definitions(VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1)
|
|
||||||
|
|
||||||
find_package(Vulkan COMPONENTS glslc REQUIRED)
|
|
||||||
find_program(glslc_executable NAMES glslc HINTS Vulkan::glslc)
|
|
||||||
|
|
||||||
if (NOT glslc_executable)
|
|
||||||
message(FATAL_ERROR "glslc not found")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
function(compile_shader)
|
|
||||||
set(options)
|
|
||||||
set(oneValueArgs)
|
|
||||||
set(multiValueArgs SOURCES)
|
|
||||||
cmake_parse_arguments(compile_shader "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
|
||||||
foreach(source ${compile_shader_SOURCES})
|
|
||||||
get_filename_component(filename ${source} NAME)
|
|
||||||
set(spv_file ${filename}.spv)
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${spv_file}
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${source}
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/kompute-shaders/common.comp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/kompute-shaders/op_getrows.comp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/kompute-shaders/op_mul_mv_q_n_pre.comp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/kompute-shaders/op_mul_mv_q_n.comp
|
|
||||||
COMMAND ${glslc_executable} --target-env=vulkan1.2 -o ${spv_file} ${CMAKE_CURRENT_SOURCE_DIR}/${source}
|
|
||||||
COMMENT "Compiling ${source} to ${spv_file}"
|
|
||||||
)
|
|
||||||
|
|
||||||
get_filename_component(RAW_FILE_NAME ${spv_file} NAME)
|
|
||||||
set(FILE_NAME "shader${RAW_FILE_NAME}")
|
|
||||||
string(REPLACE ".comp.spv" ".h" HEADER_FILE ${FILE_NAME})
|
|
||||||
string(TOUPPER ${HEADER_FILE} HEADER_FILE_DEFINE)
|
|
||||||
string(REPLACE "." "_" HEADER_FILE_DEFINE "${HEADER_FILE_DEFINE}")
|
|
||||||
set(OUTPUT_HEADER_FILE "${HEADER_FILE}")
|
|
||||||
message(STATUS "${HEADER_FILE} generating ${HEADER_FILE_DEFINE}")
|
|
||||||
if(CMAKE_GENERATOR MATCHES "Visual Studio")
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "/*THIS FILE HAS BEEN AUTOMATICALLY GENERATED - DO NOT EDIT*/" > ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo \"\#ifndef ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo \"\#define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "namespace kp {" >> ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "namespace shader_data {" >> ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_BINARY_DIR}/bin/$<CONFIG>/xxd -i ${RAW_FILE_NAME} >> ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "}}" >> ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo \"\#endif // define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
|
|
||||||
DEPENDS ${spv_file} xxd
|
|
||||||
COMMENT "Converting to hpp: ${FILE_NAME} ${CMAKE_BINARY_DIR}/bin/$<CONFIG>/xxd"
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "/*THIS FILE HAS BEEN AUTOMATICALLY GENERATED - DO NOT EDIT*/" > ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo \"\#ifndef ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo \"\#define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "namespace kp {" >> ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "namespace shader_data {" >> ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_BINARY_DIR}/bin/xxd -i ${RAW_FILE_NAME} >> ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "}}" >> ${OUTPUT_HEADER_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo \"\#endif // define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
|
|
||||||
DEPENDS ${spv_file} xxd
|
|
||||||
COMMENT "Converting to hpp: ${FILE_NAME} ${CMAKE_BINARY_DIR}/bin/xxd"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/kompute/CMakeLists.txt")
|
|
||||||
message(STATUS "Kompute found")
|
|
||||||
set(KOMPUTE_OPT_LOG_LEVEL Error CACHE STRING "Kompute log level")
|
|
||||||
add_subdirectory(kompute)
|
|
||||||
|
|
||||||
# Compile our shaders
|
|
||||||
compile_shader(SOURCES
|
|
||||||
kompute-shaders/op_scale.comp
|
|
||||||
kompute-shaders/op_scale_8.comp
|
|
||||||
kompute-shaders/op_add.comp
|
|
||||||
kompute-shaders/op_addrow.comp
|
|
||||||
kompute-shaders/op_mul.comp
|
|
||||||
kompute-shaders/op_silu.comp
|
|
||||||
kompute-shaders/op_relu.comp
|
|
||||||
kompute-shaders/op_gelu.comp
|
|
||||||
kompute-shaders/op_softmax.comp
|
|
||||||
kompute-shaders/op_norm.comp
|
|
||||||
kompute-shaders/op_rmsnorm.comp
|
|
||||||
kompute-shaders/op_diagmask.comp
|
|
||||||
kompute-shaders/op_mul_mat_mat_f32.comp
|
|
||||||
kompute-shaders/op_mul_mat_f16.comp
|
|
||||||
kompute-shaders/op_mul_mat_q8_0.comp
|
|
||||||
kompute-shaders/op_mul_mat_q4_0.comp
|
|
||||||
kompute-shaders/op_mul_mat_q4_1.comp
|
|
||||||
kompute-shaders/op_mul_mat_q4_k.comp
|
|
||||||
kompute-shaders/op_mul_mat_q6_k.comp
|
|
||||||
kompute-shaders/op_getrows_f32.comp
|
|
||||||
kompute-shaders/op_getrows_f16.comp
|
|
||||||
kompute-shaders/op_getrows_q4_0.comp
|
|
||||||
kompute-shaders/op_getrows_q4_1.comp
|
|
||||||
kompute-shaders/op_getrows_q6_k.comp
|
|
||||||
kompute-shaders/op_rope_f16.comp
|
|
||||||
kompute-shaders/op_rope_f32.comp
|
|
||||||
kompute-shaders/op_cpy_f16_f16.comp
|
|
||||||
kompute-shaders/op_cpy_f16_f32.comp
|
|
||||||
kompute-shaders/op_cpy_f32_f16.comp
|
|
||||||
kompute-shaders/op_cpy_f32_f32.comp
|
|
||||||
)
|
|
||||||
|
|
||||||
# Create a custom target for our generated shaders
|
|
||||||
add_custom_target(generated_shaders DEPENDS
|
|
||||||
shaderop_scale.h
|
|
||||||
shaderop_scale_8.h
|
|
||||||
shaderop_add.h
|
|
||||||
shaderop_addrow.h
|
|
||||||
shaderop_mul.h
|
|
||||||
shaderop_silu.h
|
|
||||||
shaderop_relu.h
|
|
||||||
shaderop_gelu.h
|
|
||||||
shaderop_softmax.h
|
|
||||||
shaderop_norm.h
|
|
||||||
shaderop_rmsnorm.h
|
|
||||||
shaderop_diagmask.h
|
|
||||||
shaderop_mul_mat_mat_f32.h
|
|
||||||
shaderop_mul_mat_f16.h
|
|
||||||
shaderop_mul_mat_q8_0.h
|
|
||||||
shaderop_mul_mat_q4_0.h
|
|
||||||
shaderop_mul_mat_q4_1.h
|
|
||||||
shaderop_mul_mat_q4_k.h
|
|
||||||
shaderop_mul_mat_q6_k.h
|
|
||||||
shaderop_getrows_f32.h
|
|
||||||
shaderop_getrows_f16.h
|
|
||||||
shaderop_getrows_q4_0.h
|
|
||||||
shaderop_getrows_q4_1.h
|
|
||||||
shaderop_getrows_q6_k.h
|
|
||||||
shaderop_rope_f16.h
|
|
||||||
shaderop_rope_f32.h
|
|
||||||
shaderop_cpy_f16_f16.h
|
|
||||||
shaderop_cpy_f16_f32.h
|
|
||||||
shaderop_cpy_f32_f16.h
|
|
||||||
shaderop_cpy_f32_f32.h
|
|
||||||
)
|
|
||||||
|
|
||||||
# Create a custom command that depends on the generated_shaders
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ggml-kompute.stamp
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/ggml-kompute.stamp
|
|
||||||
DEPENDS generated_shaders
|
|
||||||
COMMENT "Ensuring shaders are generated before compiling ggml-kompute.cpp"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Add the stamp to the main sources to ensure dependency tracking
|
|
||||||
set(GGML_SOURCES_KOMPUTE ggml-kompute.cpp ${CMAKE_CURRENT_BINARY_DIR}/ggml-kompute.stamp)
|
|
||||||
set(GGML_HEADERS_KOMPUTE ../include/ggml-kompute.h ${CMAKE_CURRENT_BINARY_DIR}/ggml-kompute.stamp)
|
|
||||||
|
|
||||||
list(APPEND GGML_CDEF_PUBLIC GGML_USE_KOMPUTE)
|
|
||||||
|
|
||||||
list(APPEND GGML_EXTRA_LIBS_PRIVATE kompute)
|
|
||||||
list(APPEND GGML_EXTRA_INCLUDES ${CMAKE_CURRENT_BINARY_DIR})
|
|
||||||
else()
|
|
||||||
message(WARNING "Kompute not found")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (GGML_CANN)
|
if (GGML_CANN)
|
||||||
if ("cann${CANN_INSTALL_DIR}" STREQUAL "cann" AND DEFINED ENV{ASCEND_TOOLKIT_HOME})
|
if ("cann${CANN_INSTALL_DIR}" STREQUAL "cann" AND DEFINED ENV{ASCEND_TOOLKIT_HOME})
|
||||||
set(CANN_INSTALL_DIR $ENV{ASCEND_TOOLKIT_HOME})
|
set(CANN_INSTALL_DIR $ENV{ASCEND_TOOLKIT_HOME})
|
||||||
@ -757,14 +517,17 @@ target_link_libraries(ggml PUBLIC ggml-base ggml-cpu)
|
|||||||
|
|
||||||
function(ggml_add_backend backend)
|
function(ggml_add_backend backend)
|
||||||
string(TOUPPER "GGML_${backend}" backend_id)
|
string(TOUPPER "GGML_${backend}" backend_id)
|
||||||
string(TOLOWER "ggml-${backend}" backend_target)
|
|
||||||
if (${backend_id})
|
if (${backend_id})
|
||||||
|
string(TOLOWER "ggml-${backend}" backend_target)
|
||||||
add_subdirectory(${backend_target})
|
add_subdirectory(${backend_target})
|
||||||
if (${BUILD_SHARED_LIBS})
|
if (${BUILD_SHARED_LIBS})
|
||||||
target_compile_definitions(${backend_target} PRIVATE GGML_BACKEND_BUILD)
|
target_compile_definitions(${backend_target} PRIVATE GGML_BACKEND_BUILD)
|
||||||
target_compile_definitions(${backend_target} PUBLIC GGML_BABKEND_SHARED)
|
target_compile_definitions(${backend_target} PUBLIC GGML_BACKEND_SHARED)
|
||||||
endif()
|
endif()
|
||||||
target_link_libraries(ggml PUBLIC ${backend_target})
|
target_link_libraries(ggml PUBLIC ${backend_target})
|
||||||
|
string(TOUPPER "GGML_USE_${backend}" backend_use)
|
||||||
|
#set(GGML_CDEF_PUBLIC ${GGML_CDEF_PUBLIC} ${backend_use} PARENT_SCOPE)
|
||||||
|
target_compile_definitions(ggml PUBLIC ${backend_use})
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
@ -772,6 +535,7 @@ ggml_add_backend(CUDA)
|
|||||||
ggml_add_backend(METAL)
|
ggml_add_backend(METAL)
|
||||||
ggml_add_backend(BLAS)
|
ggml_add_backend(BLAS)
|
||||||
ggml_add_backend(RPC)
|
ggml_add_backend(RPC)
|
||||||
|
ggml_add_backend(Vulkan)
|
||||||
|
|
||||||
if (EMSCRIPTEN)
|
if (EMSCRIPTEN)
|
||||||
set_target_properties(ggml PROPERTIES COMPILE_FLAGS "-msimd128")
|
set_target_properties(ggml PROPERTIES COMPILE_FLAGS "-msimd128")
|
||||||
|
@ -78,8 +78,6 @@ if (BLAS_FOUND)
|
|||||||
#add_compile_options(${BLAS_LINKER_FLAGS})
|
#add_compile_options(${BLAS_LINKER_FLAGS})
|
||||||
target_compile_options(ggml-blas PRIVATE ${BLAS_LINKER_FLAGS})
|
target_compile_options(ggml-blas PRIVATE ${BLAS_LINKER_FLAGS})
|
||||||
|
|
||||||
set(GGML_CDEF_PUBLIC ${GGML_CDEF_PUBLIC} GGML_USE_BLAS PARENT_SCOPE)
|
|
||||||
|
|
||||||
if (${BLAS_INCLUDE_DIRS} MATCHES "mkl" AND (${GGML_BLAS_VENDOR} MATCHES "Generic" OR ${GGML_BLAS_VENDOR} MATCHES "Intel"))
|
if (${BLAS_INCLUDE_DIRS} MATCHES "mkl" AND (${GGML_BLAS_VENDOR} MATCHES "Generic" OR ${GGML_BLAS_VENDOR} MATCHES "Intel"))
|
||||||
add_compile_definitions(GGML_BLAS_USE_MKL)
|
add_compile_definitions(GGML_BLAS_USE_MKL)
|
||||||
endif()
|
endif()
|
||||||
|
@ -51,8 +51,6 @@ if (CUDAToolkit_FOUND)
|
|||||||
target_link_libraries(ggml-cuda PRIVATE ggml-base)
|
target_link_libraries(ggml-cuda PRIVATE ggml-base)
|
||||||
target_include_directories(ggml-cuda PRIVATE . ..)
|
target_include_directories(ggml-cuda PRIVATE . ..)
|
||||||
|
|
||||||
set(GGML_CDEF_PUBLIC ${GGML_CDEF_PUBLIC} GGML_USE_CUDA PARENT_SCOPE)
|
|
||||||
|
|
||||||
# TODO: change the definitions to this target only
|
# TODO: change the definitions to this target only
|
||||||
|
|
||||||
add_compile_definitions(GGML_CUDA_DMMV_X=${GGML_CUDA_DMMV_X})
|
add_compile_definitions(GGML_CUDA_DMMV_X=${GGML_CUDA_DMMV_X})
|
||||||
|
162
ggml/src/ggml-kompute/CMakeLists.txt
Normal file
162
ggml/src/ggml-kompute/CMakeLists.txt
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
|
||||||
|
find_package(Vulkan COMPONENTS glslc REQUIRED)
|
||||||
|
find_program(glslc_executable NAMES glslc HINTS Vulkan::glslc)
|
||||||
|
|
||||||
|
if (NOT glslc_executable)
|
||||||
|
message(FATAL_ERROR "glslc not found")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(ggml-kompute
|
||||||
|
ggml-kompute.cpp
|
||||||
|
../../include/ggml-kompute.h
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(ggml-kompute PRIVATE ggml-base kompute)
|
||||||
|
target_include_directories(ggml-kompute PRIVATE . .. ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
|
add_compile_definitions(VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1)
|
||||||
|
|
||||||
|
function(compile_shader)
|
||||||
|
set(options)
|
||||||
|
set(oneValueArgs)
|
||||||
|
set(multiValueArgs SOURCES)
|
||||||
|
cmake_parse_arguments(compile_shader "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||||
|
foreach(source ${compile_shader_SOURCES})
|
||||||
|
get_filename_component(filename ${source} NAME)
|
||||||
|
set(spv_file ${filename}.spv)
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${spv_file}
|
||||||
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${source}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/kompute-shaders/common.comp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/kompute-shaders/op_getrows.comp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/kompute-shaders/op_mul_mv_q_n_pre.comp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/kompute-shaders/op_mul_mv_q_n.comp
|
||||||
|
COMMAND ${glslc_executable} --target-env=vulkan1.2 -o ${spv_file} ${CMAKE_CURRENT_SOURCE_DIR}/${source}
|
||||||
|
COMMENT "Compiling ${source} to ${spv_file}"
|
||||||
|
)
|
||||||
|
|
||||||
|
get_filename_component(RAW_FILE_NAME ${spv_file} NAME)
|
||||||
|
set(FILE_NAME "shader${RAW_FILE_NAME}")
|
||||||
|
string(REPLACE ".comp.spv" ".h" HEADER_FILE ${FILE_NAME})
|
||||||
|
string(TOUPPER ${HEADER_FILE} HEADER_FILE_DEFINE)
|
||||||
|
string(REPLACE "." "_" HEADER_FILE_DEFINE "${HEADER_FILE_DEFINE}")
|
||||||
|
set(OUTPUT_HEADER_FILE "${HEADER_FILE}")
|
||||||
|
message(STATUS "${HEADER_FILE} generating ${HEADER_FILE_DEFINE}")
|
||||||
|
if(CMAKE_GENERATOR MATCHES "Visual Studio")
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "/*THIS FILE HAS BEEN AUTOMATICALLY GENERATED - DO NOT EDIT*/" > ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo \"\#ifndef ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo \"\#define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "namespace kp {" >> ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "namespace shader_data {" >> ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_BINARY_DIR}/bin/$<CONFIG>/xxd -i ${RAW_FILE_NAME} >> ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "}}" >> ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo \"\#endif // define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
|
||||||
|
DEPENDS ${spv_file} xxd
|
||||||
|
COMMENT "Converting to hpp: ${FILE_NAME} ${CMAKE_BINARY_DIR}/bin/$<CONFIG>/xxd"
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "/*THIS FILE HAS BEEN AUTOMATICALLY GENERATED - DO NOT EDIT*/" > ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo \"\#ifndef ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo \"\#define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "namespace kp {" >> ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "namespace shader_data {" >> ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_BINARY_DIR}/bin/xxd -i ${RAW_FILE_NAME} >> ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "}}" >> ${OUTPUT_HEADER_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo \"\#endif // define ${HEADER_FILE_DEFINE}\" >> ${OUTPUT_HEADER_FILE}
|
||||||
|
DEPENDS ${spv_file} xxd
|
||||||
|
COMMENT "Converting to hpp: ${FILE_NAME} ${CMAKE_BINARY_DIR}/bin/xxd"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/kompute/CMakeLists.txt")
|
||||||
|
message(STATUS "Kompute found")
|
||||||
|
set(KOMPUTE_OPT_LOG_LEVEL Error CACHE STRING "Kompute log level")
|
||||||
|
add_subdirectory(kompute)
|
||||||
|
|
||||||
|
# Compile our shaders
|
||||||
|
compile_shader(SOURCES
|
||||||
|
kompute-shaders/op_scale.comp
|
||||||
|
kompute-shaders/op_scale_8.comp
|
||||||
|
kompute-shaders/op_add.comp
|
||||||
|
kompute-shaders/op_addrow.comp
|
||||||
|
kompute-shaders/op_mul.comp
|
||||||
|
kompute-shaders/op_silu.comp
|
||||||
|
kompute-shaders/op_relu.comp
|
||||||
|
kompute-shaders/op_gelu.comp
|
||||||
|
kompute-shaders/op_softmax.comp
|
||||||
|
kompute-shaders/op_norm.comp
|
||||||
|
kompute-shaders/op_rmsnorm.comp
|
||||||
|
kompute-shaders/op_diagmask.comp
|
||||||
|
kompute-shaders/op_mul_mat_mat_f32.comp
|
||||||
|
kompute-shaders/op_mul_mat_f16.comp
|
||||||
|
kompute-shaders/op_mul_mat_q8_0.comp
|
||||||
|
kompute-shaders/op_mul_mat_q4_0.comp
|
||||||
|
kompute-shaders/op_mul_mat_q4_1.comp
|
||||||
|
kompute-shaders/op_mul_mat_q4_k.comp
|
||||||
|
kompute-shaders/op_mul_mat_q6_k.comp
|
||||||
|
kompute-shaders/op_getrows_f32.comp
|
||||||
|
kompute-shaders/op_getrows_f16.comp
|
||||||
|
kompute-shaders/op_getrows_q4_0.comp
|
||||||
|
kompute-shaders/op_getrows_q4_1.comp
|
||||||
|
kompute-shaders/op_getrows_q6_k.comp
|
||||||
|
kompute-shaders/op_rope_f16.comp
|
||||||
|
kompute-shaders/op_rope_f32.comp
|
||||||
|
kompute-shaders/op_cpy_f16_f16.comp
|
||||||
|
kompute-shaders/op_cpy_f16_f32.comp
|
||||||
|
kompute-shaders/op_cpy_f32_f16.comp
|
||||||
|
kompute-shaders/op_cpy_f32_f32.comp
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create a custom target for our generated shaders
|
||||||
|
add_custom_target(generated_shaders DEPENDS
|
||||||
|
shaderop_scale.h
|
||||||
|
shaderop_scale_8.h
|
||||||
|
shaderop_add.h
|
||||||
|
shaderop_addrow.h
|
||||||
|
shaderop_mul.h
|
||||||
|
shaderop_silu.h
|
||||||
|
shaderop_relu.h
|
||||||
|
shaderop_gelu.h
|
||||||
|
shaderop_softmax.h
|
||||||
|
shaderop_norm.h
|
||||||
|
shaderop_rmsnorm.h
|
||||||
|
shaderop_diagmask.h
|
||||||
|
shaderop_mul_mat_mat_f32.h
|
||||||
|
shaderop_mul_mat_f16.h
|
||||||
|
shaderop_mul_mat_q8_0.h
|
||||||
|
shaderop_mul_mat_q4_0.h
|
||||||
|
shaderop_mul_mat_q4_1.h
|
||||||
|
shaderop_mul_mat_q4_k.h
|
||||||
|
shaderop_mul_mat_q6_k.h
|
||||||
|
shaderop_getrows_f32.h
|
||||||
|
shaderop_getrows_f16.h
|
||||||
|
shaderop_getrows_q4_0.h
|
||||||
|
shaderop_getrows_q4_1.h
|
||||||
|
shaderop_getrows_q6_k.h
|
||||||
|
shaderop_rope_f16.h
|
||||||
|
shaderop_rope_f32.h
|
||||||
|
shaderop_cpy_f16_f16.h
|
||||||
|
shaderop_cpy_f16_f32.h
|
||||||
|
shaderop_cpy_f32_f16.h
|
||||||
|
shaderop_cpy_f32_f32.h
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create a custom command that depends on the generated_shaders
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ggml-kompute.stamp
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/ggml-kompute.stamp
|
||||||
|
DEPENDS generated_shaders
|
||||||
|
COMMENT "Ensuring shaders are generated before compiling ggml-kompute.cpp"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Add the stamp to the main sources to ensure dependency tracking
|
||||||
|
target_sources(ggml-kompute PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/ggml-kompute.stamp)
|
||||||
|
else()
|
||||||
|
message(WARNING "Kompute not found")
|
||||||
|
endif()
|
@ -17,8 +17,6 @@ target_link_libraries(ggml-metal PRIVATE
|
|||||||
|
|
||||||
target_include_directories(ggml-metal PRIVATE . ..)
|
target_include_directories(ggml-metal PRIVATE . ..)
|
||||||
|
|
||||||
set(GGML_CDEF_PUBLIC ${GGML_CDEF_PUBLIC} GGML_USE_METAL PARENT_SCOPE)
|
|
||||||
|
|
||||||
if (GGML_METAL_NDEBUG)
|
if (GGML_METAL_NDEBUG)
|
||||||
add_compile_definitions(GGML_METAL_NDEBUG)
|
add_compile_definitions(GGML_METAL_NDEBUG)
|
||||||
endif()
|
endif()
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
message(STATUS "Using RPC backend")
|
message(STATUS "Using RPC backend")
|
||||||
|
|
||||||
set(GGML_CDEF_PUBLIC ${GGML_CDEF_PUBLIC} GGML_USE_RPC PARENT_SCOPE)
|
|
||||||
|
|
||||||
add_library(ggml-rpc
|
add_library(ggml-rpc
|
||||||
ggml-rpc.cpp)
|
ggml-rpc.cpp)
|
||||||
|
|
||||||
|
78
ggml/src/ggml-vulkan/CMakeLists.txt
Normal file
78
ggml/src/ggml-vulkan/CMakeLists.txt
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
find_package(Vulkan COMPONENTS glslc REQUIRED)
|
||||||
|
|
||||||
|
if (Vulkan_FOUND)
|
||||||
|
message(STATUS "Vulkan found")
|
||||||
|
|
||||||
|
add_library(ggml-vulkan
|
||||||
|
ggml-vulkan.cpp
|
||||||
|
../../include/ggml-vulkan.h
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(ggml-vulkan PRIVATE ggml-base Vulkan::Vulkan)
|
||||||
|
target_include_directories(ggml-vulkan PRIVATE . .. ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
|
# Workaround to the "can't dereference invalidated vector iterator" bug in clang-cl debug build
|
||||||
|
# Posssibly relevant: https://stackoverflow.com/questions/74748276/visual-studio-no-displays-the-correct-length-of-stdvector
|
||||||
|
if (MSVC AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
|
add_compile_definitions(_ITERATOR_DEBUG_LEVEL=0)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GGML_VULKAN_CHECK_RESULTS)
|
||||||
|
add_compile_definitions(GGML_VULKAN_CHECK_RESULTS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GGML_VULKAN_DEBUG)
|
||||||
|
add_compile_definitions(GGML_VULKAN_DEBUG)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GGML_VULKAN_MEMORY_DEBUG)
|
||||||
|
add_compile_definitions(GGML_VULKAN_MEMORY_DEBUG)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GGML_VULKAN_SHADER_DEBUG_INFO)
|
||||||
|
add_compile_definitions(GGML_VULKAN_SHADER_DEBUG_INFO)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GGML_VULKAN_PERF)
|
||||||
|
add_compile_definitions(GGML_VULKAN_PERF)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GGML_VULKAN_VALIDATE)
|
||||||
|
add_compile_definitions(GGML_VULKAN_VALIDATE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GGML_VULKAN_RUN_TESTS)
|
||||||
|
add_compile_definitions(GGML_VULKAN_RUN_TESTS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_subdirectory(vulkan-shaders)
|
||||||
|
|
||||||
|
set (_ggml_vk_genshaders_cmd 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)
|
||||||
|
set (_ggml_vk_output_dir ${CMAKE_CURRENT_BINARY_DIR}/vulkan-shaders.spv)
|
||||||
|
|
||||||
|
file(GLOB _ggml_vk_shader_deps "${_ggml_vk_input_dir}/*.comp")
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${_ggml_vk_header}
|
||||||
|
${_ggml_vk_source}
|
||||||
|
|
||||||
|
COMMAND ${_ggml_vk_genshaders_cmd}
|
||||||
|
--glslc ${Vulkan_GLSLC_EXECUTABLE}
|
||||||
|
--input-dir ${_ggml_vk_input_dir}
|
||||||
|
--output-dir ${_ggml_vk_output_dir}
|
||||||
|
--target-hpp ${_ggml_vk_header}
|
||||||
|
--target-cpp ${_ggml_vk_source}
|
||||||
|
--no-clean
|
||||||
|
|
||||||
|
DEPENDS ${_ggml_vk_shader_deps}
|
||||||
|
COMMENT "Generate vulkan shaders"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_sources(ggml-vulkan PRIVATE ${_ggml_vk_source} ${_ggml_vk_header})
|
||||||
|
|
||||||
|
else()
|
||||||
|
message(WARNING "Vulkan not found")
|
||||||
|
endif()
|
Loading…
Reference in New Issue
Block a user