forked from halide/Halide
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
216 lines (179 loc) · 9.64 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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
find_package(OpenMP)
configure_file(images/gray.png images/gray.png COPYONLY)
configure_file(images/rgb.png images/rgb.png COPYONLY)
function(add_tutorial source_file)
set(options WITH_IMAGE_IO WITH_OPENMP)
set(oneValueArgs)
set(multiValueArgs SRCS GROUPS)
cmake_parse_arguments(args "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
cmake_path(GET source_file STEM name)
add_executable("${name}" "${source_file}")
target_link_libraries("${name}" PRIVATE Halide::Halide Halide::Tools)
target_compile_options(${name} PRIVATE "$<$<CXX_COMPILER_ID:GNU>:-Wno-unused-but-set-variable>")
add_test(NAME tutorial_${name} COMMAND ${name})
set_tests_properties(tutorial_${name}
PROPERTIES
ENVIRONMENT "HL_TARGET=${Halide_TARGET};HL_JIT_TARGET=${Halide_TARGET}"
LABELS "tutorial;${args_GROUPS}")
if (args_WITH_IMAGE_IO)
target_link_libraries(${name} PRIVATE Halide::ImageIO)
endif ()
if (args_WITH_OPENMP)
if (TARGET OpenMP::OpenMP_CXX)
target_link_libraries(${name} PRIVATE OpenMP::OpenMP_CXX)
else ()
# Compile anyway but suppress warnings about unrecognised pragmas
target_compile_options("${name}"
PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:/Wd4068>
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wno-unknown-pragmas>)
endif ()
endif ()
endfunction()
# Declare tutorials
add_tutorial(lesson_01_basics.cpp)
add_tutorial(lesson_02_input_image.cpp WITH_IMAGE_IO)
add_tutorial(lesson_03_debugging_1.cpp)
add_tutorial(lesson_04_debugging_2.cpp GROUPS multithreaded)
add_tutorial(lesson_05_scheduling_1.cpp GROUPS multithreaded)
add_tutorial(lesson_06_realizing_over_shifted_domains.cpp)
add_tutorial(lesson_07_multi_stage_pipelines.cpp WITH_IMAGE_IO)
add_tutorial(lesson_08_scheduling_2.cpp WITH_IMAGE_IO WITH_OPENMP GROUPS multithreaded)
add_tutorial(lesson_09_update_definitions.cpp WITH_IMAGE_IO WITH_OPENMP GROUPS multithreaded)
if ("NVPTX" IN_LIST Halide_LLVM_COMPONENTS)
if (Halide_TARGET MATCHES "wasm")
# TODO: Requires custom build rules to work under wasm.
message(WARNING "Not all tutorials build under WASM.")
else ()
# Tutorial 10 requires that we build generation code, then run it,
# so we can build the final executable.
add_tutorial(lesson_10_aot_compilation_generate.cpp)
set(FILTER_LIB "lesson_10_halide${CMAKE_STATIC_LIBRARY_SUFFIX}")
add_custom_command(OUTPUT lesson_10_halide.h "${FILTER_LIB}"
DEPENDS lesson_10_aot_compilation_generate
COMMAND lesson_10_aot_compilation_generate
VERBATIM)
add_custom_target(exec_lesson_10_aot_compilation_generate
DEPENDS lesson_10_halide.h "${FILTER_LIB}")
# This will be linked with the code generated by
# the generator (lesson_10_aot_compilation_generate)
add_executable(lesson_10_aot_compilation_run lesson_10_aot_compilation_run.cpp)
add_dependencies(lesson_10_aot_compilation_run exec_lesson_10_aot_compilation_generate)
target_link_libraries(lesson_10_aot_compilation_run PRIVATE
"${CMAKE_CURRENT_BINARY_DIR}/${FILTER_LIB}"
Halide::Runtime
Threads::Threads
${CMAKE_DL_LIBS})
# Undocumented function in HalideGeneratorHelpers. Do not call in external code.
# Users of the AOT functions (as opposed to Generators) should link to the relevant
# GPU libraries manually.
_Halide_target_link_gpu_libs(lesson_10_aot_compilation_run PRIVATE ${Halide_TARGET})
target_include_directories(lesson_10_aot_compilation_run PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
add_test(NAME tutorial_lesson_10_aot_compilation_run COMMAND lesson_10_aot_compilation_run)
set_tests_properties(tutorial_lesson_10_aot_compilation_run PROPERTIES LABELS "tutorial;multithreaded")
endif ()
endif ()
add_tutorial(lesson_11_cross_compilation.cpp)
add_tutorial(lesson_12_using_the_gpu.cpp WITH_IMAGE_IO GROUPS multithreaded)
add_tutorial(lesson_13_tuples.cpp)
add_tutorial(lesson_14_types.cpp)
# Lesson 15
add_executable(lesson_15_generate lesson_15_generators.cpp)
target_link_libraries(lesson_15_generate PRIVATE Halide::Generator)
## Hack to build the libraries
add_custom_target(lesson_15_targets)
set(LESSON_15_EXPECTED_FILES "")
##
add_halide_library(my_first_generator_win32 FROM lesson_15_generate
GENERATOR my_first_generator
TARGETS x86-32-windows)
list(APPEND LESSON_15_EXPECTED_FILES $<TARGET_FILE:my_first_generator_win32> my_first_generator_win32.h)
add_dependencies(lesson_15_targets my_first_generator_win32)
##
add_halide_library(my_first_generator FROM lesson_15_generate
STMT my_first_generator_STMT)
list(APPEND LESSON_15_EXPECTED_FILES ${my_first_generator_STMT})
add_dependencies(lesson_15_targets my_first_generator)
##
add_halide_library(my_second_generator_1 FROM lesson_15_generate
GENERATOR my_second_generator
PARAMS parallel=false scale=3.0 rotation=ccw output.type=uint16)
add_halide_library(my_second_generator_2 FROM lesson_15_generate
GENERATOR my_second_generator
PARAMS scale=9.0 rotation=ccw output.type=float32)
add_halide_library(my_second_generator_3 FROM lesson_15_generate
GENERATOR my_second_generator
PARAMS parallel=false output.type=float64)
list(APPEND LESSON_15_EXPECTED_FILES
$<TARGET_FILE:my_second_generator_1> my_second_generator_1.h
$<TARGET_FILE:my_second_generator_2> my_second_generator_2.h
$<TARGET_FILE:my_second_generator_3> my_second_generator_3.h)
add_dependencies(lesson_15_targets
my_second_generator_1
my_second_generator_2
my_second_generator_3)
##
add_test(NAME tutorial_lesson_15_build_gens
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target lesson_15_targets --config $<CONFIG>)
set_tests_properties(tutorial_lesson_15_build_gens PROPERTIES
LABELS tutorial
FIXTURES_SETUP tutorial_lesson_15)
add_test(NAME tutorial_lesson_15_check_files
COMMAND ${CMAKE_COMMAND}
"-DFILES_TO_CHECK=$<JOIN:${LESSON_15_EXPECTED_FILES},$<SEMICOLON>>"
-P "${Halide_SOURCE_DIR}/cmake/CheckFilesExist.cmake")
set_tests_properties(tutorial_lesson_15_check_files PROPERTIES
LABELS tutorial
FIXTURES_REQUIRED tutorial_lesson_15)
# Lesson 16
if (Halide_TARGET MATCHES "wasm")
# TODO: Requires custom build rules to work under wasm
message(WARNING "Not all tutorials build under WASM.")
else ()
add_executable(lesson_16_rgb_generate lesson_16_rgb_generate.cpp)
target_link_libraries(lesson_16_rgb_generate PRIVATE Halide::Generator)
add_halide_library(brighten_planar FROM lesson_16_rgb_generate
TARGETS cmake GENERATOR brighten PARAMS layout=planar)
add_halide_library(brighten_interleaved FROM lesson_16_rgb_generate
TARGETS cmake GENERATOR brighten PARAMS layout=interleaved)
add_halide_library(brighten_either FROM lesson_16_rgb_generate
TARGETS cmake GENERATOR brighten PARAMS layout=either)
add_halide_library(brighten_specialized FROM lesson_16_rgb_generate
TARGETS cmake GENERATOR brighten PARAMS layout=specialized)
add_executable(lesson_16_rgb_run lesson_16_rgb_run.cpp)
target_link_libraries(lesson_16_rgb_run PRIVATE
brighten_planar brighten_interleaved brighten_either brighten_specialized
Halide::ImageIO
Halide::Tools)
add_test(NAME tutorial_lesson_16_rgb_run COMMAND lesson_16_rgb_run)
set_tests_properties(tutorial_lesson_16_rgb_run PROPERTIES LABELS tutorial)
endif ()
# Lessons 17 - 20
add_tutorial(lesson_17_predicated_rdom.cpp)
add_tutorial(lesson_18_parallel_associative_reductions.cpp GROUPS multithreaded)
add_tutorial(lesson_19_wrapper_funcs.cpp)
add_tutorial(lesson_20_cloning_funcs.cpp)
# Lesson 21
if (TARGET Halide::Mullapudi2016)
add_executable(lesson_21_auto_scheduler_generate lesson_21_auto_scheduler_generate.cpp)
target_link_libraries(lesson_21_auto_scheduler_generate PRIVATE Halide::Generator)
add_halide_library(auto_schedule_false FROM lesson_21_auto_scheduler_generate
TARGETS cmake
GENERATOR auto_schedule_gen)
add_halide_library(auto_schedule_true FROM lesson_21_auto_scheduler_generate
TARGETS cmake
AUTOSCHEDULER Halide::Mullapudi2016
GENERATOR auto_schedule_gen
PARAMS autoscheduler.parallelism=32
autoscheduler.last_level_cache_size=16777216
autoscheduler.balance=40)
add_executable(lesson_21_auto_scheduler_run lesson_21_auto_scheduler_run.cpp)
target_link_libraries(lesson_21_auto_scheduler_run PRIVATE
auto_schedule_false auto_schedule_true Halide::Tools)
add_test(NAME tutorial_lesson_21_auto_scheduler_run COMMAND lesson_21_auto_scheduler_run)
set_tests_properties(tutorial_lesson_21_auto_scheduler_run PROPERTIES LABELS "tutorial;multithreaded")
endif ()
# Lessons 22-24
add_tutorial(lesson_22_jit_performance.cpp)
add_tutorial(lesson_23_serialization.cpp WITH_IMAGE_IO)
add_tutorial(lesson_24_async.cpp)