xref: /llvm-project/libcxx/src/pstl/libdispatch.cpp (revision d423d80e560d8bf7ca493596d9f34a9e1f0eede7)
12b2e7f6eSNikolas Klauser //===----------------------------------------------------------------------===//
22b2e7f6eSNikolas Klauser //
32b2e7f6eSNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42b2e7f6eSNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
52b2e7f6eSNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62b2e7f6eSNikolas Klauser //
72b2e7f6eSNikolas Klauser //===----------------------------------------------------------------------===//
82b2e7f6eSNikolas Klauser 
92b2e7f6eSNikolas Klauser #include <__algorithm/min.h>
102b2e7f6eSNikolas Klauser #include <__config>
11*d423d80eSLouis Dionne #include <__pstl/backends/libdispatch.h>
122b2e7f6eSNikolas Klauser #include <dispatch/dispatch.h>
132b2e7f6eSNikolas Klauser 
142b2e7f6eSNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
15a3ce29f7SLouis Dionne namespace __pstl::__libdispatch {
162b2e7f6eSNikolas Klauser 
__dispatch_apply(size_t chunk_count,void * context,void (* func)(void * context,size_t chunk))172b2e7f6eSNikolas Klauser void __dispatch_apply(size_t chunk_count, void* context, void (*func)(void* context, size_t chunk)) noexcept {
182b2e7f6eSNikolas Klauser   ::dispatch_apply_f(chunk_count, DISPATCH_APPLY_AUTO, context, func);
192b2e7f6eSNikolas Klauser }
202b2e7f6eSNikolas Klauser 
__partition_chunks(ptrdiff_t element_count)21051c8630SNikolas Klauser __chunk_partitions __partition_chunks(ptrdiff_t element_count) noexcept {
222b2e7f6eSNikolas Klauser   __chunk_partitions partitions;
23051c8630SNikolas Klauser   partitions.__chunk_count_      = std::max<ptrdiff_t>(1, element_count / 256);
242b2e7f6eSNikolas Klauser   partitions.__chunk_size_       = element_count / partitions.__chunk_count_;
25051c8630SNikolas Klauser   partitions.__first_chunk_size_ = element_count - (partitions.__chunk_count_ - 1) * partitions.__chunk_size_;
2668b10359SNikolas Klauser   if (partitions.__chunk_count_ == 0 && element_count > 0)
2768b10359SNikolas Klauser     partitions.__chunk_count_ = 1;
282b2e7f6eSNikolas Klauser   return partitions;
292b2e7f6eSNikolas Klauser }
302b2e7f6eSNikolas Klauser 
31a3ce29f7SLouis Dionne } // namespace __pstl::__libdispatch
322b2e7f6eSNikolas Klauser _LIBCPP_END_NAMESPACE_STD
33