File size: 5,705 Bytes
8ae5fc5 |
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 |
# This file defines thrust_configure_multiconfig(), which sets up and handles
# the MultiConfig options that allow multiple host/device/dialect configurations
# to be generated from a single thrust build.
function(thrust_configure_multiconfig)
option(THRUST_ENABLE_MULTICONFIG "Enable multiconfig options for coverage testing." OFF)
# Dialects:
set(THRUST_CPP_DIALECT_OPTIONS
11 14 17 20
CACHE INTERNAL "C++ dialects supported by Thrust." FORCE
)
if (THRUST_ENABLE_MULTICONFIG)
# Handle dialect options:
foreach (dialect IN LISTS THRUST_CPP_DIALECT_OPTIONS)
set(default_value OFF)
if (dialect EQUAL 14) # Default to just 14 on:
set(default_value ON)
endif()
option(THRUST_MULTICONFIG_ENABLE_DIALECT_CPP${dialect}
"Generate C++${dialect} build configurations."
${default_value}
)
endforeach()
# Option to enable all standards supported by the CUDA and CXX compilers:
option(THRUST_MULTICONFIG_ENABLE_DIALECT_ALL
"Generate build configurations for all C++ standards supported by the configured compilers."
OFF
)
# Option to enable only the most recent supported dialect:
option(THRUST_MULTICONFIG_ENABLE_DIALECT_LATEST
"Generate a single build configuration for the most recent C++ standard supported by the configured compilers."
OFF
)
# Systems:
option(THRUST_MULTICONFIG_ENABLE_SYSTEM_CPP "Generate build configurations that use CPP." ON)
option(THRUST_MULTICONFIG_ENABLE_SYSTEM_CUDA "Generate build configurations that use CUDA." ON)
option(THRUST_MULTICONFIG_ENABLE_SYSTEM_OMP "Generate build configurations that use OpenMP." OFF)
option(THRUST_MULTICONFIG_ENABLE_SYSTEM_TBB "Generate build configurations that use TBB." OFF)
# CMake fixed C++17 support for NVCC + MSVC targets in 3.18.3:
if (THRUST_MULTICONFIG_ENABLE_DIALECT_CPP17 AND
THRUST_MULTICONFIG_ENABLE_SYSTEM_CUDA)
cmake_minimum_required(VERSION 3.18.3)
endif()
# Workload:
# - `SMALL`: [3 configs] Minimal coverage and validation of each device system against the `CPP` host.
# - `MEDIUM`: [6 configs] Cheap extended coverage.
# - `LARGE`: [8 configs] Expensive extended coverage. Include all useful build configurations.
# - `FULL`: [12 configs] The complete cross product of all possible build configurations.
#
# Config | Workloads | Value | Expense | Note
# ---------|-----------|------------|-----------|-----------------------------
# CPP/CUDA | F L M S | Essential | Expensive | Validates CUDA against CPP
# CPP/OMP | F L M S | Essential | Cheap | Validates OMP against CPP
# CPP/TBB | F L M S | Essential | Cheap | Validates TBB against CPP
# CPP/CPP | F L M | Important | Cheap | Tests CPP as device
# OMP/OMP | F L M | Important | Cheap | Tests OMP as host
# TBB/TBB | F L M | Important | Cheap | Tests TBB as host
# TBB/CUDA | F L | Important | Expensive | Validates TBB/CUDA interop
# OMP/CUDA | F L | Important | Expensive | Validates OMP/CUDA interop
# TBB/OMP | F | Not useful | Cheap | Mixes CPU-parallel systems
# OMP/TBB | F | Not useful | Cheap | Mixes CPU-parallel systems
# TBB/CPP | F | Not Useful | Cheap | Parallel host, serial device
# OMP/CPP | F | Not Useful | Cheap | Parallel host, serial device
set(THRUST_MULTICONFIG_WORKLOAD SMALL CACHE STRING
"Limit host/device configs: SMALL (up to 3 h/d combos per dialect), MEDIUM(6), LARGE(8), FULL(12)"
)
set_property(CACHE THRUST_MULTICONFIG_WORKLOAD PROPERTY STRINGS
SMALL MEDIUM LARGE FULL
)
set(THRUST_MULTICONFIG_WORKLOAD_SMALL_CONFIGS
CPP_OMP CPP_TBB CPP_CUDA
CACHE INTERNAL "Host/device combos enabled for SMALL workloads." FORCE
)
set(THRUST_MULTICONFIG_WORKLOAD_MEDIUM_CONFIGS
${THRUST_MULTICONFIG_WORKLOAD_SMALL_CONFIGS}
CPP_CPP TBB_TBB OMP_OMP
CACHE INTERNAL "Host/device combos enabled for MEDIUM workloads." FORCE
)
set(THRUST_MULTICONFIG_WORKLOAD_LARGE_CONFIGS
${THRUST_MULTICONFIG_WORKLOAD_MEDIUM_CONFIGS}
OMP_CUDA TBB_CUDA
CACHE INTERNAL "Host/device combos enabled for LARGE workloads." FORCE
)
set(THRUST_MULTICONFIG_WORKLOAD_FULL_CONFIGS
${THRUST_MULTICONFIG_WORKLOAD_LARGE_CONFIGS}
OMP_CPP TBB_CPP OMP_TBB TBB_OMP
CACHE INTERNAL "Host/device combos enabled for FULL workloads." FORCE
)
# Hide the single config options if they exist from a previous run:
if (DEFINED THRUST_HOST_SYSTEM)
set_property(CACHE THRUST_HOST_SYSTEM PROPERTY TYPE INTERNAL)
set_property(CACHE THRUST_DEVICE_SYSTEM PROPERTY TYPE INTERNAL)
endif()
if (DEFINED THRUST_CPP_DIALECT)
set_property(CACHE THRUST_CPP_DIALECT PROPERTY TYPE INTERNAL)
endif()
else() # Single config:
# Restore system option visibility if these cache options already exist
# from a previous run.
if (DEFINED THRUST_HOST_SYSTEM)
set_property(CACHE THRUST_HOST_SYSTEM PROPERTY TYPE STRING)
set_property(CACHE THRUST_DEVICE_SYSTEM PROPERTY TYPE STRING)
endif()
set(THRUST_CPP_DIALECT 14
CACHE STRING "The C++ standard to target: ${THRUST_CPP_DIALECT_OPTIONS}"
)
set_property(CACHE THRUST_CPP_DIALECT
PROPERTY STRINGS
${THRUST_CPP_DIALECT_OPTIONS}
)
# CMake fixed C++17 support for NVCC + MSVC targets in 3.18.3:
if (THRUST_CPP_DIALECT EQUAL 17 AND
THRUST_DEVICE_SYSTEM STREQUAL "CUDA")
cmake_minimum_required(VERSION 3.18.3)
endif()
endif()
endfunction()
|