-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
146 lines (136 loc) · 5.69 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
cmake_minimum_required(VERSION 3.23)
project(betann)
option(BETANN_BUILD_TESTS "Build BetaNN's tests" ON)
# Use C++17.
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Define the BetaNN library.
add_library(betann STATIC)
target_sources(betann PRIVATE betann/device.cc
betann/kernels.cc
betann/kernels_helper.cc
betann/math.cc
betann/matmul.cc
betann/preprocessor.cc
betann/reduce.cc
betann/utils.cc
PUBLIC FILE_SET HEADERS
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}
FILES betann/betann.h
betann/device.h
betann/data_type.h
betann/math.h
betann/matmul.h
betann/kernels.h
betann/reduce.h
betann/utils.h)
target_include_directories(betann PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/gen")
if (CMAKE_COMPILER_IS_GNUCC)
target_compile_options(betann PUBLIC -Wno-return-type)
elseif (MSVC)
target_compile_options(betann PUBLIC /EHsc /wd4244 /wd4715)
endif()
# Embed WGSL sources in binary.
set(BETANN_WGSL_SOURCES betann/wgsl/arange.wgsl
betann/wgsl/binary_contiguous.wgsl
betann/wgsl/binary_general.wgsl
betann/wgsl/binary_ops.wgsl
betann/wgsl/copy_contiguous.wgsl
betann/wgsl/copy_general.wgsl
betann/wgsl/copy_general_both.wgsl
betann/wgsl/constants.wgsl
betann/wgsl/gemv.wgsl
betann/wgsl/gemvt.wgsl
betann/wgsl/random.wgsl
betann/wgsl/reduce_all.wgsl
betann/wgsl/reduce_none.wgsl
betann/wgsl/reduce_last.wgsl
betann/wgsl/reduce_ops.wgsl
betann/wgsl/reduce_row.wgsl
betann/wgsl/sort_block.wgsl
betann/wgsl/unary_contiguous.wgsl
betann/wgsl/unary_general.wgsl
betann/wgsl/unary_ops.wgsl
betann/wgsl/utils.wgsl)
string(JOIN ":" BETANN_WGSL_SOURCES_ARG ${BETANN_WGSL_SOURCES})
add_custom_command(
OUTPUT gen/wgsl_sources.h
COMMAND ${CMAKE_COMMAND}
-DBETANN_SOURCE_ROOT=${CMAKE_CURRENT_SOURCE_DIR}
-DBETANN_WGSL_SOURCES=${BETANN_WGSL_SOURCES_ARG}
-P "${CMAKE_CURRENT_SOURCE_DIR}/betann/wgsl/shader2h.cmake"
DEPENDS betann/wgsl/shader2h.cmake
${BETANN_WGSL_SOURCES})
add_custom_target(wgsl_sources DEPENDS gen/wgsl_sources.h)
add_dependencies(betann wgsl_sources)
# Use fmt.
include(FetchContent)
FetchContent_Declare(
fmt
GIT_REPOSITORY https://github.com/fmtlib/fmt.git
GIT_TAG 10.2.1
EXCLUDE_FROM_ALL)
FetchContent_MakeAvailable(fmt)
target_link_libraries(betann PRIVATE $<BUILD_INTERFACE:fmt::fmt-header-only>)
# Link with dawn statically.
cmake_policy(SET CMP0097 NEW) # enable GIT_SUBMODULES
FetchContent_Declare(
dawn
GIT_REPOSITORY https://dawn.googlesource.com/dawn
GIT_TAG "chromium/7012"
GIT_SHALLOW ON
GIT_SUBMODULES "" # no submodules
UPDATE_DISCONNECTED ON # no update when re-generating
EXCLUDE_FROM_ALL)
set(DAWN_FETCH_DEPENDENCIES ON)
set(DAWN_USE_GLFW OFF)
set(DAWN_USE_X11 OFF)
set(DAWN_BUILD_SAMPLES OFF)
set(DAWN_BUILD_MONOLITHIC_LIBRARY OFF)
set(TINT_BUILD_CMD_TOOLS OFF)
set(TINT_BUILD_TESTS OFF)
if (WIN32)
set(DAWN_ENABLE_SPIRV_VALIDATION OFF)
set(DAWN_ENABLE_VULKAN OFF) # TODO(zcbenz): enable it and ship vulkan-1.dll
set(DAWN_USE_WINDOWS_UI OFF)
endif()
FetchContent_MakeAvailable(dawn)
target_link_libraries(betann PUBLIC $<BUILD_INTERFACE:dawncpp_headers>
PRIVATE $<LINK_ONLY:dawn::dawn_common>
$<LINK_ONLY:dawn::dawn_native>)
# Build the procs that call dawn_native directly.
find_package(Python3 REQUIRED)
DawnJSONGenerator(TARGET "webgpu_dawn_native_proc"
PRINT_NAME "Dawn native WebGPU procs"
OUTPUT_SOURCES WEBGPU_DAWN_NATIVE_PROC_GEN_SOURCES)
target_sources(betann PRIVATE ${WEBGPU_DAWN_NATIVE_PROC_GEN_SOURCES})
# Build tests.
if (BETANN_BUILD_TESTS)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG v1.15.2
EXCLUDE_FROM_ALL)
FetchContent_MakeAvailable(googletest)
add_executable(betann_tests tests/arange_tests.cc
tests/binary_tests.cc
tests/copy_tests.cc
tests/gemv_tests.cc
tests/matmul_tests.cc
tests/random_tests.cc
tests/reduce_tests.cc
tests/sort_tests.cc
tests/unary_tests.cc)
target_link_libraries(betann_tests PRIVATE betann
GTest::gtest_main
$<BUILD_INTERFACE:fmt::fmt-header-only>)
endif()
# Make the library installable.
install(TARGETS betann
EXPORT BetaNNTargets
FILE_SET HEADERS)
install(EXPORT BetaNNTargets
FILE BetaNN.cmake
DESTINATION share/cmake/betann)