1818)
1919message (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." )
2323set_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 )
3232endif ()
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." )
3638set_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 )
4547endif ()
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 )
4953endif ()
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+
5175if ("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" )
78104else ()
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++" )
89117endif ()
90118
91119if ("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 )
118146endif ()
119-
147+
120148if ("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 )
124152endif ()
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
128159set (THRUST_OPTIONS_DEBUG ${THRUST_OPTIONS_WARNINGS} )
129160set (THRUST_OPTIONS_RELEASE ${THRUST_OPTIONS_WARNINGS} )
130161
131162include (CTest )
132163enable_testing ()
133164
165+ # Handle tests
166+
134167list (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} " )
137176endif ()
138177
139178add_library (thrust_testframework STATIC ${THRUST_TESTFRAMEWORK_FILES} )
@@ -146,9 +185,9 @@ target_include_directories(
146185list (APPEND THRUST_TEST_GLOBS testing/*.cu)
147186list (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)
154193endif ()
@@ -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+ )
163202else ()
164203 file (
165204 GLOB THRUST_TESTS
166205 RELATIVE ${PROJECT_SOURCE_DIR} /testing
167206 ${THRUST_TEST_GLOBS}
168- )
207+ )
169208endif ()
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+
171244foreach (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 ()
219425endforeach ()
220426
0 commit comments