Thrust Versions Save

[ARCHIVED] The C++ parallel algorithms library. See https://github.com/NVIDIA/cccl

1.16.0

2 years ago

Summary

Thrust 1.16.0 provides a new “nosync” hint for the CUDA backend, as well as numerous bugfixes and stability improvements.

New thrust::cuda::par_nosync Execution Policy

Most of Thrust’s parallel algorithms are fully synchronous and will block the calling CPU thread until all work is completed. This design avoids many pitfalls associated with asynchronous GPU programming, resulting in simpler and less-error prone usage for new CUDA developers. Unfortunately, this improvement in user experience comes at a performance cost that often frustrates more experienced CUDA programmers.

Prior to this release, the only synchronous-to-asynchronous migration path for existing Thrust codebases involved significant refactoring, replacing calls to thrust algorithms with a limited set of future-based thrust::async algorithms or lower-level CUB kernels. The new thrust::cuda::par_nosync execution policy provides a new, less-invasive entry point for asynchronous computation.

par_nosync is a hint to the Thrust execution engine that any non-essential internal synchronizations should be skipped and that an explicit synchronization will be performed by the caller before accessing results.

While some Thrust algorithms require internal synchronization to safely compute their results, many do not. For example, multiple thrust::for_each invocations can be launched without waiting for earlier calls to complete:

// Queue three `for_each` kernels:
thrust::for_each(thrust::cuda::par_nosync, vec1.begin(), vec1.end(), Op{});
thrust::for_each(thrust::cuda::par_nosync, vec2.begin(), vec2.end(), Op{});
thrust::for_each(thrust::cuda::par_nosync, vec3.begin(), vec3.end(), Op{});

// Do other work while kernels execute:
do_something();

// Must explictly synchronize before accessing `for_each` results:
cudaDeviceSynchronize();

Thanks to @fkallen for this contribution.

Deprecation Notices

CUDA Dynamic Parallelism Support

A future version of Thrust will remove support for CUDA Dynamic Parallelism (CDP).

This will only affect calls to Thrust algorithms made from CUDA device-side code that currently launches a kernel; such calls will instead execute sequentially on the calling GPU thread instead of launching a device-wide kernel.

Breaking Changes

  • Thrust 1.14.0 included a change that aliased the cub namespace to thrust::cub. This has caused issues with ambiguous namespaces for projects that declare using namespace thrust; from the global namespace. We recommend against this practice.
  • NVIDIA/thrust#1572: Removed several unnecessary header includes. Downstream projects may need to update their includes if they were relying on this behavior.

New Features

  • NVIDIA/thrust#1568: Add thrust::cuda::par_nosync policy. Thanks to @fkallen for this contribution.

Enhancements

  • NVIDIA/thrust#1511: Use CUB’s new DeviceMergeSort API and remove Thrust’s internal implementation.
  • NVIDIA/thrust#1566: Improved performance of thrust::shuffle. Thanks to @djns99 for this contribution.
  • NVIDIA/thrust#1584: Support user-defined CMAKE_INSTALL_INCLUDEDIR values in Thrust’s CMake install rules. Thanks to @robertmaynard for this contribution.

Bug Fixes

  • NVIDIA/thrust#1496: Fix some issues affecting icc builds.
  • NVIDIA/thrust#1552: Fix some collisions with the min/max macros defined in windows.h.
  • NVIDIA/thrust#1582: Fix issue with function type alias on 32-bit MSVC builds.
  • NVIDIA/thrust#1591: Workaround issue affecting compilation with nvc++.
  • NVIDIA/thrust#1597: Fix some collisions with the small macro defined in windows.h.
  • NVIDIA/thrust#1599, NVIDIA/thrust#1603: Fix some issues with version handling in Thrust’s CMake packages.
  • NVIDIA/thrust#1614: Clarify that scan algorithm results are non-deterministic for pseudo-associative operators (e.g. floating-point addition).

1.16.0-rc1

2 years ago

Summary

