saudi created this revision.
saudi added reviewers: arphaman, dexonsmith, Bigcheese.
saudi added projects: clang, LLVM.
saudi requested review of this revision.
Herald added a subscriber: cfe-commits.

Switching back to `std::thread` to simplify the logic, as `ThreadPool` adds a 
layer of task management. However, keeping the `ThreadPoolStrategy` use, to 
benefit the `ThreadPool` improvements from https://reviews.llvm.org/D71775

This patch partly reverts https://reviews.llvm.org/D74569

Added a few optimizations:

  - Prevent from spawning more threads than there are files to process;
  - Perform computations on the main thread too, to save one thread spawn. This 
way, `clang-scan-deps -j1` will be really single-threaded, and the code path is 
the same as when LLVM threads are disabled.
- Call `reserve()` to `std::vector`s which size is known when initializing.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D102633

Files:
  clang/test/ClangScanDeps/Inputs/num-workers-1cmd.json
  clang/test/ClangScanDeps/Inputs/num-workers-2cmds.json
  clang/test/ClangScanDeps/num-workers.cpp
  clang/tools/clang-scan-deps/ClangScanDeps.cpp

Index: clang/tools/clang-scan-deps/ClangScanDeps.cpp
===================================================================
--- clang/tools/clang-scan-deps/ClangScanDeps.cpp
+++ clang/tools/clang-scan-deps/ClangScanDeps.cpp
@@ -20,7 +20,6 @@
 #include "llvm/Support/JSON.h"
 #include "llvm/Support/Program.h"
 #include "llvm/Support/Signals.h"
-#include "llvm/Support/ThreadPool.h"
 #include "llvm/Support/Threading.h"
 #include <mutex>
 #include <thread>
@@ -555,16 +554,29 @@
 
   DependencyScanningService Service(ScanMode, Format, ReuseFileManager,
                                     SkipExcludedPPRanges);
-  llvm::ThreadPool Pool(llvm::hardware_concurrency(NumThreads));
-  std::vector<std::unique_ptr<DependencyScanningTool>> WorkerTools;
-  for (unsigned I = 0; I < Pool.getThreadCount(); ++I)
-    WorkerTools.push_back(std::make_unique<DependencyScanningTool>(Service));
 
   std::vector<SingleCommandCompilationDatabase> Inputs;
-  for (tooling::CompileCommand Cmd :
-       AdjustingCompilations->getAllCompileCommands())
-    Inputs.emplace_back(Cmd);
+  {
+    auto AdjustedCommands = AdjustingCompilations->getAllCompileCommands();
+    Inputs.reserve(AdjustedCommands.size());
+    for (tooling::CompileCommand Cmd : AdjustedCommands)
+      Inputs.emplace_back(Cmd);
+  }
 
+  unsigned NumWorkers =
+      llvm::hardware_concurrency(NumThreads).compute_thread_count();
+
+  if (NumWorkers > Inputs.size())
+    NumWorkers = static_cast<unsigned>(Inputs.size());
+
+  std::vector<std::unique_ptr<DependencyScanningTool>> WorkerTools;
+  WorkerTools.reserve(NumWorkers);
+  for (unsigned I = 0; I < NumWorkers; ++I)
+    WorkerTools.push_back(std::make_unique<DependencyScanningTool>(Service));
+
+  std::vector<std::thread> WorkerThreads;
+  if (NumWorkers > 1)
+    WorkerThreads.reserve(NumWorkers - 1);
   std::atomic<bool> HadErrors(false);
   FullDeps FD;
   std::mutex Lock;
@@ -572,11 +584,11 @@
 
   if (Verbose) {
     llvm::outs() << "Running clang-scan-deps on " << Inputs.size()
-                 << " files using " << Pool.getThreadCount() << " workers\n";
+                 << " files using " << NumWorkers << " workers\n";
   }
