[PATCH] D36607: [Support/Parallel] - Do not spawn thread for single/last task.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 11 03:52:19 PDT 2017

grimar created this revision.

We have an issue with one of testcases in LLD, it is PR32942.
In short: testcase takes much more time to finish with threads
than without them.

I found that it is not reproduces under windows, but linux implementation
is affected. Issue itself is cased by case when we have about ~65000 calls
of `for_each_n`, each one has `Begin=0`, `End=1`. 
Windows implementation does not spawn any threads at all in that case, 
see internal implementation:

  template <typename _Index_type, typename _Function, typename _Partitioner>
  void _Parallel_for_impl(_Index_type _First, _Index_type _Last, _Index_type _Step, const _Function& _Func, _Partitioner&& _Part)
      if (_Range_size <= _Diff_step)
          _Func(_First); // THIS BRANCH IS CALLED
          _Parallel_for_partitioned_impl<_Index_type, _Diff_type, _Function>(_First, _Range_size, _Step, _Func, std::forward<_Partitioner>(_Part));

But linux implementation spawns about ~65k threads, what works really slow and looks useless. 
I suggest do not create threads for single or last task, and that fixes issue I am observing.



Index: Parallel.h
--- Parallel.h
+++ Parallel.h
@@ -179,10 +179,8 @@
-  TG.spawn([=, &Fn] {
-    for (IndexTy J = I; J < End; ++J)
-      Fn(J);
-  });
+  for (IndexTy J = I; J < End; ++J)
+    Fn(J);

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D36607.110683.patch
Type: text/x-patch
Size: 312 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170811/76ee7e7a/attachment.bin>

More information about the llvm-commits mailing list