Thrust 1.16.0 provides a new “nosync” hint for the CUDA backend, as well as numerous bugfixes and stability improvements.

New thrust::cuda::par_nosync Execution Policy

Most of Thrust’s parallel algorithms are fully synchronous and will block the calling CPU thread until all work is completed. This design avoids many pitfalls associated with asynchronous GPU programming, resulting in simpler and less-error prone usage for new CUDA developers. Unfortunately, this improvement in user experience comes at a performance cost that often frustrates more experienced CUDA programmers.

Prior to this release, the only synchronous-to-asynchronous migration path for existing Thrust codebases involved significant refactoring, replacing calls to thrust algorithms with a limited set of future-based thrust::async algorithms or lower-level CUB kernels. The new thrust::cuda::par_nosync execution policy provides a new, less-invasive entry point for asynchronous computation.

par_nosync is a hint to the Thrust execution engine that any non-essential internal synchronizations should be skipped and that an explicit synchronization will be performed by the caller before accessing results.

While some Thrust algorithms require internal synchronization to safely compute their results, many do not. For example, multiple thrust::for_each invocations can be launched without waiting for earlier calls to complete:

// Queue three `for_each` kernels:
thrust::for_each(thrust::cuda::par_nosync, vec1.begin(), vec1.end(), Op{});
thrust::for_each(thrust::cuda::par_nosync, vec2.begin(), vec2.end(), Op{});
thrust::for_each(thrust::cuda::par_nosync, vec3.begin(), vec3.end(), Op{});

// Do other work while kernels execute:
do_something();

// Must explictly synchronize before accessing `for_each` results:
cudaDeviceSynchronize();

Thanks to @fkallen for this contribution.

Deprecation Notices

CUDA Dynamic Parallelism Support

A future version of Thrust will remove support for CUDA Dynamic Parallelism (CDP).

This will only affect calls to Thrust algorithms made from CUDA device-side code that currently launches a kernel; such calls will instead execute sequentially on the calling GPU thread instead of launching a device-wide kernel.

Breaking Changes

  • Thrust 1.14.0 included a change that aliased the cub namespace to thrust::cub. This has caused issues with ambiguous namespaces for projects that declare using namespace thrust; from the global namespace. We recommend against this practice.
  • NVIDIA/thrust#1572: Removed several unnecessary header includes. Downstream projects may need to update their includes if they were relying on this behavior.

New Features

  • NVIDIA/thrust#1568: Add thrust::cuda::par_nosync policy. Thanks to @fkallen for this contribution.

Enhancements

  • NVIDIA/thrust#1511: Use CUB’s new DeviceMergeSort API and remove Thrust’s internal implementation.
  • NVIDIA/thrust#1566: Improved performance of thrust::shuffle. Thanks to @djns99 for this contribution.
  • NVIDIA/thrust#1584: Support user-defined CMAKE_INSTALL_INCLUDEDIR values in Thrust’s CMake install rules. Thanks to @robertmaynard for this contribution.

Bug Fixes

  • NVIDIA/thrust#1496: Fix some issues affecting icc builds.
  • NVIDIA/thrust#1552: Fix some collisions with the min/max macros defined in windows.h.
  • NVIDIA/thrust#1582: Fix issue with function type alias on 32-bit MSVC builds.
  • NVIDIA/thrust#1591: Workaround issue affecting compilation with nvc++.
  • NVIDIA/thrust#1597: Fix some collisions with the small macro defined in windows.h.
  • NVIDIA/thrust#1599, NVIDIA/thrust#1603: Fix some issues with version handling in Thrust’s CMake packages.
  • NVIDIA/thrust#1614: Clarify that scan algorithm results are non-deterministic for pseudo-associative operators (e.g. floating-point addition).

1.15.0

2 years ago

Summary

Thrust 1.15.0 provides numerous bugfixes, including non-numeric thrust::sequence support, several MSVC-related compilation fixes, fewer conversion warnings, counting_iterator initialization, and documentation updates.

Deprecation Notices

