forked from NVIDIA/thrust
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
159 lines (137 loc) · 6.27 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
# Create meta targets that build all tests for a single configuration:
foreach(thrust_target IN LISTS THRUST_TARGETS)
thrust_get_target_property(config_prefix ${thrust_target} PREFIX)
set(config_meta_target ${config_prefix}.tests)
add_custom_target(${config_meta_target})
add_dependencies(${config_prefix}.all ${config_meta_target})
endforeach()
# Update flags to reflect RDC options. See note in ThrustCudaConfig.cmake --
# these flag variables behave unintuitively:
if (THRUST_ENABLE_TESTS_WITH_RDC)
set(CMAKE_CUDA_FLAGS "${THRUST_CUDA_FLAGS_BASE} ${THRUST_CUDA_FLAGS_RDC}")
else()
set(CMAKE_CUDA_FLAGS "${THRUST_CUDA_FLAGS_BASE} ${THRUST_CUDA_FLAGS_NO_RDC}")
endif()
# Generate testing framework libraries:
add_subdirectory(unittest)
# Some tests only support certain host.device configurations. Use this macro to
# declare allowed configurations. If not specified, all host.device config are
# used.
set(restricted_tests)
macro(thrust_declare_test_restrictions test_name)
list(APPEND restricted_tests ${test_name})
list(APPEND ${test_name}_host.device_allowed ${ARGN})
endmacro()
# Async/future/event tests only support the CUDA backend:
thrust_declare_test_restrictions(async_copy CPP.CUDA OMP.CUDA TBB.CUDA)
thrust_declare_test_restrictions(async_for_each CPP.CUDA OMP.CUDA TBB.CUDA)
thrust_declare_test_restrictions(async_reduce CPP.CUDA OMP.CUDA TBB.CUDA)
thrust_declare_test_restrictions(async_reduce_into CPP.CUDA OMP.CUDA TBB.CUDA)
thrust_declare_test_restrictions(async_sort CPP.CUDA OMP.CUDA TBB.CUDA)
thrust_declare_test_restrictions(async_transform CPP.CUDA OMP.CUDA TBB.CUDA)
thrust_declare_test_restrictions(event CPP.CUDA OMP.CUDA TBB.CUDA)
thrust_declare_test_restrictions(future CPP.CUDA OMP.CUDA TBB.CUDA)
# This test is incompatible with TBB and OMP, since it requires special per-device
# handling to process exceptions in a device function, which is only implemented
# for CUDA.
thrust_declare_test_restrictions(unittest_static_assert CPP.CPP CPP.CUDA)
## thrust_add_test
#
# Add a test executable and register it with ctest.
#
# target_name_var: Variable name to overwrite with the name of the test
# target. Useful for post-processing target information per-backend.
# test_name: The name of the test minus "<config_prefix>.test." For example,
# testing/vector.cu will be "vector", and testing/cuda/copy.cu will be
# "cuda.copy".
# test_src: The source file that implements the test.
# thrust_target: The reference thrust target with configuration information.
#
function(thrust_add_test target_name_var test_name test_src thrust_target)
thrust_get_target_property(config_host ${thrust_target} HOST)
thrust_get_target_property(config_device ${thrust_target} DEVICE)
thrust_get_target_property(config_prefix ${thrust_target} PREFIX)
# Wrap the .cu file in .cpp for non-CUDA backends
if ("CUDA" STREQUAL "${config_device}")
set(real_test_src "${test_src}")
else()
thrust_wrap_cu_in_cpp(real_test_src "${test_src}" ${thrust_target})
endif()
# The actual name of the test's target:
set(test_target ${config_prefix}.test.${test_name})
set(${target_name_var} ${test_target} PARENT_SCOPE)
# Related target names:
set(config_framework_target ${config_prefix}.test.framework)
set(config_meta_target ${config_prefix}.tests)
set(test_meta_target thrust.all.test.${test_name})
add_executable(${test_target} "${real_test_src}")
target_link_libraries(${test_target} PRIVATE ${config_framework_target})
target_include_directories(${test_target} PRIVATE "${Thrust_SOURCE_DIR}/testing")
thrust_clone_target_properties(${test_target} ${thrust_target})
# Add to the active configuration's meta target
add_dependencies(${config_meta_target} ${test_target})
# Meta target that builds tests with this name for all configurations:
if (NOT TARGET ${test_meta_target})
add_custom_target(${test_meta_target})
endif()
add_dependencies(${test_meta_target} ${test_target})
add_test(NAME ${test_target}
COMMAND "${CMAKE_COMMAND}"
"-DTHRUST_BINARY=$<TARGET_FILE:${test_target}>"
"-DTHRUST_SOURCE=${Thrust_SOURCE_DIR}"
-P "${Thrust_SOURCE_DIR}/cmake/ThrustRunTest.cmake"
)
# Run OMP/TBB tests in serial. Multiple OMP processes will massively
# oversubscribe the machine with GCC's OMP, and we want to test these with
# the full CPU available to each unit test.
set(config_systems ${config_host} ${config_device})
if (("OMP" IN_LIST config_systems) OR ("TBB" IN_LIST config_systems))
set_tests_properties(${test_target} PROPERTIES RUN_SERIAL ON)
endif()
# Check for per-test script. Script will be included in the current scope
# to allow custom property modifications.
get_filename_component(test_cmake_script "${test_src}" NAME_WLE)
set(test_cmake_script "${CMAKE_CURRENT_LIST_DIR}/${test_cmake_script}.cmake")
# Use a glob so we can detect if this changes:
file(GLOB test_cmake_script
RELATIVE "${CMAKE_CURRENT_LIST_DIR}"
CONFIGURE_DEPENDS
"${test_cmake_script}"
)
if (test_cmake_script) # Will be non-empty only if the script exists
include("${test_cmake_script}")
endif()
endfunction()
file(GLOB test_srcs
RELATIVE "${CMAKE_CURRENT_LIST_DIR}"
CONFIGURE_DEPENDS
*.cu *.cpp
)
# Add common tests to all configs:
foreach(thrust_target IN LISTS THRUST_TARGETS)
thrust_get_target_property(config_host ${thrust_target} HOST)
thrust_get_target_property(config_device ${thrust_target} DEVICE)
thrust_get_target_property(config_prefix ${thrust_target} PREFIX)
foreach(test_src IN LISTS test_srcs)
get_filename_component(test_name "${test_src}" NAME_WLE)
# Is this test restricted to only certain host/device combinations?
if(${test_name} IN_LIST restricted_tests)
# Is the current host/device combination supported?
if (NOT "${config_host}.${config_device}" IN_LIST
${test_name}_host.device_allowed)
continue()
endif()
endif()
thrust_add_test(test_target ${test_name} "${test_src}" ${thrust_target})
if (THRUST_ENABLE_TESTS_WITH_RDC AND ("CUDA" STREQUAL "${config_device}"))
thrust_enable_rdc_for_cuda_target(${test_target})
endif()
endforeach()
endforeach()
# Add specialized tests:
add_subdirectory(async)
add_subdirectory(cmake)
add_subdirectory(cpp)
add_subdirectory(cuda)
add_subdirectory(omp)
add_subdirectory(regression)