-  for (unsigned I = 0; I < Pool.getThreadCount(); ++I) {
-    Pool.async([I, &Lock, &Index, &Inputs, &HadErrors, &FD, &WorkerTools,
-                &DependencyOS, &Errs]() {
+  for (unsigned I = 0; I < NumWorkers; ++I) {
+    auto Worker = [I, &Lock, &Index, &Inputs, &HadErrors, &FD, &WorkerTools,
+                   &DependencyOS, &Errs]() {
       llvm::StringSet<> AlreadySeenModules;
       while (true) {
         const SingleCommandCompilationDatabase *Input;
@@ -608,9 +620,17 @@
             HadErrors = true;
         }
       }
-    });
+    };
+    // Leave the last worker for the main thread.
+    if (I < NumWorkers - 1) {
+      assert(llvm::llvm_is_multithreaded());
+      WorkerThreads.emplace_back(std::move(Worker));
+    } else {
+      Worker();
+    }
   }
-  Pool.wait();
+  for (auto &W : WorkerThreads)
+    W.join();
 
   if (Format == ScanningOutputFormat::Full)
     FD.printFullOutput(llvm::outs());
Index: clang/test/ClangScanDeps/num-workers.cpp
===================================================================
--- /dev/null
+++ clang/test/ClangScanDeps/num-workers.cpp
@@ -0,0 +1,31 @@
+// REQUIRES: thread_support
+// RUN: rm -rf %t.dir
+// RUN: rm -f %t.*.cdb
+// RUN: mkdir -p %t.dir
+// RUN: cp %s %t.dir/file.cpp
+// RUN: cp %s %t.dir/file2.cpp
+// RUN: echo > %t.dir/header.h
+
+// RUN: sed -e "s|DIR|%/t.dir|g" %S/Inputs/num-workers-1cmd.json > %t.1cmd.cdb
+// RUN: sed -e "s|DIR|%/t.dir|g" %S/Inputs/num-workers-2cmds.json > %t.2cmds.cdb
+//
+// RUN: clang-scan-deps -compilation-database %t.1cmd.cdb -j 2 -v | \
+// RUN:   FileCheck --check-prefixes=CHECK,CHECK1F1W %s
+//
+// RUN: clang-scan-deps -compilation-database %t.2cmds.cdb -j 1 -v | \
+// RUN:   FileCheck --check-prefixes=CHECK,CHECK2F1W %s
+//
+// RUN: clang-scan-deps -compilation-database %t.2cmds.cdb -j 2 -v | \
+// RUN:   FileCheck --check-prefixes=CHECK,CHECK2F2W %s
+//
+// RUN: clang-scan-deps -compilation-database %t.2cmds.cdb -j 10 -v | \
+// RUN:   FileCheck --check-prefixes=CHECK,CHECK2F2W %s
+
+#include "header.h"
+
+// CHECK1F1W: Running clang-scan-deps on 1 files using 1 workers
+// CHECK2F1W: Running clang-scan-deps on 2 files using 1 workers
+// CHECK2F2W: Running clang-scan-deps on 2 files using 2 workers
+
+// CHECK: file.cpp
+// CHECK-NEXT: header.h
Index: clang/test/ClangScanDeps/Inputs/num-workers-2cmds.json
===================================================================
--- /dev/null
+++ clang/test/ClangScanDeps/Inputs/num-workers-2cmds.json
@@ -0,0 +1,12 @@
+[
+{
+  "directory": "DIR",
+  "command": "clang -E -fsyntax-only DIR/file.cpp",
+  "file": "DIR/file.cpp"
+},
+{
+  "directory": "DIR",
+  "command": "clang -E -fsyntax-only DIR/file2.cpp",
+  "file": "DIR/file2.cpp"
+}
+]
Index: clang/test/ClangScanDeps/Inputs/num-workers-1cmd.json
===================================================================
--- /dev/null
+++ clang/test/ClangScanDeps/Inputs/num-workers-1cmd.json
@@ -0,0 +1,7 @@
+[
+{
+  "directory": "DIR",
+  "command": "clang -E -fsyntax-only DIR/file.cpp",
+  "file": "DIR/file.cpp"
+}
+]
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D102633: [... Sylvain Audi via Phabricator via cfe-commits

Reply via email to