A future version of Thrust will remove support for CUDA Dynamic Parallelism (CDP).

This will only affect calls to Thrust algorithms made from CUDA device-side code that currently launches a kernel; such calls will instead execute sequentially on the calling GPU thread instead of launching a device-wide kernel.

Bug Fixes

  • NVIDIA/thrust#1507: Allow thrust::sequence to work with non-numeric types. Thanks to Ben Jude (@bjude) for this contribution.
  • NVIDIA/thrust#1509: Avoid macro collision when calling max() on MSVC. Thanks to Thomas (@tomintheshell) for this contribution.
  • NVIDIA/thrust#1514: Initialize all members in counting_iterator's default constructor.
  • NVIDIA/thrust#1518: Fix std::allocator_traits on MSVC + C++17.
  • NVIDIA/thrust#1530: Fix several -Wconversion warnings. Thanks to Matt Stack (@matt-stack) for this contribution.
  • NVIDIA/thrust#1539: Fixed typo in thrust::for_each documentation. Thanks to Salman (@untamedImpala) for this contribution.
  • NVIDIA/thrust#1548: Avoid name collision with B0 macro in termios.h system header. Thanks to Philip Deegan (@PhilipDeegan) for this contribution.

1.13.1

2 years ago

Thrust 1.13.1 is a minor release accompanying the CUDA Toolkit 11.5.

This release provides a new hook for embedding the thrust:: namespace inside a custom namespace. This is intended to work around various issues related to linking multiple shared libraries that use Thrust. The existing CUB_NS_PREFIX and CUB_NS_POSTFIX macros already provided this capability for CUB; this update provides a simpler mechanism that is extended to and integrated with Thrust. Simply define THRUST_CUB_WRAPPED_NAMESPACE to a namespace name, and both thrust:: and cub:: will be placed inside the new namespace. Using different wrapped namespaces for each shared library will prevent issues like those reported in NVIDIA/thrust#1401.

New Features

  • NVIDIA/thrust#1464: Add THRUST_CUB_WRAPPED_NAMESPACE hooks.

Bug Fixes

  • NVIDIA/thrust#1488: Fix path to installed CUB in Thrust's CMake config files.

1.14.0

2 years ago

Thrust 1.14.0 is a major release accompanying the NVIDIA HPC SDK 21.9.

This release adds the ability to wrap the thrust:: namespace in an external namespace, providing a workaround for a variety of shared library linking issues. Thrust also learned to detect when CUB's symbols are in a wrapped namespace and properly import them. To enable this feature, use #define THRUST_CUB_WRAPPED_NAMESPACE foo to wrap both Thrust and CUB in the foo:: namespace. See thrust/detail/config/namespace.h for details and more namespace options.

Several bugfixes are also included: The tuple_size and tuple_element helpers now support cv-qualified types. scan_by_key uses less memory. thrust::iterator_traits is better integrated with std::iterator_traits. See below for more details and references.

New Features

  • NVIDIA/thrust#1464: Add preprocessor hooks that allow thrust:: to be wrapped in an external namespace, and support cases when CUB is wrapped in an external namespace.

Bug Fixes

  • NVIDIA/thrust#1457: Support cv-qualified types in thrust::tuple_size and thrust::tuple_element. Thanks to Jake Hemstad for this contribution.
  • NVIDIA/thrust#1471: Fixed excessive memory allocation in scan_by_key. Thanks to Lilo Huang for this contribution.
  • NVIDIA/thrust#1476: Removed dead code from the expand example. Thanks to Lilo Huang for this contribution.
  • NVIDIA/thrust#1488: Fixed the path to the installed CUB headers in the CMake find_package configuration files.
  • NVIDIA/thrust#1491: Fallback to std::iterator_traits when no thrust::iterator_traits specialization exists for an iterator type. Thanks to Divye Gala for this contribution.

1.13.0

2 years ago

Thrust 1.13.0 is the major release accompanying the NVIDIA HPC SDK 21.7 release.

