|
|
|
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() |
|
|