[llvm] r262719 - Change split code gen to use ThreadPool

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 4 08:04:03 PST 2016


Thanks!

On 4 March 2016 at 10:39, Teresa Johnson via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: tejohnson
> Date: Fri Mar  4 09:39:13 2016
> New Revision: 262719
>
> URL: http://llvm.org/viewvc/llvm-project?rev=262719&view=rev
> Log:
> Change split code gen to use ThreadPool
>
> Part of D15390.
>
> Modified:
>     llvm/trunk/lib/CodeGen/ParallelCG.cpp
>
> Modified: llvm/trunk/lib/CodeGen/ParallelCG.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/ParallelCG.cpp?rev=262719&r1=262718&r2=262719&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/ParallelCG.cpp (original)
> +++ llvm/trunk/lib/CodeGen/ParallelCG.cpp Fri Mar  4 09:39:13 2016
> @@ -19,7 +19,7 @@
>  #include "llvm/Support/ErrorOr.h"
>  #include "llvm/Support/MemoryBuffer.h"
>  #include "llvm/Support/TargetRegistry.h"
> -#include "llvm/Support/thread.h"
> +#include "llvm/Support/ThreadPool.h"
>  #include "llvm/Target/TargetMachine.h"
>  #include "llvm/Transforms/Utils/SplitModule.h"
>
> @@ -58,40 +58,48 @@ llvm::splitCodeGen(std::unique_ptr<Modul
>      return M;
>    }
>
> -  std::vector<thread> Threads;
> -  SplitModule(std::move(M), OSs.size(), [&](std::unique_ptr<Module> MPart) {
> -    // We want to clone the module in a new context to multi-thread the codegen.
> -    // We do it by serializing partition modules to bitcode (while still on the
> -    // main thread, in order to avoid data races) and spinning up new threads
> -    // which deserialize the partitions into separate contexts.
> -    // FIXME: Provide a more direct way to do this in LLVM.
> -    SmallVector<char, 0> BC;
> -    raw_svector_ostream BCOS(BC);
> -    WriteBitcodeToFile(MPart.get(), BCOS);
> -
> -    llvm::raw_pwrite_stream *ThreadOS = OSs[Threads.size()];
> -    Threads.emplace_back(
> -        [TheTarget, CPU, Features, Options, RM, CM, OL, FileType,
> -         ThreadOS](const SmallVector<char, 0> &BC) {
> -          LLVMContext Ctx;
> -          ErrorOr<std::unique_ptr<Module>> MOrErr =
> -              parseBitcodeFile(MemoryBufferRef(StringRef(BC.data(), BC.size()),
> -                                               "<split-module>"),
> -                               Ctx);
> -          if (!MOrErr)
> -            report_fatal_error("Failed to read bitcode");
> -          std::unique_ptr<Module> MPartInCtx = std::move(MOrErr.get());
> -
> -          codegen(MPartInCtx.get(), *ThreadOS, TheTarget, CPU, Features,
> -                  Options, RM, CM, OL, FileType);
> +  // Create ThreadPool in nested scope so that threads will be joined
> +  // on destruction.
> +  {
> +    ThreadPool CodegenThreadPool(OSs.size());
> +    int ThreadCount = 0;
> +
> +    SplitModule(
> +        std::move(M), OSs.size(),
> +        [&](std::unique_ptr<Module> MPart) {
> +          // We want to clone the module in a new context to multi-thread the
> +          // codegen. We do it by serializing partition modules to bitcode
> +          // (while still on the main thread, in order to avoid data races) and
> +          // spinning up new threads which deserialize the partitions into
> +          // separate contexts.
> +          // FIXME: Provide a more direct way to do this in LLVM.
> +          SmallVector<char, 0> BC;
> +          raw_svector_ostream BCOS(BC);
> +          WriteBitcodeToFile(MPart.get(), BCOS);
> +
> +          llvm::raw_pwrite_stream *ThreadOS = OSs[ThreadCount++];
> +          // Enqueue the task
> +          CodegenThreadPool.async(
> +              [TheTarget, CPU, Features, Options, RM, CM, OL, FileType,
> +               ThreadOS](const SmallVector<char, 0> &BC) {
> +                LLVMContext Ctx;
> +                ErrorOr<std::unique_ptr<Module>> MOrErr = parseBitcodeFile(
> +                    MemoryBufferRef(StringRef(BC.data(), BC.size()),
> +                                    "<split-module>"),
> +                    Ctx);
> +                if (!MOrErr)
> +                  report_fatal_error("Failed to read bitcode");
> +                std::unique_ptr<Module> MPartInCtx = std::move(MOrErr.get());
> +
> +                codegen(MPartInCtx.get(), *ThreadOS, TheTarget, CPU, Features,
> +                        Options, RM, CM, OL, FileType);
> +              },
> +              // Pass BC using std::move to ensure that it get moved rather than
> +              // copied into the thread's context.
> +              std::move(BC));
>          },
> -        // Pass BC using std::move to ensure that it get moved rather than
> -        // copied into the thread's context.
> -        std::move(BC));
> -  }, PreserveLocals);
> -
> -  for (thread &T : Threads)
> -    T.join();
> +        PreserveLocals);
> +  }
>
>    return {};
>  }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list