Notable changes include bfloat16 radix sort support (via thrust::sort) and memory handling fixes in the reserve method of Thrust's vectors. The CONTRIBUTING.md file has been expanded to include instructions for building CUB as a component of Thrust, and API documentation now refers to cppreference instead of SGI's STL reference.

Breaking Changes

  • NVIDIA/thrust#1459: Remove deprecated aliases thrust::host_space_tag and thrust::device_space_tag. Use the equivalent thrust::host_system_tag and thrust::device_system_tag instead.

New Features

  • NVIDIA/cub#306: Add radix-sort support for bfloat16 in thrust::sort. Thanks to Xiang Gao (@zasdfgbnm) for this contribution.
  • NVIDIA/thrust#1423: thrust::transform_iterator now supports non-copyable types. Thanks to Jake Hemstad (@jrhemstad) for this contribution.
  • NVIDIA/thrust#1459: Introduce a new THRUST_IGNORE_DEPRECATED_API macro that disables deprecation warnings on Thrust and CUB APIs.

Bug Fixes

  • NVIDIA/cub#277: Fixed sanitizer warnings when thrust::sort calls into cub::DeviceRadixSort. Thanks to Andy Adinets (@canonizer) for this contribution.
  • NVIDIA/thrust#1442: Reduce extraneous comparisons in thrust::sort's merge sort implementation.
  • NVIDIA/thrust#1447: Fix memory leak and avoid overallocation when calling reserve on Thrust's vector containers. Thanks to Kai Germaschewski (@germasch) for this contribution.

Other Enhancements

  • NVIDIA/thrust#1405: Update links to standard C++ documentations from sgi to cppreference. Thanks to Muhammad Adeel Hussain (@AdeilH) for this contribution.
  • NVIDIA/thrust#1432: Updated build instructions in CONTRIBUTING.md to include details on building CUB's test suite as part of Thrust.

1.12.1

2 years ago

Thrust 1.12.1 is a trivial patch release that slightly changes the phrasing of a deprecation message.

1.12.0

3 years ago

Summary

Thrust 1.12.0 is the major release accompanying the NVIDIA HPC SDK 21.3 and the CUDA Toolkit 11.4.

It includes a new thrust::universal_vector, which holds data that is accessible from both host and device. This allows users to easily leverage CUDA's unified memory with Thrust.

New asynchronous thrust::async:exclusive_scan and inclusive_scan algorithms have been added, and the synchronous versions of these have been updated to use cub::DeviceScan directly.

Many compilation warnings and subtle overflow bugs were fixed in the device algorithms, including a long-standing bug that returned invalid temporary storage requirements when num_items was close to (but not exceeding) INT32_MAX.

This release deprecates support for Clang < 7.0 and MSVC < 2019 (aka 19.20/16.0/14.20).

Breaking Changes

  • NVIDIA/thrust#1372: Deprecate Clang < 7 and MSVC < 2019.
  • NVIDIA/thrust#1376: Standardize thrust::scan_by_key functors / accumulator types. This may change the results from scan_by_key when input, output, and initial value types are not the same type.

New Features

  • NVIDIA/thrust#1251: Add two new thrust::async:: algorithms: inclusive_scan and exclusive_scan.
  • NVIDIA/thrust#1334: Add thrust::universal_vector, universal_ptr, and universal_allocator.

Bug Fixes

  • NVIDIA/thrust#1347: Qualify calls to make_reverse_iterator.
  • NVIDIA/thrust#1359: Enable stricter warning flags. This fixes several outstanding issues:
    • NVIDIA/cub#221: Overflow in temp_storage_bytes when num_items close to (but not over) INT32_MAX.
    • NVIDIA/cub#228: CUB uses non-standard C++ extensions that break strict compilers.
    • NVIDIA/cub#257: Warning when compiling GridEvenShare with unsigned offsets.
    • NVIDIA/thrust#974: Conversion warnings in thrust::transform_reduce.
    • NVIDIA/thrust#1091: Conversion warnings in thrust::counting_iterator.
  • NVIDIA/thrust#1373: Fix compilation error when a standard library type is wrapped in thrust::optional. Thanks to Vukasin Milovanovic for this contribution.
  • NVIDIA/thrust#1388: Fix signbit(double) implementation on MSVC.
  • NVIDIA/thrust#1389: Support building Thrust tests without CUDA enabled.

