[libcxx-commits] [PATCH] D155136: [libc++][PSTL] Add a __parallel_sort implementation to libdispatch

Louis Dionne via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Thu Jul 13 12:01:33 PDT 2023


ldionne added inline comments.


================
Comment at: libcxx/include/__algorithm/pstl_backends/cpu_backends/libdispatch.h:237-243
+    // Initialize all elements to a moved-from state
+    // TODO: Don't do this - this can be done in the first merge
+    std::__construct_at(__values.get(), std::move(*__first));
+    for (__iter_diff_t<_RandomAccessIterator> __i = 1; __i != __size; ++__i) {
+      std::__construct_at(__values.get() + __i, std::move(__values.get()[__i - 1]));
+    }
+    *__first = std::move(__values.get()[__size - 1]);
----------------
We could remove this and instead use something like:

```
template <class _Tp>
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI _Tp* __relocate_at(_Tp* __location, type_identity_t<_Tp>&& __object) {
  _Tp* __result = std::construct_at(__location, std::move(__object));
  std::destroy_at(std::addressof(__object));
  return __result;
}
```

And then:

```
template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator, class _CopyOrRelocate, class _CopyOrRelocateN>
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
_OutputIterator
__merge(_InputIterator1 __first1, _InputIterator1 __last1,
        _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp,
        _CopyOrRelocate __copy, _CopyOrRelocateN __copy_n)
{
    for (; __first1 != __last1; ++__result)
    {
        if (__first2 == __last2)
            return __copy(__first1, __last1, __result);
        if (__comp(*__first2, *__first1))
        {
            __copy_n(__first2, 1, __result);
            ++__first2;
        }
        else
        {
            __copy_n(__first1, 1, __result);
            ++__first1;
        }
    }
    return __copy(__first2, __last2, __result);
}
```

And we can pass it `__relocate` and `__relocate_n` in our case, and `__copy` and `__copy_n` in the normal case.



================
Comment at: libcxx/test/std/algorithms/alg.sorting/alg.sort/stable.sort/pstl.stable_sort.pass.cpp:25
 #include <algorithm>
 #include <array>
 #include <atomic>
----------------
Let's split this into a separate patch. While we're at it, let's do a quick pass over all the algorithm tests to make sure we're testing the pstl version.


================
Comment at: libcxx/test/std/algorithms/alg.sorting/alg.sort/stable.sort/pstl.stable_sort.pass.cpp:26
 #include <array>
 #include <atomic>
 #include <cassert>
----------------
Let's also add tests with types that are not default constructible.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D155136/new/

https://reviews.llvm.org/D155136



More information about the libcxx-commits mailing list