| #! /usr/bin/env bash |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
|
|
| set -e |
|
|
| |
| |
| |
| function append { |
| tmp="${!1:+${!1} }${2}" |
| eval "${1}=\${tmp}" |
| } |
|
|
| |
| |
| function log() { |
| printf "\n>>>> %s\n\n" "${*}" |
| } |
|
|
| |
| |
| |
| function print_with_trailing_blank_line { |
| printf "%s\n\n" "${*}" |
| } |
|
|
| |
| |
| function echo_and_run { |
| echo "${1}: ${@:2}" |
| ${@:2} |
| } |
|
|
| |
| |
| |
| function echo_and_run_timed { |
| echo "${@:2}" |
| TIMEFORMAT=$'\n'"${1} Time: %lR" |
| time ${@:2} |
| } |
|
|
| |
| |
| |
| |
| |
| |
| function join_delimit { |
| local IFS="${1}" |
| shift |
| echo "${*}" |
| } |
|
|
| |
| |
| |
|
|
| |
| set +e |
| source /etc/cccl.bashrc |
| set -e |
|
|
| |
| if [[ "${CXX_TYPE}" == "nvcxx" ]]; then |
| log "Disabling sccache (nvcxx not supported)" |
| unset ENABLE_SCCACHE |
| elif [[ "${BUILD_MODE}" == "pull-request" || "${BUILD_MODE}" == "branch" ]]; then |
| |
| export ENABLE_SCCACHE="gpuCI" |
| |
| export SCCACHE_S3_KEY_PREFIX=thrust-linux64 |
| export SCCACHE_BUCKET=rapids-sccache-east |
| export SCCACHE_REGION=us-east-2 |
| export SCCACHE_IDLE_TIMEOUT=32768 |
| else |
| export ENABLE_SCCACHE="local" |
| |
| export SCCACHE_DIR="${WORKSPACE}/build-sccache" |
| fi |
|
|
| |
| if [[ -n "${ENABLE_SCCACHE}" ]]; then |
| export CMAKE_CUDA_COMPILER_LAUNCHER="sccache" |
| export CMAKE_CXX_COMPILER_LAUNCHER="sccache" |
| export CMAKE_C_COMPILER_LAUNCHER="sccache" |
| fi |
|
|
| |
| export PATH=/usr/local/cuda/bin:${PATH} |
|
|
| |
| export HOME=${WORKSPACE} |
|
|
| |
| MEMMON_LOG=${WORKSPACE}/build/memmon_log |
|
|
| |
| cd ${WORKSPACE} |
| mkdir -p build |
| cd build |
|
|
| |
| rm -f .ninja_log |
|
|
| if [[ -z "${CMAKE_BUILD_TYPE}" ]]; then |
| CMAKE_BUILD_TYPE="Release" |
| fi |
|
|
| CMAKE_BUILD_FLAGS="--" |
|
|
| |
| append CMAKE_FLAGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" |
| append CMAKE_FLAGS "-DCMAKE_CUDA_COMPILER='${CUDACXX}'" |
|
|
| if [[ "${CXX_TYPE}" == "nvcxx" ]]; then |
| |
| |
| |
| append CMAKE_FLAGS "-DCMAKE_CUDA_COMPILER_FORCED=ON" |
| append CMAKE_FLAGS "-DCMAKE_CUDA_COMPILER_ID=NVCXX" |
| |
| |
| |
| |
| |
| CUDA_VER=$(echo ${SDK_VER} | sed 's/.*\(cuda[0-9]\+\.[0-9]\+\)/\1/') |
| append CMAKE_FLAGS "-DCMAKE_CUDA_FLAGS=-gpu=${CUDA_VER}" |
| |
| append CMAKE_BUILD_FLAGS "-k" |
| else |
| if [[ "${CXX_TYPE}" == "icc" ]]; then |
| |
| |
| append CMAKE_FLAGS "-DCMAKE_CUDA_FLAGS=-allow-unsupported-compiler" |
| fi |
| |
| append CMAKE_FLAGS "-DCMAKE_CXX_COMPILER='${CXX}'" |
| append CMAKE_FLAGS "-G Ninja" |
| |
| append CMAKE_BUILD_FLAGS "-k0" |
| fi |
|
|
| DETERMINE_PARALLELISM_FLAGS="" |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| if [[ -z "${MIN_MEMORY_PER_THREAD}" ]]; then |
| if [[ "${CXX_TYPE}" == "nvcxx" ]]; then |
| MIN_MEMORY_PER_THREAD=3.0 |
| elif [[ "${CXX_TYPE}" == "icc" ]]; then |
| MIN_MEMORY_PER_THREAD=2.5 |
| else |
| MIN_MEMORY_PER_THREAD=2.0 |
| fi |
| fi |
| append DETERMINE_PARALLELISM_FLAGS "--min-memory-per-thread ${MIN_MEMORY_PER_THREAD}" |
|
|
| if [[ -n "${PARALLEL_LEVEL}" ]]; then |
| append DETERMINE_PARALLELISM_FLAGS "-j ${PARALLEL_LEVEL}" |
| fi |
|
|
| |
| |
| |
| |
| if [[ -z "${COVERAGE_PLAN}" ]]; then |
| |
| |
| if [[ "${CXX_TYPE}" == "nvcxx" ]]; then |
| |
| COVERAGE_PLAN="Minimal" |
| elif [[ "${BUILD_TYPE}" == "cpu" ]] && [[ "${BUILD_MODE}" == "branch" ]]; then |
| |
| COVERAGE_PLAN="Exhaustive" |
| elif [[ "${BUILD_TYPE}" == "cpu" ]]; then |
| |
| COVERAGE_PLAN="Thorough" |
| elif [[ "${BUILD_TYPE}" == "gpu" ]]; then |
| |
| COVERAGE_PLAN="Minimal" |
| fi |
| fi |
|
|
| case "${COVERAGE_PLAN}" in |
| Exhaustive) |
| append CMAKE_FLAGS "-DTHRUST_ENABLE_MULTICONFIG=ON" |
| append CMAKE_FLAGS "-DTHRUST_IGNORE_DEPRECATED_CPP_11=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_DIALECT_ALL=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_SYSTEM_CPP=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_SYSTEM_TBB=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_SYSTEM_OMP=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_SYSTEM_CUDA=ON" |
| append CMAKE_FLAGS "-DTHRUST_INCLUDE_CUB_CMAKE=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_WORKLOAD=LARGE" |
| ;; |
| Thorough) |
| |
| |
| append CMAKE_FLAGS "-DTHRUST_ENABLE_BENCHMARKS=ON" |
| append CMAKE_FLAGS "-DTHRUST_ENABLE_MULTICONFIG=ON" |
| append CMAKE_FLAGS "-DTHRUST_IGNORE_DEPRECATED_CPP_11=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_DIALECT_ALL=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_SYSTEM_CPP=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_SYSTEM_TBB=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_SYSTEM_OMP=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_SYSTEM_CUDA=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_WORKLOAD=SMALL" |
| append CMAKE_FLAGS "-DTHRUST_INCLUDE_CUB_CMAKE=ON" |
| append CMAKE_FLAGS "-DTHRUST_AUTO_DETECT_COMPUTE_ARCHS=ON" |
| if [[ "${CXX_TYPE}" != "nvcxx" ]]; then |
| |
| append CMAKE_FLAGS "-DTHRUST_ENABLE_COMPUTE_50=ON" |
| append CMAKE_FLAGS "-DTHRUST_ENABLE_COMPUTE_60=ON" |
| append CMAKE_FLAGS "-DTHRUST_ENABLE_COMPUTE_70=ON" |
| fi |
| append CMAKE_FLAGS "-DTHRUST_ENABLE_COMPUTE_80=ON" |
| ;; |
| Minimal) |
| append CMAKE_FLAGS "-DTHRUST_ENABLE_MULTICONFIG=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_DIALECT_LATEST=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_SYSTEM_CPP=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_SYSTEM_TBB=OFF" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_SYSTEM_OMP=OFF" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_ENABLE_SYSTEM_CUDA=ON" |
| append CMAKE_FLAGS "-DTHRUST_MULTICONFIG_WORKLOAD=SMALL" |
| append CMAKE_FLAGS "-DTHRUST_INCLUDE_CUB_CMAKE=ON" |
| append CMAKE_FLAGS "-DTHRUST_AUTO_DETECT_COMPUTE_ARCHS=ON" |
| if [[ "${BUILD_TYPE}" == "cpu" ]] && [[ "${CXX_TYPE}" == "nvcxx" ]]; then |
| |
| |
| |
| |
| append CMAKE_FLAGS "-DTHRUST_ENABLE_COMPUTE_80=ON" |
| fi |
| ;; |
| esac |
|
|
| if [[ -n "${@}" ]]; then |
| append CMAKE_BUILD_FLAGS "${@}" |
| fi |
|
|
| append CTEST_FLAGS "--output-on-failure" |
|
|
| CTEST_EXCLUSION_REGEXES=() |
|
|
| if [[ "${BUILD_TYPE}" == "cpu" ]]; then |
| CTEST_EXCLUSION_REGEXES+=("^cub" "^thrust.*cuda") |
| fi |
|
|
| if [[ -n "${CTEST_EXCLUSION_REGEXES[@]}" ]]; then |
| CTEST_EXCLUSION_REGEX=$(join_delimit "|" "${CTEST_EXCLUSION_REGEXES[@]}") |
| append CTEST_FLAGS "-E ${CTEST_EXCLUSION_REGEX}" |
| fi |
|
|
| if [[ -n "${@}" ]]; then |
| CTEST_INCLUSION_REGEX=$(join_delimit "|" "${@}") |
| append CTEST_FLAGS "-R ^${CTEST_INCLUSION_REGEX[@]}$" |
| fi |
|
|
| |
| export COVERAGE_PLAN |
| export CMAKE_FLAGS |
| export CMAKE_BUILD_FLAGS |
| export CTEST_FLAGS |
|
|
| |
| |
| |
|
|
| log "Determine system topology..." |
|
|
| |
| |
| source ${WORKSPACE}/ci/common/determine_build_parallelism.bash ${DETERMINE_PARALLELISM_FLAGS} |
|
|
| log "Get environment..." |
|
|
| env | sort |
|
|
| log "Check versions..." |
|
|
| |
| |
|
|
| ${CXX} --version 2>&1 | sed -Ez '$ s/\n*$/\n/' |
|
|
| echo |
|
|
| ${CUDACXX} --version 2>&1 | sed -Ez '$ s/\n*$/\n/' |
|
|
| echo |
|
|
| cmake --version 2>&1 | sed -Ez '$ s/\n*$/\n/' |
|
|
| if [[ "${BUILD_TYPE}" == "gpu" ]]; then |
| echo |
| nvidia-smi 2>&1 | sed -Ez '$ s/\n*$/\n/' |
| fi |
|
|
| if [[ -n "${ENABLE_SCCACHE}" ]]; then |
| echo |
| |
| sccache --version |
| sccache --zero-stats | grep location |
| fi |
|
|
| |
| |
| |
|
|
| log "Configure Thrust and CUB..." |
|
|
| echo_and_run_timed "Configure" cmake .. --log-level=VERBOSE ${CMAKE_FLAGS} |
| configure_status=$? |
|
|
| log "Build Thrust and CUB..." |
|
|
| |
| |
| set +e |
|
|
| |
| python3 ${WORKSPACE}/ci/common/memmon.py \ |
| --log-threshold 0.0 \ |
| --fail-threshold ${MIN_MEMORY_PER_THREAD} \ |
| --log-file ${MEMMON_LOG} \ |
| & |
| memmon_pid=$! |
|
|
| echo_and_run_timed "Build" cmake --build . ${CMAKE_BUILD_FLAGS} -j ${PARALLEL_LEVEL} |
| build_status=$? |
|
|
| |
| kill -s SIGINT ${memmon_pid} |
|
|
| |
| set -e |
|
|
| |
| |
| |
|
|
| log "Test Thrust and CUB..." |
|
|
| ( |
| |
| |
| set -o pipefail |
| echo_and_run_timed "Test" ctest ${CTEST_FLAGS} | tee ctest_log |
| ) |
| test_status=$? |
|
|
| |
| |
| |
|
|
| if [[ -n "${ENABLE_SCCACHE}" ]]; then |
| |
| COMPILE_REQUESTS=$(sccache -s | grep "Compile requests \+ [0-9]\+$" | awk '{ print $NF }') |
| CACHE_HITS=$(sccache -s | grep "Cache hits \+ [0-9]\+$" | awk '{ print $NF }') |
| HIT_RATE=$(echo - | awk "{printf \"%.2f\n\", $CACHE_HITS / $COMPILE_REQUESTS * 100}") |
| log "sccache stats (${HIT_RATE}% hit):" |
| sccache -s |
| fi |
|
|
| |
| |
| |
|
|
| if [[ -f ".ninja_log" ]]; then |
| log "Checking slowest build steps:" |
| echo_and_run "CompileTimeInfo" cmake -P ../cmake/PrintNinjaBuildTimes.cmake | head -n 23 |
| fi |
|
|
| |
| |
| |
|
|
| if [[ -f "ctest_log" ]]; then |
| log "Checking slowest test steps:" |
| echo_and_run "TestTimeInfo" cmake -DLOGFILE=ctest_log -P ../cmake/PrintCTestRunTimes.cmake | head -n 20 |
| fi |
|
|
| |
| |
| |
|
|
| memmon_status=0 |
| if [[ -f "${MEMMON_LOG}" ]]; then |
| log "Checking memmon logfile: ${MEMMON_LOG}" |
|
|
| if [[ -n "$(grep -E "^FAIL" ${MEMMON_LOG})" ]]; then |
| log "error: Some build steps exceeded memory threshold (${MIN_MEMORY_PER_THREAD} GiB):" |
| grep -E "^FAIL" ${MEMMON_LOG} |
| memmon_status=1 |
| else |
| log "Top memory usage per build step (all less than limit of ${MIN_MEMORY_PER_THREAD} GiB):" |
| if [[ -s ${MEMMON_LOG} ]]; then |
| |
| head -n5 ${MEMMON_LOG} |
| else |
| echo "None detected above logging threshold." |
| fi |
| fi |
| fi |
|
|
| |
| |
| |
|
|
| log "Summary:" |
| echo "Warnings:" |
| |
| echo "- Build Memory Check: ${memmon_status}" |
| echo "Failures:" |
| echo "- Configure Error Code: ${configure_status}" |
| echo "- Build Error Code: ${build_status}" |
| echo "- Test Error Code: ${test_status}" |
|
|
| if [[ "${configure_status}" != "0" ]] || \ |
| [[ "${build_status}" != "0" ]] || \ |
| [[ "${test_status}" != "0" ]]; then |
| exit 1 |
| fi |
|
|