Other Enhancements

  • NVIDIA/thrust#1304: Use cub::DeviceScan to implement thrust::exclusive_scan and thrust::inclusive_scan.
  • NVIDIA/thrust#1362, NVIDIA/thrust#1370: Update smoke test naming.
  • NVIDIA/thrust#1380: Fix typos in set_operation documentation. Thanks to Hongyu Cai for this contribution.
  • NVIDIA/thrust#1383: Include FreeBSD license in LICENSE.md for thrust::complex implementation.
  • NVIDIA/thrust#1384: Add missing precondition to thrust::gather documentation.

1.11.0

3 years ago

Thrust 1.11.0 is a major release providing bugfixes and performance enhancements. It includes a new sort algorithm that provides up to 2x more performance from thrust::sort when used with certain key types and hardware. The new thrust::shuffle algorithm has been tweaked to improve the randomness of the output. Our CMake package and build system continue to see improvements with better add_subdirectory support, installation rules, status messages, and other features that make Thrust easier to use from CMake projects. The release includes several other bugfixes and modernizations, and received updates from 12 contributors.

New Features

  • NVIDIA/cub#204: New implementation for thrust::sort on CUDA when using 32/64-bit numeric keys on Pascal and up (SM60+). This improved radix sort algorithm provides up to 2x more performance. Thanks for Andy Adinets for this contribution.
  • NVIDIA/thrust#1310, NVIDIA/thrust#1312: Various tuple-related APIs have been updated to use variadic templates. Thanks for Andrew Corrigan for these contributions.
  • NVIDIA/thrust#1297: Optionally add install rules when included with CMake's add_subdirectory. Thanks to Kai Germaschewski for this contribution.

Bug Fixes

  • NVIDIA/thrust#1309: Fix thrust::shuffle to produce better quality random distributions. Thanks to Rory Mitchell and Daniel Stokes for this contribution.
  • NVIDIA/thrust#1337: Fix compile-time regression in transform_inclusive_scan and transform_exclusive_scan.
  • NVIDIA/thrust#1306: Fix binary search middle calculation to avoid overflows. Thanks to Richard Barnes for this contribution.
  • NVIDIA/thrust#1314: Use size_t for the index type parameter in thrust::tuple_element. Thanks to Andrew Corrigan for this contribution.
  • NVIDIA/thrust#1329: Fix runtime error when copying an empty thrust::device_vector in MSVC Debug builds. Thanks to Ben Jude for this contribution.
  • NVIDIA/thrust#1323: Fix and add test for cmake package install rules. Thanks for Keith Kraus and Kai Germaschewski for testing and discussion.
  • NVIDIA/thrust#1338: Fix GCC version checks in thrust::detail::is_pod implementation. Thanks to Anatoliy Tomilov for this contribution.
  • NVIDIA/thrust#1289: Partial fixes for Clang 10 as host/c++ compiler. Exposed an nvcc bug that will be fixed in a future version of the CUDA Toolkit (NVBug 3136307).
  • NVIDIA/thrust#1272: Fix ambiguous iter_swap call when using thrust::partition with STL containers. Thanks to Isaac Deutsch for this contribution.
  • NVIDIA/thrust#1281: Update our bundled FindTBB.cmake module to support latest MSVC.
  • NVIDIA/thrust#1298: Use semantic versioning rules for our CMake package's compatibility checks. Thanks to Kai Germaschewski for this contribution.
  • NVIDIA/thrust#1300: Use FindPackageHandleStandardArgs to print standard status messages when our CMake package is found. Thanks to Kai Germaschewski for this contribution.
  • NVIDIA/thrust#1320: Use feature-testing instead of a language dialect check for thrust::remove_cvref. Thanks to Andrew Corrigan for this contribution.
  • NVIDIA/thrust#1319: Suppress GPU deprecation warnings.

