|
# The async tests perform a large amount of codegen, making them expensive to |
|
# build and test. To keep compilation and runtimes manageable, the tests are |
|
# broken up into many files per algorithm to enable parallelism during |
|
# compilation and testing. The structure of these test directories are: |
|
# |
|
# thrust/testing/async/<algorithm_name>/<unit_test>.cu |
|
# |
|
# These generate executables and CTest tests named |
|
# ${config_prefix}.test.async.<algorithm_name>.<unit_test>. |
|
|
|
# The async tests only support CUDA enabled configs. Create a list of valid |
|
# thrust targets: |
|
set(cuda_configs) |
|
foreach(thrust_target IN LISTS THRUST_TARGETS) |
|
thrust_get_target_property(config_device ${thrust_target} DEVICE) |
|
if (config_device STREQUAL CUDA) |
|
list(APPEND cuda_configs ${thrust_target}) |
|
endif() |
|
endforeach() |
|
|
|
list(LENGTH cuda_configs num_cuda_configs) |
|
if (num_cuda_configs EQUAL 0) |
|
return() # No valid configs found, nothing to do. |
|
endif() |
|
|
|
# Process a single algorithm directory, adding all .cu/cpp files as tests for |
|
# each valid backend. algo_name is the name of the subdir (<algorithm_name> |
|
# above) and is used for naming the executable/targets. |
|
function(thrust_add_async_test_dir algo_name) |
|
file(GLOB test_srcs |
|
RELATIVE "${CMAKE_CURRENT_LIST_DIR}" |
|
CONFIGURE_DEPENDS |
|
"${algo_name}/*.cu" |
|
"${algo_name}/*.cpp" |
|
) |
|
|
|
# Per-algorithm, all-config metatarget: thrust.all.test.async.[algo].all |
|
set(algo_meta_target thrust.all.test.async.${algo_name}.all) |
|
add_custom_target(${algo_meta_target}) |
|
|
|
foreach(thrust_target IN LISTS cuda_configs) |
|
thrust_get_target_property(config_prefix ${thrust_target} PREFIX) |
|
|
|
# Per-algorithm, per-config metatarget: thrust.[config].test.async.[algo].all |
|
set(algo_config_meta_target ${config_prefix}.test.async.${algo_name}.all) |
|
add_custom_target(${algo_config_meta_target}) |
|
add_dependencies(${algo_meta_target} ${algo_config_meta_target}) |
|
|
|
foreach(test_src IN LISTS test_srcs) |
|
get_filename_component(test_name "${test_src}" NAME_WLE) |
|
string(PREPEND test_name async.${algo_name}.) |
|
|
|
thrust_add_test(test_target ${test_name} "${test_src}" ${thrust_target}) |
|
if(THRUST_ENABLE_TESTS_WITH_RDC) |
|
thrust_enable_rdc_for_cuda_target(${test_target}) |
|
endif() |
|
|
|
add_dependencies(${algo_config_meta_target} ${test_target}) |
|
endforeach() |
|
endforeach() |
|
endfunction() |
|
|
|
# Grab all algorithm subdirectories: |
|
set(test_dirs) |
|
file(GLOB contents |
|
CONFIGURE_DEPENDS |
|
"${CMAKE_CURRENT_LIST_DIR}/*" |
|
) |
|
|
|
foreach(test_dir IN LISTS contents) |
|
if(IS_DIRECTORY "${test_dir}") |
|
list(APPEND test_dirs "${test_dir}") |
|
endif() |
|
endforeach() |
|
|
|
# Process all test dirs: |
|
foreach(test_dir IN LISTS test_dirs) |
|
get_filename_component(algo_name "${test_dir}" NAME_WLE) |
|
thrust_add_async_test_dir(${algo_name}) |
|
endforeach() |
|
|