forked from NVIDIA/thrust
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Allow thrust to be added to CMake projects via add_subdirectory.
See issue NVIDIA#976. Added example in `examples/cmake/add_subdir/CMakeLists.txt` that is used for documentation and regression testing.
- Loading branch information
1 parent
7676470
commit bf06997
Showing
7 changed files
with
154 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
find_package(Thrust REQUIRED CONFIG | ||
NO_DEFAULT_PATH # Only check the explicit path in HINTS: | ||
HINTS "${CMAKE_CURRENT_LIST_DIR}/.." | ||
COMPONENTS ${THRUST_REQUIRED_SYSTEMS} | ||
OPTIONAL_COMPONENTS ${THRUST_OPTIONAL_SYSTEMS} | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
thrust_update_system_found_flags() | ||
|
||
if (THRUST_CPP_FOUND AND THRUST_CUDA_FOUND) | ||
# Do a basic check of the cmake/ThrustAddSubdir.cmake mechanism: | ||
add_test( | ||
NAME thrust.example.cmake.add_subdir | ||
COMMAND "${CMAKE_COMMAND}" | ||
--log-level=VERBOSE | ||
-S "${CMAKE_CURRENT_SOURCE_DIR}/add_subdir" | ||
-B "${CMAKE_CURRENT_BINARY_DIR}/add_subdir" | ||
-D "THRUST_DIR=${Thrust_SOURCE_DIR}" | ||
-D "CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}" | ||
-D "CMAKE_CUDA_COMPILER=${CMAKE_CUDA_COMPILER}" | ||
-D "CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" | ||
) | ||
endif() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
# This example demonstrates / tests adding thrust via a CMake add_subdirectory | ||
# call from a parent project. | ||
# | ||
# The variables THRUST_REQUIRED_SYSTEMS and THRUST_OPTIONAL_SYSTEMS must be | ||
# set prior to add_subdirectory(thrust), and afterwards the thrust_create_target | ||
# function may be used to create targets with the desired systems. See | ||
# thrust/thrust/cmake/README.md for more details on thrust_create_target. | ||
|
||
cmake_minimum_required(VERSION 3.15) | ||
|
||
# Silence warnings about empty CUDA_ARCHITECTURES properties on example targets: | ||
if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.18) | ||
cmake_policy(SET CMP0104 OLD) | ||
endif() | ||
|
||
project(ThrustAddSubDirExample CXX) | ||
|
||
# Add required Thrust systems to THRUST_REQUIRED_SYSTEMS. | ||
# Options are: CPP, CUDA, TBB or OMP. | ||
# Multiple systems may be specified. | ||
# An error is emitted if the system is not found. | ||
set(THRUST_REQUIRED_SYSTEMS CPP) | ||
|
||
# Add optional Thrust systems to THRUST_OPTIONAL_SYSTEMS. | ||
# Options are: CPP, CUDA, TBB or OMP. | ||
# Multiple systems may be specified. | ||
# No error is emitted if not found. | ||
set(THRUST_OPTIONAL_SYSTEMS CUDA) | ||
|
||
# Use your project's checkout of Thrust here, for most cases | ||
# `add_subdirectory(thrust)` will be sufficient. | ||
add_subdirectory("${THRUST_DIR}" thrust) | ||
|
||
# Create a thrust target that only uses the serial CPP backend. | ||
# See thrust/thrust/cmake/README.md for details and additional options: | ||
thrust_create_target(ThrustCPP HOST CPP DEVICE CPP) | ||
|
||
# Create an executable that uses the CPP-only thrust target: | ||
add_executable(ExecWithCPP dummy.cpp) | ||
target_link_libraries(ExecWithCPP ThrustCPP) | ||
|
||
# To test for optional systems, first call thrust_update_system_found_flags to | ||
# set the THRUST_${system}_FOUND flags in current scope. | ||
# Required due to CMake scoping rules. | ||
thrust_update_system_found_flags() | ||
|
||
# Create and use a Thrust target configured to use CUDA acceleration if CUDA | ||
# is available: | ||
if (THRUST_CUDA_FOUND) | ||
enable_language(CUDA) | ||
thrust_create_target(ThrustCUDA HOST CPP DEVICE CUDA) | ||
add_executable(ExecWithCUDA dummy.cu) | ||
target_link_libraries(ExecWithCUDA ThrustCUDA) | ||
endif() | ||
|
||
# | ||
# Validation | ||
# | ||
|
||
function(assert_boolean var_name expect) | ||
if (expect) | ||
if (NOT ${var_name}) | ||
message(FATAL_ERROR "'${var_name}' is false, expected true.") | ||
endif() | ||
else() | ||
if (${var_name}) | ||
message(FATAL_ERROR "'${var_name}' is true, expected false.") | ||
endif() | ||
endif() | ||
endfunction() | ||
|
||
function(assert_target target_name) | ||
if (NOT TARGET "${target_name}") | ||
message(FATAL_ERROR "Target '${target_name}' not defined.") | ||
endif() | ||
endfunction() | ||
|
||
assert_boolean(THRUST_CPP_FOUND TRUE) | ||
assert_boolean(THRUST_CUDA_FOUND TRUE) | ||
assert_boolean(THRUST_OMP_FOUND FALSE) | ||
assert_boolean(THRUST_TBB_FOUND FALSE) | ||
|
||
assert_target(ThrustCPP) | ||
assert_target(ThrustCUDA) | ||
assert_target(ExecWithCPP) | ||
assert_target(ExecWithCUDA) | ||
|
||
thrust_debug_target(ThrustCPP "") | ||
thrust_debug_target(ThrustCUDA "") | ||
thrust_debug_target(ExecWithCPP "") | ||
thrust_debug_target(ExecWithCUDA "") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
#include <thrust/detail/config.h> | ||
|
||
#include <iostream> | ||
|
||
int main() | ||
{ | ||
std::cout << "Hello from Thrust version " << THRUST_VERSION << ":\n" | ||
|
||
<< "Host system: " | ||
#if THRUST_HOST_SYSTEM == THRUST_HOST_SYSTEM_CPP | ||
<< "CPP\n" | ||
#elif THRUST_HOST_SYSTEM == THRUST_HOST_SYSTEM_OMP | ||
<< "OMP\n" | ||
#elif THRUST_HOST_SYSTEM == THRUST_HOST_SYSTEM_TBB | ||
<< "TBB\n" | ||
#else | ||
<< "Unknown\n" | ||
#endif | ||
|
||
<< "Device system: " | ||
#if THRUST_DEVICE_SYSTEM == THRUST_DEVICE_SYSTEM_CPP | ||
<< "CPP\n"; | ||
#elif THRUST_DEVICE_SYSTEM == THRUST_DEVICE_SYSTEM_CUDA | ||
<< "CUDA\n"; | ||
#elif THRUST_DEVICE_SYSTEM == THRUST_DEVICE_SYSTEM_OMP | ||
<< "OMP\n"; | ||
#elif THRUST_DEVICE_SYSTEM == THRUST_DEVICE_SYSTEM_TBB | ||
<< "TBB\n"; | ||
#else | ||
<< "Unknown\n"; | ||
#endif | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
#include "dummy.cpp" |