[Beignet] [PATCH] GBE: refine the llvm multi-thread related code.

Zhigang Gong zhigang.gong at linux.intel.com
Tue Aug 26 22:47:48 PDT 2014


Sorry, replied on the wrong thread. This patch is still under testing.
Please ignore my last comment.

On Wed, Aug 27, 2014 at 01:34:42PM +0800, Zhigang Gong wrote:
> This version LGTM, will push latter. Thanks.
> 
> On Tue, Aug 26, 2014 at 03:39:24PM +0800, Ruiling Song wrote:
> > LLVM 3.5 remove llvm_start/stop_multithreaded() API, instead multi-thread
> > support is determined when build llvm(build option LLVM_ENABLE_THREADS).
> > llvm_is_multithreaded() is used to check whether llvm is built with
> > muti-thread support.
> > 
> > If multi-thread is not support(LLVM3.3/3.4 or 3.5 built with LLVM_ENABLE_THREADS off),
> > we simply add a mutex when calling clang/llvm related API.
> > 
> > Signed-off-by: Ruiling Song <ruiling.song at intel.com>
> > ---
> >  backend/src/backend/program.cpp |   14 +++++++++-----
> >  1 file changed, 9 insertions(+), 5 deletions(-)
> > 
> > diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp
> > index 50396c8..d992f7b 100644
> > --- a/backend/src/backend/program.cpp
> > +++ b/backend/src/backend/program.cpp
> > @@ -846,11 +846,14 @@ namespace gbe {
> >      // will delete the module and act in GenProgram::CleanLlvmResource().
> >      llvm::Module * out_module;
> >      llvm::LLVMContext* llvm_ctx = new llvm::LLVMContext;
> > +
> > +    static std::mutex llvm_mutex;
> > +    if (!llvm::llvm_is_multithreaded())
> > +      llvm_mutex.lock();
> > +
> >      if (buildModuleFromSource(clName.c_str(), &out_module, llvm_ctx, clOpt.c_str(),
> >                                stringSize, err, errSize)) {
> >      // Now build the program from llvm
> > -      static std::mutex gbe_mutex;
> > -      gbe_mutex.lock();
> >        size_t clangErrSize = 0;
> >        if (err != NULL) {
> >          GBE_ASSERT(errSize != NULL);
> > @@ -863,11 +866,14 @@ namespace gbe {
> >                                      err, errSize, optLevel);
> >        if (err != NULL)
> >          *errSize += clangErrSize;
> > -      gbe_mutex.unlock();
> >        if (OCL_OUTPUT_BUILD_LOG && options)
> >          llvm::errs() << options;
> >      } else
> >        p = NULL;
> > +
> > +    if (!llvm::llvm_is_multithreaded())
> > +      llvm_mutex.unlock();
> > +
> >      remove(clName.c_str());
> >      return p;
> >    }
> > @@ -1261,11 +1267,9 @@ namespace gbe
> >        gbe_release_printf_info = gbe::kernelReleasePrintfSet;
> >        gbe_output_printf = gbe::kernelOutputPrintf;
> >        genSetupCallBacks();
> > -      llvm::llvm_start_multithreaded();
> >      }
> >  
> >      ~CallBackInitializer() {
> > -      llvm::llvm_stop_multithreaded();
> >  #if (LLVM_VERSION_MAJOR == 3) && (LLVM_VERSION_MINOR > 3)
> >        llvm::llvm_shutdown();
> >  #endif
> > -- 
> > 1.7.10.4
> > 
> > _______________________________________________
> > Beignet mailing list
> > Beignet at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/beignet
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list