Other Enhancements

  • NVIDIA/cub#213: Removed some tuning policies for unsupported hardware (<SM35).
  • References to the old Github repository and branch names were updated.
    • Github's thrust/cub repository is now NVIDIA/cub
    • Development has moved from the master branch to the main branch.

1.10.0

3 years ago

Thrust 1.10.0 is the major release accompanying the NVIDIA HPC SDK 20.9 release and the CUDA Toolkit 11.2 release. It drops support for C++03, GCC < 5, Clang < 6, and MSVC < 2017. It also overhauls CMake support. Finally, we now have a Code of Conduct for contributors: https://github.com/thrust/thrust/blob/main/CODE_OF_CONDUCT.md

Breaking Changes

  • C++03 is no longer supported.
  • GCC < 5, Clang < 6, and MSVC < 2017 are no longer supported.
  • C++11 is deprecated. Using this dialect will generate a compile-time warning. These warnings can be suppressed by defining THRUST_IGNORE_DEPRECATED_CPP_DIALECT or THRUST_IGNORE_DEPRECATED_CPP_11. Suppression is only a short term solution. We will be dropping support for C++11 in the near future.
  • Asynchronous algorithms now require C++14.
  • CMake < 3.15 is no longer supported.
  • The default branch on GitHub is now called main.
  • Allocator and vector classes have been replaced with alias templates.

