From b2d37c21fd036d307566218f8a12f84c92da8c08 Mon Sep 17 00:00:00 2001 From: Allison Vacanti Date: Tue, 19 Oct 2021 21:30:04 -0400 Subject: [PATCH] Add export tests. --- CMakeLists.txt | 8 ++- cmake/NVBenchUtilities.cmake | 14 +++++ testing/CMakeLists.txt | 2 + testing/cmake/CMakeLists.txt | 79 ++++++++++++++++++++++++ testing/cmake/test_export/CMakeLists.txt | 10 +++ testing/cmake/test_export/test_bench.cu | 13 ++++ 6 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 cmake/NVBenchUtilities.cmake create mode 100644 testing/cmake/CMakeLists.txt create mode 100644 testing/cmake/test_export/CMakeLists.txt create mode 100644 testing/cmake/test_export/test_bench.cu diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c985b2..e9bcf0a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,10 @@ # 3.20.1 required for rapids-cmake cmake_minimum_required(VERSION 3.20.1) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CUDA_STANDARD 17) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + include(cmake/NVBenchRapidsCMake.cmake) nvbench_load_rapids_cmake() @@ -15,12 +19,10 @@ include(cmake/NVBenchConfigTarget.cmake) include(cmake/NVBenchDependencies.cmake) include(cmake/NVBenchExports.cmake) include(cmake/NVBenchInstallRules.cmake) +include(cmake/NVBenchUtilities.cmake) message(STATUS "NVBench CUDA architectures: ${CMAKE_CUDA_ARCHITECTURES}") -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CUDA_STANDARD 17) - option(NVBench_ENABLE_TESTING "Build NVBench testing suite." OFF) option(NVBench_ENABLE_EXAMPLES "Build NVBench examples." OFF) diff --git a/cmake/NVBenchUtilities.cmake b/cmake/NVBenchUtilities.cmake new file mode 100644 index 0000000..3668420 --- /dev/null +++ b/cmake/NVBenchUtilities.cmake @@ -0,0 +1,14 @@ +# Writes CMAKE_CUDA_ARCHITECTURES to out_var, but using escaped semicolons +# as delimiters +function(nvbench_escaped_cuda_arches out_var) + set(tmp) + set(first TRUE) + foreach(arg IN LISTS CMAKE_CUDA_ARCHITECTURES) + if (NOT first) + string(APPEND tmp "\;") + endif() + string(APPEND tmp "${arg}") + set(first FALSE) + endforeach() + set(${out_var} "${tmp}" PARENT_SCOPE) +endfunction() diff --git a/testing/CMakeLists.txt b/testing/CMakeLists.txt index 7603bc1..fe39688 100644 --- a/testing/CMakeLists.txt +++ b/testing/CMakeLists.txt @@ -34,3 +34,5 @@ foreach(test_src IN LISTS test_srcs) add_dependencies(nvbench.test.all ${test_name}) endforeach() + +add_subdirectory(cmake) diff --git a/testing/cmake/CMakeLists.txt b/testing/cmake/CMakeLists.txt new file mode 100644 index 0000000..01a7dfb --- /dev/null +++ b/testing/cmake/CMakeLists.txt @@ -0,0 +1,79 @@ +if ("MSVC" STREQUAL "${CMAKE_CXX_COMPILER_ID}") + # There's a bug that prevents build-and-test from working on MSVC. + # See NVIDIA/nvbench#43. + return() +endif() + +# Need to escape the semicolons in CUDA_ARCHITECTURES or the tests break: +nvbench_escaped_cuda_arches(arches) + +set(cmake_opts + -D "CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" + -D "CMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}" + -D "CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}" + -D "CMAKE_CUDA_COMPILER=${CMAKE_CUDA_COMPILER}" + -D "CMAKE_CUDA_ARCHITECTURES=${arches}" +) + +# Temporary installation prefix for tests against installed nvbench: +set(tmp_install_prefix "${CMAKE_CURRENT_BINARY_DIR}/test_nvbench_install") + +# Add a build-and-test CTest. +# - full_test_name_var will be set to the full name of the test. +# - subdir is the relative path to the test project directory. +# - test_id is used to generate a unique name for this test, allowing the +# subdir to be reused. +# - Any additional args will be passed to the project configure step. +function(nvbench_add_compile_test full_test_name_var subdir test_id) + set(test_name nvbench.test.cmake.${subdir}.${test_id}) + set(src_dir "${CMAKE_CURRENT_SOURCE_DIR}/${subdir}") + set(build_dir "${CMAKE_CURRENT_BINARY_DIR}/${subdir}/${test_id}") + add_test(NAME ${test_name} + COMMAND "${CMAKE_CTEST_COMMAND}" + --build-and-test "${src_dir}" "${build_dir}" + --build-generator "${CMAKE_GENERATOR}" + --build-options + ${cmake_opts} + ${ARGN} + --test-command "${CMAKE_CTEST_COMMAND}" --output-on-failure + ) + set(${full_test_name_var} ${test_name} PARENT_SCOPE) +endfunction() + +################################################################################ +# Test against build tree export + +nvbench_add_compile_test(test_name + test_export + build_tree + -D "NVBench_DIR=${NVBench_BINARY_DIR}" +) + +################################################################################ +# Test against install tree export + +nvbench_add_compile_test(test_name + test_export + install_tree + # "rapids_export() always installs to lib" per rapids_export docs + -D "NVBench_DIR=${tmp_install_prefix}/lib/cmake/nvbench/" +) +set_tests_properties(${test_name} PROPERTIES FIXTURES_REQUIRED install_tree) + +################################################################################ +# Install tree fixtures +add_test(NAME nvbench.test.cmake.install_tree.install + COMMAND "${CMAKE_COMMAND}" + --install "${NVBench_BINARY_DIR}" + --prefix "${tmp_install_prefix}" +) +set_tests_properties(nvbench.test.cmake.install_tree.install PROPERTIES + FIXTURES_SETUP install_tree +) + +add_test(NAME nvbench.test.cmake.install_tree.cleanup + COMMAND "${CMAKE_COMMAND}" -E rm -rf "${tmp_install_prefix}" +) +set_tests_properties(nvbench.test.cmake.install_tree.cleanup PROPERTIES + FIXTURES_CLEANUP install_tree +) diff --git a/testing/cmake/test_export/CMakeLists.txt b/testing/cmake/test_export/CMakeLists.txt new file mode 100644 index 0000000..20d8b99 --- /dev/null +++ b/testing/cmake/test_export/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.20.1) +project(NVBenchTestExport CUDA CXX) + +message(STATUS "NVBench_DIR=${NVBench_DIR}") +find_package(NVBench) + +add_executable(test_bench test_bench.cu) +target_link_libraries(test_bench PRIVATE nvbench::main) +enable_testing() +add_test(NAME test COMMAND "$" --timeout 1) diff --git a/testing/cmake/test_export/test_bench.cu b/testing/cmake/test_export/test_bench.cu new file mode 100644 index 0000000..71673b2 --- /dev/null +++ b/testing/cmake/test_export/test_bench.cu @@ -0,0 +1,13 @@ +#include + +// Grab some testing kernels from NVBench: +#include + +void simple(nvbench::state &state) +{ + state.exec([](nvbench::launch &launch) { + // Sleep for 1 millisecond: + nvbench::sleep_kernel<<<1, 1, 0, launch.get_stream()>>>(1e-3); + }); +} +NVBENCH_BENCH(simple);