Skip to content

Commit ec94d4c

Browse files
griwesbrycelelbach
authored andcommitted
Further CMake work.
* Rebase. * Build examples. * Fix RDC test names. * Fix some mistakes in MR. * Make tests compile for device backends other than CUDA.
1 parent c82bb40 commit ec94d4c

7 files changed

Lines changed: 291 additions & 55 deletions

File tree

CMakeLists.txt

Lines changed: 245 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,36 +18,60 @@ set(
1818
)
1919
message(STATUS "Thrust Version: ${THRUST_VERSION_STR}")
2020

21-
set(THRUST_HOST_BACKEND_OPTIONS CPP OMP TBB)
22-
set(THRUST_HOST_BACKEND CPP CACHE STRING "The device backend to target.")
21+
set(THRUST_HOST_SYSTEM_OPTIONS CPP OMP TBB)
22+
set(THRUST_HOST_SYSTEM CPP CACHE STRING "The device backend to target.")
2323
set_property(
24-
CACHE THRUST_HOST_BACKEND
25-
PROPERTY STRINGS ${THRUST_HOST_BACKEND_OPTIONS}
24+
CACHE THRUST_HOST_SYSTEM
25+
PROPERTY STRINGS ${THRUST_HOST_SYSTEM_OPTIONS}
2626
)
27-
if (NOT THRUST_HOST_BACKEND IN_LIST THRUST_HOST_BACKEND_OPTIONS)
27+
if (NOT THRUST_HOST_SYSTEM IN_LIST THRUST_HOST_SYSTEM_OPTIONS)
2828
message(
2929
FATAL_ERROR
30-
"THRUST_HOST_BACKEND must be one of ${THRUST_HOST_BACKEND_OPTIONS}"
30+
"THRUST_HOST_SYSTEM must be one of ${THRUST_HOST_SYSTEM_OPTIONS}"
3131
)
3232
endif ()
3333

34-
set(THRUST_DEVICE_BACKEND_OPTIONS CUDA CPP OMP TBB)
35-
set(THRUST_DEVICE_BACKEND CUDA CACHE STRING "The device backend to target.")
34+
add_definitions(-DTHRUST_HOST_SYSTEM=THRUST_HOST_SYSTEM_${THRUST_HOST_SYSTEM})
35+
36+
set(THRUST_DEVICE_SYSTEM_OPTIONS CUDA CPP OMP TBB)
37+
set(THRUST_DEVICE_SYSTEM CUDA CACHE STRING "The device backend to target.")
3638
set_property(
37-
CACHE THRUST_DEVICE_BACKEND
38-
PROPERTY STRINGS ${THRUST_DEVICE_BACKEND_OPTIONS}
39+
CACHE THRUST_DEVICE_SYSTEM
40+
PROPERTY STRINGS ${THRUST_DEVICE_SYSTEM_OPTIONS}
3941
)
40-
if (NOT THRUST_DEVICE_BACKEND IN_LIST THRUST_DEVICE_BACKEND_OPTIONS)
42+
if (NOT THRUST_DEVICE_SYSTEM IN_LIST THRUST_DEVICE_SYSTEM_OPTIONS)
4143
message(
4244
FATAL_ERROR
43-
"THRUST_DEVICE_BACKEND must be one of ${THRUST_DEVICE_BACKEND_OPTIONS}"
45+
"THRUST_DEVICE_SYSTEM must be one of ${THRUST_DEVICE_SYSTEM_OPTIONS}"
4446
)
4547
endif ()
4648

47-
if ("CUDA" STREQUAL "${THRUST_DEVICE_BACKEND}")
49+
add_definitions(-DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_${THRUST_DEVICE_SYSTEM})
50+
51+
if ("CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM}")
4852
enable_language(CUDA)
4953
endif ()
5054

