[libc++] Take 2: Integrate the PSTL into libc++ Summary: This commit allows specifying LIBCXX_ENABLE_PARALLEL_ALGORITHMS when configuring libc++ in CMake. When that option is enabled, libc++ will assume that the PSTL can be found somewhere on the CMake module path, and it will provide the C++17 parallel algorithms based on the PSTL (that is assumed to be available). The commit also adds support for running the PSTL tests as part of the libc++ test suite. The first attempt to commit this failed because it exposed a bug in the tests for modules. Now that this has been fixed, it should be safe to commit this. Reviewers: EricWF Subscribers: mgorny, christof, jkorous, dexonsmith, libcxx-commits, mclow.lists, EricWF Tags: #libc Differential Revision: https://reviews.llvm.org/D60480 llvm-svn: 367903 GitOrigin-RevId: 0a06eb911b830cf693747ea6cd975bd97b454e3e
Parallel STL is an implementation of the C++ standard library algorithms with support for execution policies, as specified in ISO/IEC 14882:2017 standard, commonly called C++17. The implementation also supports the unsequenced execution policy specified in Parallelism TS version 2 and proposed for the next version of the C++ standard in the C++ working group paper P1001. Parallel STL offers efficient support for both parallel and vectorized execution of algorithms. For sequential execution, it relies on an available implementation of the C++ standard library.
To use Parallel STL, you must have the following software installed:
unseq and par_unseq policies only have effect with compilers that support #pragma omp simd or #pragma simd.includes, inplace_merge, merge, nth_element, partial_sort, partial_sort_copy, set_difference, set_intersection, set_symmetric_difference, set_union, sort, stable_partition, stable_sort, unique.exclusive_scan, inclusive_scan, transform_exclusive_scan, transform_inclusive_scan shall be DefaultConstructible. A default constructed-instance of the initial value type shall be the identity element for the specified binary operation.max_element, min_element, minmax_element, partial_sort, partial_sort_copy, sort, stable_sort the dereferenced value type of the provided iterators shall be DefaultConstructible.remove, remove_if, unique the dereferenced value type of the provided iterators shall be MoveConstructible.copy_if, inplace_merge, partial_sort, partial_sort_copy, partition_copy, remove, remove_if, rotate, sort, stable_sort, unique, unique_copy.