thrust / testing /async /CMakeLists.txt
camenduru's picture
thanks to nvidia ❤
8ae5fc5
# 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()