55+
if ("OMP" STREQUAL "${THRUST_DEVICE_SYSTEM}")
56+
find_package(OpenMP REQUIRED)
57+
if (OPENMP_FOUND)
58+
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
59+
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
60+
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
61+
endif()
62+
endif ()
63+
64+
if ("TBB" STREQUAL "${THRUST_DEVICE_SYSTEM}")
65+
find_package(PkgConfig REQUIRED)
66+
pkg_check_modules(TBB tbb REQUIRED)
67+
if (TBB_FOUND)
68+
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TDD_CFLAGS}")
69+
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TDD_CFLAGS}")
70+
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${TBB_LD_FLAGS}")
71+
set (THRUST_ADDITIONAL_LIBRARIES "${TBB_LIBRARIES}")
72+
endif ()
73+
endif ()
74+
5175
if ("MSVC" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
5276
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 1700)
5377
message(FATAL_ERROR "This version of MSVC no longer supported.")
@@ -75,6 +99,8 @@ if ("MSVC" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
7599

76100
# Disable warning about applying unary operator- to unsigned type.
77101
append_option_if_available(CXX "/wd4146" THRUST_OPTIONS_WARNINGS)
102+
103+
set(THRUST_TREAT_FILE_AS_CXX "/TP")
78104
else ()
79105
append_option_if_available(CXX "-Werror" THRUST_OPTIONS_WARNINGS)
80106
append_option_if_available(CXX "-Wall" THRUST_O:TIONS_WARNINGS)
@@ -86,6 +112,8 @@ else ()
86112
append_option_if_available(CXX "-Wno-long-long" THRUST_OPTIONS_WARNINGS)
87113
append_option_if_available(CXX "-Wno-variadic-macros" THRUST_OPTIONS_WARNINGS)
88114
append_option_if_available(CXX "-Wno-unused-function" THRUST_OPTIONS_WARNINGS)
115+
116+
set(THRUST_TREAT_FILE_AS_CXX "-x c++")
89117
endif ()
90118

91119
if ("GNU" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
@@ -116,24 +144,35 @@ if (("Clang" STREQUAL "${CMAKE_CXX_COMPILER_ID}") OR
116144
# (and thus has unused parameters) when you aren't using it.
117145
append_option_if_available(CXX "-Wno-unused-parameters" THRUST_OPTIONS_WARNINGS)
118146
endif ()
119-
147+
120148
if ("Clang" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
121149
# -Wunneeded-internal-declaration misfires in the unit test framework
122150
# on older versions of Clang.
123151
append_option_if_available(CXX "-Wno-unneeded-internal-declaration" THRUST_OPTIONS_WARNINGS)
124152
endif ()
125-
126-
append_option_if_available(CUDA "-rdc=true" THRUST_OPTIONS_RDC)
153+
154+
155+
if ("CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM}")
156+
append_option_if_available(CUDA "-rdc=true" THRUST_OPTIONS_RDC)
157+
endif ()
127158

128159
set(THRUST_OPTIONS_DEBUG ${THRUST_OPTIONS_WARNINGS})
129160
set(THRUST_OPTIONS_RELEASE ${THRUST_OPTIONS_WARNINGS})
130161

131162
include(CTest)
132163
enable_testing()
133164

165+
# Handle tests
166+
134167
list(APPEND THRUST_TESTFRAMEWORK_FILES testing/unittest/testframework.cu)
135-
if ("CUDA" STREQUAL "${THRUST_DEVICE_BACKEND}")
168+
if ("CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM}")
136169
list(APPEND THRUST_TESTFRAMEWORK_FILES testing/unittest/cuda/testframework.cu)
170+
else ()
171+
# when CUDA is disabled, explain to CMake that testframework.cu is actually a C++ file
172+
set_source_files_properties(testing/unittest/testframework.cu
173+
PROPERTIES
174+
LANGUAGE CXX
175+
COMPILE_FLAGS "${THRUST_TREAT_FILE_AS_CXX}")
137176
endif ()
138177

139178
add_library(thrust_testframework STATIC ${THRUST_TESTFRAMEWORK_FILES})
@@ -146,9 +185,9 @@ target_include_directories(
146185
list(APPEND THRUST_TEST_GLOBS testing/*.cu)
147186
list(APPEND THRUST_TEST_GLOBS testing/*.cpp)
148187

149-
if ("CUDA" STREQUAL "${THRUST_DEVICE_BACKEND}")
188+
if ("CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM}")
150189
list(APPEND THRUST_TEST_GLOBS testing/cuda/*.cu)
151-
elseif ("OMP" STREQUAL "${THRUST_DEVICE_BACKEND}")
190+
elseif ("OMP" STREQUAL "${THRUST_DEVICE_SYSTEM}")
152191
list(APPEND THRUST_TEST_GLOBS testing/omp/*.cu)
153192
list(APPEND THRUST_TEST_GLOBS testing/omp/*.cpp)
154193
endif ()
@@ -159,62 +198,229 @@ if (CMAKE_VERSION VERSION_LESS 3.12)
159198
RELATIVE ${PROJECT_SOURCE_DIR}/testing
160199
${THRUST_TEST_GLOBS}
161200
CONFIGURE_DEPENDS
162-
)
201+
)
163202
else ()
164203
file(
165204
GLOB THRUST_TESTS
166205
RELATIVE ${PROJECT_SOURCE_DIR}/testing
167206
${THRUST_TEST_GLOBS}
168-
)
207+
)
169208
endif ()
170209

210+
# list of tests that aren't implemented for all backends, but are implemented for CUDA
211+
set(THRUST_PARTIALLY_IMPLEMENTED_CUDA
212+
async_copy
213+
async_for_each
214+
async_reduce
215+
async_reduce_into
216+
async_sort
217+
async_transform
218+
event
219+
future
220+
)
221+
222+
# list of tests that aren't implemented for all backends, but are implemented for CPP
223+
set(THRUST_PARTIALLY_IMPLEMENTED_CPP
224+
)
225+
226+
# list of tests that aren't implemented for all backends, but are implemented for TBB
227+
set(THRUST_PARTIALLY_IMPLEMENTED_TBB
228+
)
229+
230+
# list of tests that aren't implemented for all backends, but are implemented for OMP
231+
set(THRUST_PARTIALLY_IMPLEMENTED_OMP
232+
)
233+
234+
# list of all partially implemented tests
235+
set(THRUST_PARTIALLY_IMPLEMENTED
236+
${THRUST_PARTIALLY_IMPLEMENTED_CUDA}
237+
${THRUST_PARTIALLY_IMPLEMENTED_CPP}
238+
${THRUST_PARTIALLY_IMPLEMENTED_TBB}
239+
${THRUST_PARTIALLY_IMPLEMENTED_OMP}
240+
)
241+
242+
list(REMOVE_DUPLICATES THRUST_PARTIALLY_IMPLEMENTED)
243+
171244
foreach (THRUST_TEST_SOURCE IN LISTS THRUST_TESTS)
172245
# TODO: Per-test flags.
173246

247+
set(THRUST_TEST_CREATION_ADDITIONAL)
248+
set(THRUST_TEST_ADD_TO_CTEST ON)
249+
174250
get_filename_component(THRUST_TEST_CATEGORY ${THRUST_TEST_SOURCE} DIRECTORY)
175251
if (NOT ("" STREQUAL "${THRUST_TEST_CATEGORY}"))
176252
set(THRUST_TEST_CATEGORY "${THRUST_TEST_CATEGORY}.")
177-
endif ()
253+
endif ()
178254

179-
get_filename_component(THRUST_TEST ${THRUST_TEST_SOURCE} NAME_WE)
255+
get_filename_component(THRUST_TEST_NAME ${THRUST_TEST_SOURCE} NAME_WE)
256+
257+
if ("${THRUST_TEST_NAME}" IN_LIST THRUST_PARTIALLY_IMPLEMENTED)
258+
# this test is partially implemented on _some_ backends
259+
if (NOT "${THRUST_TEST_NAME}" IN_LIST THRUST_PARTIALLY_IMPLEMENTED_${THRUST_DEVICE_SYSTEM})
260+
# but not on the selected one
261+
set(THRUST_TEST_CREATION_ADDITIONAL EXCLUDE_FROM_ALL)
262+
set(THRUST_TEST_ADD_TO_CTEST OFF)
263+
endif ()
264+
endif ()
180265

181-
set(THRUST_TEST "thrust.test.${THRUST_TEST_CATEGORY}${THRUST_TEST}")
182-
set(THRUST_TEST_RDC "thrust.test.${THRUST_TEST_CATEGORY}rdc.${THRUST_TEST}")
266+
set(THRUST_TEST "thrust.test.${THRUST_TEST_CATEGORY}${THRUST_TEST_NAME}")
267+
268+
if (NOT "CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM}")
269+
# test files are generally .cu; if CUDA is not enabled, CMake doesn't know what to
270+
# do with them. but since they are pretty much just C++, we can compile them with
271+
# non-nvcc C++ compilers... but we need to tell CMake that they are, in fact, just C++.
272+
set_source_files_properties(${PROJECT_SOURCE_DIR}/testing/${THRUST_TEST_SOURCE}
273+
PROPERTIES
274+
LANGUAGE CXX
275+
COMPILE_FLAGS "${THRUST_TREAT_FILE_AS_CXX}")
276+
endif ()
183277

184278
add_executable(
185279
${THRUST_TEST}
186-
${PROJECT_SOURCE_DIR}/testing/${THRUST_TEST_SOURCE}
187-
)
280+
${THRUST_TEST_CREATION_ADDITIONAL}
188281

189-
add_executable(
190-
${THRUST_TEST_RDC}
191282
${PROJECT_SOURCE_DIR}/testing/${THRUST_TEST_SOURCE}
192283
)
193284

194285
target_compile_options(${THRUST_TEST}
195286
PRIVATE "$<$<CONFIG:DEBUG>:${THRUST_OPTIONS_DEBUG}>"
196287
"$<$<CONFIG:RELEASE>:${THRUST_OPTIONS_RELEASE}>")
197288

198-
target_compile_options(${THRUST_TEST_RDC}
199-
PRIVATE "$<$<CONFIG:DEBUG>:${THRUST_OPTIONS_DEBUG} ${THRUST_OPTIONS_RDC}>"
200-
"$<$<CONFIG:RELEASE>:${THRUST_OPTIONS_RELEASE} ${THRUST_OPTIONS_RDC}>")
201-
202289
target_include_directories(
203290
${THRUST_TEST}
204291
PUBLIC ${PROJECT_SOURCE_DIR}
205292
PRIVATE ${PROJECT_SOURCE_DIR}/testing
206293
)
207294

295+
target_link_libraries(${THRUST_TEST}
296+
thrust_testframework
297+
${THRUST_ADDITIONAL_LIBRARIES})
298+
299+
if (THRUST_TEST_ADD_TO_CTEST)
300+
add_test(${THRUST_TEST} ${THRUST_TEST})
301+
endif ()
302+
303+
if ("CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM}")
304+
set(THRUST_TEST_RDC "thrust.test.${THRUST_TEST_CATEGORY}rdc.${THRUST_TEST_NAME}")
305+
306+
add_executable(
307+
${THRUST_TEST_RDC}
308+
${THRUST_TEST_CREATION_ADDITIONAL}
309+
310+
${PROJECT_SOURCE_DIR}/testing/${THRUST_TEST_SOURCE}
311+
)
312+
313+
target_compile_options(${THRUST_TEST_RDC}
314+
PRIVATE "$<$<CONFIG:DEBUG>:${THRUST_OPTIONS_DEBUG} ${THRUST_OPTIONS_RDC}>"
315+
"$<$<CONFIG:RELEASE>:${THRUST_OPTIONS_RELEASE} ${THRUST_OPTIONS_RDC}>")
316+
317+
target_include_directories(
318+
${THRUST_TEST_RDC}
319+
PUBLIC ${PROJECT_SOURCE_DIR}
320+
PRIVATE ${PROJECT_SOURCE_DIR}/testing
321+
)
322+
323+
target_link_libraries(${THRUST_TEST_RDC}
324+
thrust_testframework
325+
${THRUST_ADDITIONAL_LIBRARIES})
326+
327+
if (THRUST_TEST_ADD_TO_CTEST)
328+
add_test(${THRUST_TEST_RDC} ${THRUST_TEST_RDC})
329+
endif ()
330+
endif ()
331+
endforeach ()
332+
333+
# Handle examples
334+
335+
list(APPEND THRUST_EXAMPLE_GLOBS examples/*.cu)
336+
list(APPEND THRUST_EXAMPLE_GLOBS examples/*.cpp)
337+
338+
if ("CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM}")
339+
list(APPEND THRUST_EXAMPLE_GLOBS examples/cuda/*.cu)
340+
elseif ("OMP" STREQUAL "${THRUST_DEVICE_SYSTEM}")
341+
list(APPEND THRUST_EXAMPLE_GLOBS examples/omp/*.cu)
342+
list(APPEND THRUST_EXAMPLE_GLOBS examples/omp/*.cpp)
343+
endif ()
344+
345+
if (CMAKE_VERSION VERSION_LESS 3.12)
346+
file(
347+
GLOB THRUST_EXAMPLES
348+
RELATIVE ${PROJECT_SOURCE_DIR}/examples
349+
${THRUST_EXAMPLE_GLOBS}
350+
CONFIGURE_DEPENDS
351+
)
352+
else ()
353+
file(
354+
GLOB THRUST_EXAMPLES
355+
RELATIVE ${PROJECT_SOURCE_DIR}/examples
356+
${THRUST_EXAMPLE_GLOBS}
357+
)
358+
endif ()
359+
360+
foreach (THRUST_EXAMPLE_SOURCE IN LISTS THRUST_EXAMPLES)
361+
# TODO: Per-example flags.
362+
363+
get_filename_component(THRUST_EXAMPLE_CATEGORY ${THRUST_EXAMPLE_SOURCE} DIRECTORY)
364+
if (NOT ("" STREQUAL "${THRUST_EXAMPLE_CATEGORY}"))
365+
set(THRUST_EXAMPLE_CATEGORY "${THRUST_EXAMPLE_CATEGORY}.")
366+
endif ()
367+
368+
get_filename_component(THRUST_EXAMPLE_NAME ${THRUST_EXAMPLE_SOURCE} NAME_WE)
369+
370+
set(THRUST_EXAMPLE "thrust.example.${THRUST_EXAMPLE_CATEGORY}${THRUST_EXAMPLE_NAME}")
371+
372+
if (NOT "CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM}")
373+
# example files are generally .cu; if CUDA is not enabled, CMake doesn't know what to
374+
# do with them. but since they are pretty much just C++, we can compile them with
375+
# non-nvcc C++ compilers... but we need to tell CMake that they are, in fact, just C++.
376+
set_source_files_properties(${PROJECT_SOURCE_DIR}/examples/${THRUST_EXAMPLE_SOURCE}
377+
PROPERTIES
378+
LANGUAGE CXX
379+
COMPILE_FLAGS "${THRUST_TREAT_FILE_AS_CXX}")
380+
endif ()
381+
382+
add_executable(
383+
${THRUST_EXAMPLE}
384+
${PROJECT_SOURCE_DIR}/examples/${THRUST_EXAMPLE_SOURCE}
385+
)
386+
387+
target_compile_options(${THRUST_EXAMPLE}
388+
PRIVATE "$<$<CONFIG:DEBUG>:${THRUST_OPTIONS_DEBUG}>"
389+
"$<$<CONFIG:RELEASE>:${THRUST_OPTIONS_RELEASE}>")
390+
208391
target_include_directories(
209-
${THRUST_TEST_RDC}
392+
${THRUST_EXAMPLE}
210393
PUBLIC ${PROJECT_SOURCE_DIR}
211-
PRIVATE ${PROJECT_SOURCE_DIR}/testing
394+
PRIVATE ${PROJECT_SOURCE_DIR}/examples
212395
)
213396

214-
target_link_libraries(${THRUST_TEST} thrust_testframework)
215-
target_link_libraries(${THRUST_TEST_RDC} thrust_testframework)
397+
target_link_libraries(${THRUST_EXAMPLE}
398+
${THRUST_ADDITIONAL_LIBRARIES})
399+
400+
add_test(${THRUST_EXAMPLE} ${THRUST_EXAMPLE})
401+
402+
if ("CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM}")
403+
set(THRUST_EXAMPLE_RDC "thrust.example.${THRUST_EXAMPLE_CATEGORY}rdc.${THRUST_EXAMPLE_NAME}")
216404

217-
add_test(run.${THRUST_TEST} ${THRUST_TEST})
218-
add_test(run.${THRUST_TEST_RDC} ${THRUST_TEST_RDC})
405+
add_executable(
406+
${THRUST_EXAMPLE_RDC}
407+
${PROJECT_SOURCE_DIR}/examples/${THRUST_EXAMPLE_SOURCE}
408+
)
409+
410+
target_compile_options(${THRUST_EXAMPLE_RDC}
411+
PRIVATE "$<$<CONFIG:DEBUG>:${THRUST_OPTIONS_DEBUG} ${THRUST_OPTIONS_RDC}>"
412+
"$<$<CONFIG:RELEASE>:${THRUST_OPTIONS_RELEASE} ${THRUST_OPTIONS_RDC}>")
413+
414+
target_include_directories(
415+
${THRUST_EXAMPLE_RDC}
416+
PUBLIC ${PROJECT_SOURCE_DIR}
417+
PRIVATE ${PROJECT_SOURCE_DIR}/examples
418+
)
419+
420+
target_link_libraries(${THRUST_EXAMPLE_RDC}
421+
${THRUST_ADDITIONAL_LIBRARIES})
422+
423+
add_test(${THRUST_EXAMPLE_RDC} ${THRUST_EXAMPLE_RDC})
424+
endif ()
219425
endforeach ()
220426

0 commit comments

Comments
 (0)