61 if (!n || !options.maxThreads || detail::PerPoolPerThreadInfo::isParForRecursive(&tasks.pool())) {
62 for (
size_t i = 0; i < n; ++i) {
73 int32_t maxThreads = std::max<int32_t>(options.maxThreads, 1);
75 ssize_t numThreads = std::min<ssize_t>(tasks.numPoolThreads() + options.wait, maxThreads);
77 numThreads = std::min<ssize_t>(numThreads, n);
79 auto chunking = detail::staticChunkSize(n, numThreads);
80 size_t chunkSize = chunking.ceilChunkSize;
82 bool perfectlyChunked = chunking.transitionTaskIndex == numThreads;
85 ssize_t firstLoopLen = chunking.transitionTaskIndex - perfectlyChunked;
88 for (t = 0; t < firstLoopLen; ++t) {
90 std::advance(next, chunkSize);
91 tasks.schedule([start, next, f]() {
92 auto recurseInfo = detail::PerPoolPerThreadInfo::parForRecurse();
93 for (Iter it = start; it != next; ++it) {
101 chunkSize -= !perfectlyChunked;
103 for (; t < numThreads - 1; ++t) {
105 std::advance(next, chunkSize);
106 tasks.schedule([start, next, f]() {
107 auto recurseInfo = detail::PerPoolPerThreadInfo::parForRecurse();
108 for (Iter it = start; it != next; ++it) {
116 std::advance(end, chunkSize);
119 for (Iter it = start; it != end; ++it) {
126 auto recurseInfo = detail::PerPoolPerThreadInfo::parForRecurse();
127 for (Iter it = start; it != end; ++it) {
166 for_each_n(tasks, start, std::distance(start, end), std::forward<F>(f), options);