diff --git a/projects/rocthrust/CHANGELOG.md b/projects/rocthrust/CHANGELOG.md index e69d45b151cc..dcab1c3aa18f 100644 --- a/projects/rocthrust/CHANGELOG.md +++ b/projects/rocthrust/CHANGELOG.md @@ -3,6 +3,12 @@ Documentation for rocThrust available at [https://rocm.docs.amd.com/projects/rocThrust/en/latest/](https://rocm.docs.amd.com/projects/rocThrust/en/latest/). +## rocThrust x.y.z for ROCm x.y + +### Added + +* If you are using rocThrust on the host-side only, you can now build using g++ or non-HIP-aware clang++. To configure rocThrust in this-way, set the new CMake option `ROCTHRUST_DEVICE_SYSTEM` to `CPP` (other options include `HIP`, `CUDA`, `OpenMP`, and `TBB`), and set `CXX` to g++ or clang++. Then install rocThrust via `make install`. When you compile your application, don't forget to include the rocThrust include directory (`-I /opt/rocm/include`), since this won't happen automatically like it does when building with hipcc. Note that currently, rocThrust tests and benchmarks cannot be built when configuring rocThrust for host-side-only use. + ## rocThrust 4.2.0 for ROCm 7.2 ### Added diff --git a/projects/rocthrust/CMakeLists.txt b/projects/rocthrust/CMakeLists.txt index 36cc0c8da250..eb3838ea0f60 100644 --- a/projects/rocthrust/CMakeLists.txt +++ b/projects/rocthrust/CMakeLists.txt @@ -64,7 +64,22 @@ cmake_dependent_option(ENABLE_UPSTREAM_TESTS "Enable upstream (thrust) tests" ON cmake_dependent_option(USE_SYSTEM_LIB "Use existing system ROCm library installation when building tests" OFF BUILD_TEST OFF) option(EXTERNAL_DEPS_FORCE_DOWNLOAD "Force download of non-ROCm dependencies (eg. Google Test, Google Benchmark)" OFF) -check_language(HIP) +set(DEVICE_SYSTEM_OPTIONS "HIP" "CUDA" "CPP" "OpenMP" "TBB") +set(ROCTHRUST_DEVICE_SYSTEM "HIP" CACHE STRING "Set device system for thrust (options are ${DEVICE_SYSTEM_OPTIONS})") + +if(NOT ${ROCTHRUST_DEVICE_SYSTEM} IN_LIST DEVICE_SYSTEM_OPTIONS) + message(FATAL_ERROR "Unrecognized ROCTHRUST_DEVICE_SYSTEM option \"${ROCTHRUST_DEVICE_SYSTEM}\". Valid options are: ${DEVICE_SYSTEM_OPTIONS}") +endif() + +if((BUILD_TEST OR BUILD_BENCHMARK OR BUILD_EXAMPLE) AND + NOT (${ROCTHRUST_DEVICE_SYSTEM} STREQUAL "HIP" OR $ROCTHRUST_DEVICE_SYSTEM STREQUAL "CUDA")) + message(FATAL_ERROR "rocThrust tests, benchmarks, and examples must be built with ROCTHRUST_DEVICE_SYSTEM=HIP|CUDA since they require device acceleration.") +endif() + +if(${ROCTHRUST_DEVICE_SYSTEM} STREQUAL "HIP") + check_language(HIP) +endif() + cmake_dependent_option(USE_HIPCXX "Use CMake HIP language support" OFF CMAKE_HIP_COMPILER OFF) include(CheckCXXCompilerFlag) diff --git a/projects/rocthrust/cmake/Dependencies.cmake b/projects/rocthrust/cmake/Dependencies.cmake index dece37f3112d..3291945f6e72 100644 --- a/projects/rocthrust/cmake/Dependencies.cmake +++ b/projects/rocthrust/cmake/Dependencies.cmake @@ -236,9 +236,10 @@ function(fetch_dep method repo_name repo_path download_branch) endif() endfunction() -fetch_dep(ROCPRIM_FETCH_METHOD rocprim ROCPRIM_PATH ROCM_DEP_RELEASE_BRANCH) +if(${ROCTHRUST_DEVICE_SYSTEM} STREQUAL "HIP") + fetch_dep(ROCPRIM_FETCH_METHOD rocprim ROCPRIM_PATH ROCM_DEP_RELEASE_BRANCH) -if(${ROCPRIM_FETCH_METHOD} STREQUAL "DOWNLOAD" OR ${ROCPRIM_FETCH_METHOD} STREQUAL "MONOREPO") + if(${ROCPRIM_FETCH_METHOD} STREQUAL "DOWNLOAD" OR ${ROCPRIM_FETCH_METHOD} STREQUAL "MONOREPO") # The fetch_dep call above should have downloaded/located the source. We just need to make it available. message(STATUS "Configuring rocPRIM") FetchContent_Declare( @@ -258,6 +259,7 @@ if(${ROCPRIM_FETCH_METHOD} STREQUAL "DOWNLOAD" OR ${ROCPRIM_FETCH_METHOD} STREQU add_library(roc::rocprim_hip ALIAS rocprim_hip) endif() endif() +endif() # Test dependencies if(BUILD_TEST OR BUILD_HIPSTDPAR_TEST) diff --git a/projects/rocthrust/cmake/Summary.cmake b/projects/rocthrust/cmake/Summary.cmake index c1abdaabb18b..4edaf01fbf35 100644 --- a/projects/rocthrust/cmake/Summary.cmake +++ b/projects/rocthrust/cmake/Summary.cmake @@ -107,6 +107,7 @@ endif() message(STATUS " USE_SYSTEM_LIB : ${USE_SYSTEM_LIB}") message(STATUS " BUILD_ADDRESS_SANITIZER : ${BUILD_ADDRESS_SANITIZER}") message(STATUS " EXTERNAL_DEPS_FORCE_DOWNLOAD : ${EXTERNAL_DEPS_FORCE_DOWNLOAD}") + message(STATUS " ROCTHRUST_DEVICE_SYSTEM : ${ROCTHRUST_DEVICE_SYSTEM}") message(STATUS "") message(STATUS "Detailed:") message(STATUS " C++ compiler details : \n${CMAKE_CXX_COMPILER_VERBOSE_DETAILS}") diff --git a/projects/rocthrust/cmake/VerifyCompiler.cmake b/projects/rocthrust/cmake/VerifyCompiler.cmake index 3be10785eb63..54a1e60bd3aa 100644 --- a/projects/rocthrust/cmake/VerifyCompiler.cmake +++ b/projects/rocthrust/cmake/VerifyCompiler.cmake @@ -20,21 +20,28 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -list(APPEND CMAKE_PREFIX_PATH /opt/rocm /opt/rocm/hip) -find_package(hip REQUIRED CONFIG PATHS /opt/rocm) +if(${ROCTHRUST_DEVICE_SYSTEM} STREQUAL "HIP") + list(APPEND CMAKE_PREFIX_PATH /opt/rocm /opt/rocm/hip) + find_package(hip REQUIRED CONFIG PATHS /opt/rocm) +endif() if(HIP_COMPILER STREQUAL "nvcc") message(FATAL_ERROR "rocThrust does not support the CUDA backend.") -elseif(HIP_COMPILER STREQUAL "clang") - if(USE_HIPCXX) - if(NOT (CMAKE_HIP_COMPILER MATCHES ".*hipcc$" OR CMAKE_HIP_COMPILER MATCHES ".*clang\\+\\+")) - message(FATAL_ERROR "On ROCm platform 'hipcc' or HIP-aware Clang must be used as HIP compiler.") +endif() + +if(${ROCTHRUST_DEVICE_SYSTEM} STREQUAL "HIP") + # When building for HIP, make sure we have a hip-aware clang. + if(HIP_COMPILER STREQUAL "clang") + if(USE_HIPCXX) + if(NOT (CMAKE_HIP_COMPILER MATCHES ".*hipcc$" OR CMAKE_HIP_COMPILER MATCHES ".*clang\\+\\+")) + message(FATAL_ERROR "When ROCTHRUST_DEVICE_SYSTEM is set to 'HIP', then 'hipcc' or a HIP-aware Clang must be used as the C++ compiler.") + endif() + else() + if(NOT (CMAKE_CXX_COMPILER MATCHES ".*hipcc$" OR CMAKE_CXX_COMPILER MATCHES ".*clang\\+\\+")) + message(FATAL_ERROR "When ROCTHRUST_DEVICE_SYSTEM is set to 'HIP', then 'hipcc' or a HIP-aware Clang must be used as the C++ compiler.") + endif() endif() else() - if(NOT (CMAKE_CXX_COMPILER MATCHES ".*hipcc$" OR CMAKE_CXX_COMPILER MATCHES ".*clang\\+\\+")) - message(FATAL_ERROR "On ROCm platform 'hipcc' or HIP-aware Clang must be used as C++ compiler.") - endif() + message(FATAL_ERROR "When ROCTHRUST_DEVICE_SYSTEM is set to 'HIP', HIP_COMPILER must be `clang` (AMD ROCm platform)") endif() -else() - message(FATAL_ERROR "HIP_COMPILER must be `clang` (AMD ROCm platform)") endif() diff --git a/projects/rocthrust/docs/install/rocThrust-install-with-cmake.rst b/projects/rocthrust/docs/install/rocThrust-install-with-cmake.rst index 70ef7ca63ab5..2fdf08a53d1f 100644 --- a/projects/rocthrust/docs/install/rocThrust-install-with-cmake.rst +++ b/projects/rocthrust/docs/install/rocThrust-install-with-cmake.rst @@ -44,6 +44,7 @@ The build options are: * ``EXTERNAL_DEPS_FORCE_DOWNLOAD``. Set this to ``ON`` to download the non-ROCm dependencies such as Google Test even if they're already installed. Default is ``OFF``. * ``USE_HIPCXX``. Set this to ``ON`` to build with CMake HIP language support. Setting this to ``ON`` eliminates the need to use ``CXX=hipcc``. Default is ``OFF``. * ``ROCPRIM_FETCH_METHOD`` and ``ROCRAND_FETCH_METHOD``. Set these to the method to use to download the rocPRIM and rocRAND components, respectively. Can be set to ``PACKAGE``, ``DOWNLOAD``, or ``MONOREPO``. Set to ``MONOREPO`` if the component isn't already installed and you're building rocThrust from within a clone of the `rocm-libraries `_ repository that includes the component. Set to ``DOWNLOAD`` if the component isn't installed and you aren't in a clone of the ``rocm-libraries`` repository that includes the component. ``DOWNLOAD`` will clone the repository using sparse checkout so that only the necessary files are downloaded. Set to ``PACKAGE`` if the component is already installed. If the component isn't installed, it'll be downloaded form the repository in the same way as using the ``DOWNLOAD`` option. The default method is ``PACKAGE``. +* ``ROCTHRUST_DEVICE_SYSTEM``. This option controls how rocThrust is linked. It may be set to one of: ``HIP``, ``CUDA``, ``TBB``, ``OpenMP``, or ``CPP``. If it's set to ``HIP`` or ``CUDA``, then the code links against device dependencies (eg. for ``HIP``, it looks for rocPRIM). If it's set to ``CPP``, then it does not link against device dependencies - it performs host-side compuation only. .. note:: diff --git a/projects/rocthrust/thrust/CMakeLists.txt b/projects/rocthrust/thrust/CMakeLists.txt index 1298b1d9fde9..dc4354604900 100644 --- a/projects/rocthrust/thrust/CMakeLists.txt +++ b/projects/rocthrust/thrust/CMakeLists.txt @@ -20,10 +20,12 @@ target_include_directories(rocthrust $ ) -target_link_libraries(rocthrust - INTERFACE +if(${ROCTHRUST_DEVICE_SYSTEM} STREQUAL "HIP") + target_link_libraries(rocthrust + INTERFACE roc::rocprim_hip -) + ) +endif() # hipstdpar header target add_library(hipstdpar INTERFACE) @@ -57,9 +59,17 @@ rocm_install( ) include(ROCMExportTargetsHeaderOnly) -# Export targets -rocm_export_targets_header_only( - TARGETS roc::rocthrust - DEPENDS PACKAGE rocprim - NAMESPACE roc:: -) + +if(${ROCTHRUST_DEVICE_SYSTEM} STREQUAL "HIP") + # Export targets + rocm_export_targets_header_only( + TARGETS roc::rocthrust + DEPENDS PACKAGE rocprim + NAMESPACE roc:: + ) +else() + rocm_export_targets_header_only( + TARGETS roc::rocthrust + NAMESPACE roc:: + ) +endif() diff --git a/projects/rocthrust/thrust/detail/alignment.h b/projects/rocthrust/thrust/detail/alignment.h index 41aec7cfbca5..ddcbd4bf0ece 100644 --- a/projects/rocthrust/thrust/detail/alignment.h +++ b/projects/rocthrust/thrust/detail/alignment.h @@ -34,7 +34,7 @@ #if _THRUST_HAS_DEVICE_SYSTEM_STD # include _THRUST_LIBCXX_INCLUDE(cmath) -#else +#elif _THRUST_USE_ROCPRIM # include #endif @@ -82,8 +82,10 @@ THRUST_HOST_DEVICE inline _THRUST_STD::size_t aligned_storage_size(_THRUST_STD:: { #if _THRUST_HAS_DEVICE_SYSTEM_STD return _THRUST_LIBCXX::ceil_div(n, align) * align; -#else +#elif _THRUST_USE_ROCPRIM return ::rocprim::detail::ceiling_div(n, align) * align; +#else + return (n / align + (n % align > 0 ? 1 : 0)) * align; #endif } } // end namespace detail diff --git a/projects/rocthrust/thrust/detail/config/device_system.h b/projects/rocthrust/thrust/detail/config/device_system.h index b5720f70137f..0950771033c0 100644 --- a/projects/rocthrust/thrust/detail/config/device_system.h +++ b/projects/rocthrust/thrust/detail/config/device_system.h @@ -29,7 +29,7 @@ #ifndef THRUST_DEVICE_SYSTEM # if THRUST_DEVICE_COMPILER == THRUST_DEVICE_COMPILER_HIP # define THRUST_DEVICE_SYSTEM THRUST_DEVICE_SYSTEM_HIP -# elif THRUST_DEVICE_COMPILER == THRUST_DEVICE_COMPILER_CLANG +# elif THRUST_DEVICE_COMPILER == THRUST_DEVICE_COMPILER_CLANG || THRUST_DEVICE_COMPILER == THRUST_DEVICE_COMPILER_GCC # define THRUST_DEVICE_SYSTEM THRUST_DEVICE_SYSTEM_CPP # else # define THRUST_DEVICE_SYSTEM THRUST_DEVICE_SYSTEM_CUDA diff --git a/projects/rocthrust/thrust/detail/config/libcxx.h b/projects/rocthrust/thrust/detail/config/libcxx.h index d7fadee3427c..99470f7c8f36 100644 --- a/projects/rocthrust/thrust/detail/config/libcxx.h +++ b/projects/rocthrust/thrust/detail/config/libcxx.h @@ -53,6 +53,7 @@ # define _THRUST_HAS_DEVICE_SYSTEM_STD 1 # define _THRUST_STD_NAMESPACE_BEGIN _LIBCUDACXX_BEGIN_NAMESPACE_STD # define _THRUST_STD_NAMESPACE_END _LIBCUDACXX_END_NAMESPACE_STD +# define _THRUST_USE_ROCPRIM 0 # endif // Otherwise, if the '::hip::std' namespace from 'libhipcxx' is available. @@ -71,6 +72,7 @@ # define _THRUST_HAS_DEVICE_SYSTEM_STD 1 # define _THRUST_STD_NAMESPACE_BEGIN _LIBCUDACXX_BEGIN_NAMESPACE_STD # define _THRUST_STD_NAMESPACE_END _LIBCUDACXX_END_NAMESPACE_STD +# define _THRUST_USE_ROCPRIM 0 # endif #endif @@ -85,4 +87,5 @@ namespace std \ { # define _THRUST_STD_NAMESPACE_END } +# define _THRUST_USE_ROCPRIM (THRUST_DEVICE_SYSTEM != THRUST_DEVICE_SYSTEM_CPP) #endif diff --git a/projects/rocthrust/thrust/detail/type_traits.h b/projects/rocthrust/thrust/detail/type_traits.h index 7ef586b2766f..b99765559b19 100644 --- a/projects/rocthrust/thrust/detail/type_traits.h +++ b/projects/rocthrust/thrust/detail/type_traits.h @@ -34,7 +34,7 @@ #include _THRUST_STD_INCLUDE(type_traits) -#if !_THRUST_HAS_DEVICE_SYSTEM_STD +#if !_THRUST_HAS_DEVICE_SYSTEM_STD && _THRUST_USE_ROCPRIM # include # include #endif // !_THRUST_HAS_DEVICE_SYSTEM_STD @@ -75,7 +75,11 @@ template using make_unsigned_t = typename ::std::make_unsigned::type; template +#if _THRUST_USE_ROCPRIM using accumulator_t = ::rocprim::accumulator_t; +#else +using accumulator_t = _THRUST_STD::decay_t<_THRUST_STD::invoke_result_t>; +#endif template // If we're not on Windows and we have libstdc++ >= 10, we can use the __decay_t // builtin to reduce compilation time. @@ -146,7 +150,7 @@ struct is_unbounded_array : public thrust::detail::true_type template struct is_bounded_array : public thrust::detail::false_type {}; -template +template struct is_bounded_array : public thrust::detail::true_type {}; @@ -233,8 +237,10 @@ struct larger_type template #if _THRUST_HAS_DEVICE_SYSTEM_STD using invoke_result = _THRUST_STD::__invoke_of; -#else // !_THRUST_HAS_DEVICE_SYSTEM_STD +#elif _THRUST_USE_ROCPRIM // !_THRUST_HAS_DEVICE_SYSTEM_STD using invoke_result = ::rocprim::invoke_result; +#else +using invoke_result = _THRUST_STD::invoke_result; #endif // _THRUST_HAS_DEVICE_SYSTEM_STD template diff --git a/projects/rocthrust/thrust/iterator/zip_iterator.h b/projects/rocthrust/thrust/iterator/zip_iterator.h index 7114fc7905a5..8c854d46fdc6 100644 --- a/projects/rocthrust/thrust/iterator/zip_iterator.h +++ b/projects/rocthrust/thrust/iterator/zip_iterator.h @@ -131,6 +131,7 @@ THRUST_NAMESPACE_BEGIN * \see tuple * \see get */ + template class THRUST_DECLSPEC_EMPTY_BASES zip_iterator : public detail::zip_iterator_base::type { diff --git a/projects/rocthrust/thrust/pair.h b/projects/rocthrust/thrust/pair.h index 19e6a4105f14..377af3a36f34 100644 --- a/projects/rocthrust/thrust/pair.h +++ b/projects/rocthrust/thrust/pair.h @@ -298,7 +298,7 @@ inline THRUST_HOST_DEVICE pair make_pair(T1 x, T2 y); * \tparam N This parameter selects the member of interest. * \tparam T A \c pair type of interest. */ -template +template <_THRUST_STD::size_t N, class T> struct tuple_element; /*! This convenience metafunction is included for compatibility with diff --git a/projects/rocthrust/thrust/system/detail/sequential/iter_swap.h b/projects/rocthrust/thrust/system/detail/sequential/iter_swap.h index ee40acad2062..c7eb2753aa3f 100644 --- a/projects/rocthrust/thrust/system/detail/sequential/iter_swap.h +++ b/projects/rocthrust/thrust/system/detail/sequential/iter_swap.h @@ -43,7 +43,7 @@ namespace sequential template THRUST_HOST_DEVICE void iter_swap(sequential::execution_policy&, Pointer1 a, Pointer2 b) { -#if _THRUST_HAS_DEVICE_SYSTEM_STD +#if _THRUST_HAS_DEVICE_SYSTEM_STD || THRUST_DEVICE_SYSTEM == THRUST_DEVICE_SYSTEM_CPP using _THRUST_STD::swap; #else using thrust::swap;