aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Rodgers <trodgers@redhat.com>2019-04-19 22:44:11 +0000
committerThomas Rodgers <rodgertq@gcc.gnu.org>2019-04-19 22:44:11 +0000
commita34d6343a758f651064d81abb1534971fa4170e7 (patch)
treeea92d5ec05b6f7ef385ba805218fe1e2d941f2a8
parent53db57ccaf3081bf8981f5d4d821a02429414145 (diff)
downloadgcc-a34d6343a758f651064d81abb1534971fa4170e7.zip
gcc-a34d6343a758f651064d81abb1534971fa4170e7.tar.gz
gcc-a34d6343a758f651064d81abb1534971fa4170e7.tar.bz2
Improve implementation of parallel equal()
* include/pstl/algorithm_impl.h (__internal::__brick_equal): use "4 iterator" version of std::equal(). (__internal::__brick_equal): use simd for random access iterators on unsequenced execution policies. (__internal::__pattern_equal): add "4 iterator" version (__internal::__pattern_equal): dispatch to simd __brick_equal for vector-only execution policies. (__internal::__pattern_equal): dispatch to __parallel_or for parallel execution policies. * include/pstl/glue_algorithm_impl.h (std::equal): dispatch to "4 iterator" version of __internal::__pattern_equal(). From-SVN: r270463
-rw-r--r--libstdc++-v3/ChangeLog17
-rw-r--r--libstdc++-v3/include/pstl/algorithm_impl.h57
-rw-r--r--libstdc++-v3/include/pstl/glue_algorithm_impl.h2
3 files changed, 75 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index fb35a14..ce72659 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,20 @@
+2019-04-19 Thomas Rodgers <trodgers@redhat.com>
+
+ Improve implementation of parallel equal()
+ * include/pstl/algorithm_impl.h
+ (__internal::__brick_equal): use "4 iterator" version of
+ std::equal().
+ (__internal::__brick_equal): use simd for random access
+ iterators on unsequenced execution policies.
+ (__internal::__pattern_equal): add "4 iterator" version
+ (__internal::__pattern_equal): dispatch to simd __brick_equal
+ for vector-only execution policies.
+ (__internal::__pattern_equal): dispatch to __parallel_or for
+ parallel execution policies.
+ * include/pstl/glue_algorithm_impl.h
+ (std::equal): dispatch to "4 iterator" version of
+ __internal::__pattern_equal().
+
2019-04-17 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/90105
diff --git a/libstdc++-v3/include/pstl/algorithm_impl.h b/libstdc++-v3/include/pstl/algorithm_impl.h
index d39e99a..511e688 100644
--- a/libstdc++-v3/include/pstl/algorithm_impl.h
+++ b/libstdc++-v3/include/pstl/algorithm_impl.h
@@ -406,6 +406,63 @@ __pattern_walk3(_ExecutionPolicy&& __exec, _RandomAccessIterator1 __first1, _Ran
template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
bool
+__brick_equal(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
+ _ForwardIterator2 __last2, _BinaryPredicate __p, /* IsVector = */ std::false_type) noexcept
+{
+ return std::equal(__first1, __last1, __first2, __last2, __p);
+}
+
+template <class _RandomAccessIterator1, class _RandomAccessIterator2, class _BinaryPredicate>
+bool
+__brick_equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, _RandomAccessIterator2 __first2,
+ _RandomAccessIterator2 __last2, _BinaryPredicate __p, /* is_vector = */ std::true_type) noexcept
+{
+ if (__last1 - __first1 != __last2 - __first2)
+ return false;
+
+ return __unseq_backend::__simd_first(__first1, __last1 - __first1, __first2,
+ __internal::__not_pred<_BinaryPredicate>(__p))
+ .first == __last1;
+}
+
+template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
+ class _IsVector>
+bool
+__pattern_equal(_ExecutionPolicy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
+ _ForwardIterator2 __last2, _BinaryPredicate __p, _IsVector __is_vector, /* is_parallel = */
+ std::false_type) noexcept
+{
+ return __internal::__brick_equal(__first1, __last1, __first2, __last2, __p, __is_vector);
+}
+
+#if _PSTL_USE_PAR_POLICIES
+template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _BinaryPredicate,
+ class _IsVector>
+bool
+__pattern_equal(_ExecutionPolicy&& __exec, _RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
+ _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __p,
+ _IsVector __is_vector, /*is_parallel=*/std::true_type)
+{
+ if (__last1 - __first1 != __last2 - __first2)
+ return false;
+
+ return __internal::__except_handler([&]() {
+ return !__internal::__parallel_or(
+ std::forward<_ExecutionPolicy>(__exec), __first1, __last1,
+ [__first1, __first2, __p, __is_vector](_RandomAccessIterator1 __i, _RandomAccessIterator1 __j) {
+ return !__internal::__brick_equal(__i, __j, __first2 + (__i - __first1), __first2 + (__j - __first1),
+ __p, __is_vector);
+ });
+ });
+}
+#endif
+
+//------------------------------------------------------------------------
+// equal version for sequences with equal length
+//------------------------------------------------------------------------
+
+template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
+bool
__brick_equal(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _BinaryPredicate __p,
/* IsVector = */ std::false_type) noexcept
{
diff --git a/libstdc++-v3/include/pstl/glue_algorithm_impl.h b/libstdc++-v3/include/pstl/glue_algorithm_impl.h
index 88ce93f..db5ef2b 100644
--- a/libstdc++-v3/include/pstl/glue_algorithm_impl.h
+++ b/libstdc++-v3/include/pstl/glue_algorithm_impl.h
@@ -757,7 +757,7 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
equal(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
_ForwardIterator2 __last2)
{
- return equal(std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2,
+ return equal(std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __last2,
__pstl::__internal::__pstl_equal());
}