New Features

  • thrust/thrust#1159: CMake multi-config support, which allows multiple combinations of host and device systems to be built and tested at once. More details can be found here: https://github.com/thrust/thrust/blob/main/CONTRIBUTING.md#multi-config-cmake-options
  • CMake refactoring:
    • Added install targets to CMake builds.
    • Added support for CUB tests and examples.
    • Thrust can be added to another CMake project by calling add_subdirectory with the Thrust source root (see thrust/thrust#976). An example can be found here: https://github.com/thrust/thrust/blob/main/examples/cmake/add_subdir/CMakeLists.txt
    • CMake < 3.15 is no longer supported.
    • Dialects are now configured through target properties. A new THRUST_CPP_DIALECT option has been added for single config mode. Logic that modified CMAKE_CXX_STANDARD and CMAKE_CUDA_STANDARD has been eliminated.
    • Testing related CMake code has been moved to testing/CMakeLists.txt
    • Example related CMake code has been moved to examples/CMakeLists.txt
    • Header testing related CMake code has been moved to cmake/ThrustHeaderTesting.cmake
    • CUDA configuration CMake code has been moved to to cmake/ThrustCUDAConfig.cmake.
    • Now we explicitly include(cmake/*.cmake) files rather than searching CMAKE_MODULE_PATH - we only want to use the ones in the repo.
  • thrust::transform_input_output_iterator, a variant of transform iterator adapter that works as both an input iterator and an output iterator. The given input function is applied after reading from the wrapped iterator while the output function is applied before writing to the wrapped iterator. Thanks to Trevor Smith for this contribution.

Other Enhancements

  • Contributor documentation: https://github.com/thrust/thrust/blob/main/CONTRIBUTING.md
  • Code of Conduct: https://github.com/thrust/thrust/blob/main/CODE_OF_CONDUCT.md. Thanks to Conor Hoekstra for this contribution.
  • Support for all combinations of host and device systems.
  • C++17 support.
  • thrust/thrust#1221: Allocator and vector classes have been replaced with alias templates. Thanks to Michael Francis for this contribution.
  • thrust/thrust#1186: Use placeholder expressions to simplify the definitions of a number of algorithms. Thanks to Michael Francis for this contribution.
  • thrust/thrust#1170: More conforming semantics for scan algorithms:
    • Follow P0571's guidance regarding intermediate types.
      • https://wg21.link/P0571
      • The accumulator's type is now:
        • The type of the user-supplied initial value (if provided), or
        • The input iterator's value type if no initial value.
    • Follow C++ standard guidance for default binary operator type.
      • https://eel.is/c++draft/exclusive.scan#1
      • Thrust binary/unary functors now specialize a default void template parameter. Types are deduced and forwarded transparently.
      • Updated the scan's default binary operator to the new thrust::plus<> specialization.
    • The thrust::intermediate_type_from_function_and_iterators helper is no longer needed and has been removed.
  • thrust/thrust#1255: Always use cudaStreamSynchronize instead of cudaDeviceSynchronize if the execution policy has a stream attached to it. Thanks to Rong Ou for this contribution.
  • thrust/thrust#1201: Tests for correct handling of legacy and per-thread default streams. Thanks to Rong Ou for this contribution.

Bug Fixes

  • thrust/thrust#1260: Fix thrust::transform_inclusive_scan with heterogeneous types. Thanks to Rong Ou for this contribution.
  • thrust/thrust#1258, NVC++ FS #28463: Ensure the CUDA radix sort backend synchronizes before returning; otherwise, copies from temporary storage will race with destruction of said temporary storage.
  • thrust/thrust#1264: Evaluate CUDA_CUB_RET_IF_FAIL macro argument only once. Thanks to Jason Lowe for this contribution.
  • thrust/thrust#1262: Add missing <stdexcept> header.
  • thrust/thrust#1250: Restore some THRUST_DECLTYPE_RETURNS macros in async test implementations.
  • thrust/thrust#1249: Use std::iota in CUDATestDriver::target_devices. Thanks to Michael Francis for this contribution.
  • thrust/thrust#1244: Check for macro collisions with system headers during header testing.
  • thrust/thrust#1224: Remove unnecessary SFINAE contexts from asynchronous algorithms.
  • thrust/thrust#1190: Make out_of_memory_recovery test trigger faster.
  • thrust/thrust#1187: Elminate superfluous iterators specific to the CUDA backend.
  • thrust/thrust#1181: Various fixes for GoUDA. Thanks to Andrei Tchouprakov for this contribution.
  • thrust/thrust#1178, thrust/thrust#1229: Use transparent functionals in placeholder expressions, fixing issues with thrust::device_reference and placeholder expressions and thrust::find with asymmetric equality operators.
  • thrust/thrust#1153: Switch to placement new instead of assignment to construct items in uninitialized memory. Thanks to Hugh Winkler for this contribution.
  • thrust/thrust#1050: Fix compilation of asynchronous algorithms when RDC is enabled.
  • thrust/thrust#1042: Correct return type of thrust::detail::predicate_to_integral from bool to IntegralType. Thanks to Andreas Hehn for this contribution.
  • thrust/thrust#1009: Avoid returning uninitialized allocators. Thanks to Zhihao Yuan for this contribution.
  • thrust/thrust#990: Add missing <thrust/system/cuda/memory.h> include to <thrust/system/cuda/detail/malloc_and_free.h>. Thanks to Robert Maynard for this contribution.
  • thrust/thrust#966: Fix spurious MSVC conversion with loss of data warning in sort algorithms. Thanks to Zhihao Yuan for this contribution.
  • Add more metadata to mock specializations for testing iterator in testing/copy.cu.
  • Add missing include to shuffle unit test.
  • Specialize thrust::wrapped_function for void return types because MSVC is not a fan of the pattern return static_cast<void>(expr);.
  • Replace deprecated tbb/tbb_thread.h with <thread>.
  • Fix overcounting of initial value in TBB scans.
  • Use thrust::advance instead of += for generic iterators.
  • Wrap the OMP flags in -Xcompiler for NVCC
  • Extend ASSERT_STATIC_ASSERT skip for the OMP backend.
  • Add missing header caught by tbb.cuda configs.
  • Fix "unsafe API" warnings in examples on MSVC: s/fopen/fstream/
  • Various C++17 fixes.