# 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//.cu # # These generate executables and CTest tests named # ${config_prefix}.test.async... # 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 ( # 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()