Skip to content

Commit a933eb1

Browse files
reeselevineggerganov
authored andcommitted
ggml: Add initial WebGPU backend (llama/14521)
ggml-ci
1 parent 7f63c13 commit a933eb1

File tree

7 files changed

+1517
-0
lines changed

7 files changed

+1517
-0
lines changed

src/ggml-webgpu/CMakeLists.txt

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
cmake_minimum_required(VERSION 3.13)
2+
3+
find_package(Python3 REQUIRED)
4+
5+
# Shader locations
6+
set(SHADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/wgsl-shaders")
7+
set(SHADER_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
8+
set(SHADER_HEADER "${SHADER_OUTPUT_DIR}/ggml-wgsl-shaders.hpp")
9+
file(MAKE_DIRECTORY ${SHADER_OUTPUT_DIR})
10+
11+
message(STATUS "Shader output dir: ${SHADER_OUTPUT_DIR}")
12+
13+
# Find all WGSL files
14+
file(GLOB WGSL_SHADER_FILES "${SHADER_DIR}/*.wgsl")
15+
16+
# Generate the header using a Python script
17+
add_custom_command(
18+
OUTPUT ${SHADER_HEADER}
19+
COMMAND ${CMAKE_COMMAND} -E echo "Embedding WGSL shaders to ggml-wgsl-shaders.hpp"
20+
COMMAND ${CMAKE_COMMAND} -E make_directory ${SHADER_OUTPUT_DIR}
21+
COMMAND ${CMAKE_COMMAND} -E env PYTHONIOENCODING=utf-8
22+
${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/wgsl-shaders/embed_wgsl.py
23+
--input "${SHADER_DIR}"
24+
--output "${SHADER_HEADER}"
25+
DEPENDS ${WGSL_SHADER_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/wgsl-shaders/embed_wgsl.py
26+
VERBATIM
27+
)
28+
29+
add_custom_target(generate_shaders DEPENDS ${SHADER_HEADER})
30+
31+
ggml_add_backend_library(ggml-webgpu
32+
ggml-webgpu.cpp
33+
${SHADER_HEADER}
34+
../../include/ggml-webgpu.h
35+
)
36+
37+
add_dependencies(ggml-webgpu generate_shaders)
38+
39+
if(EMSCRIPTEN)
40+
set(EMDAWNWEBGPU_DIR "" CACHE PATH "Path to emdawnwebgpu_pkg")
41+
42+
target_compile_options(ggml-webgpu PRIVATE "--use-port=${EMDAWNWEBGPU_DIR}/emdawnwebgpu.port.py")
43+
target_link_options(ggml-webgpu PRIVATE "--use-port=${EMDAWNWEBGPU_DIR}/emdawnwebgpu.port.py")
44+
else()
45+
find_package(Dawn REQUIRED)
46+
set(DawnWebGPU_TARGET dawn::webgpu_dawn)
47+
endif()
48+
49+
if (GGML_WEBGPU_DEBUG)
50+
target_compile_definitions(ggml-webgpu PRIVATE GGML_WEBGPU_DEBUG=1)
51+
endif()
52+
53+
target_include_directories(ggml-webgpu PRIVATE ${SHADER_OUTPUT_DIR})
54+
target_link_libraries(ggml-webgpu PRIVATE ${DawnWebGPU_TARGET})

0 commit comments

Comments
 (0)