Spaces:
Build error
Build error
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() | |
ggml_add_backend_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_norm_f16.comp | |
kompute-shaders/op_rope_norm_f32.comp | |
kompute-shaders/op_rope_neox_f16.comp | |
kompute-shaders/op_rope_neox_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_norm_f16.h | |
shaderop_rope_norm_f32.h | |
shaderop_rope_neox_f16.h | |
shaderop_rope_neox_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() | |