[Mesa-dev] [PATCH 6/7] swr/rast: New execution engine per JIT

Cherniak, Bruce bruce.cherniak at intel.com
Tue Jan 15 20:40:10 UTC 2019


Reviewed-by: Bruce Cherniak <bruce.cherniak at intel.com> 

> On Dec 17, 2018, at 8:36 AM, Alok Hota <alok.hota at intel.com> wrote:
> 
> Fixes relocation errors with LLVM 7.0.0
> ---
> .../swr/rasterizer/jitter/JitManager.cpp      | 79 +++++++++++--------
> .../swr/rasterizer/jitter/JitManager.h        | 28 +++++--
> 2 files changed, 65 insertions(+), 42 deletions(-)
> 
> diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
> index 58d30d4e119..1b2b570318c 100644
> --- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
> +++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
> @@ -63,39 +63,29 @@ JitManager::JitManager(uint32_t simdWidth, const char* arch, const char* core) :
>     mContext(), mBuilder(mContext), mIsModuleFinalized(true), mJitNumber(0), mVWidth(simdWidth),
>     mArch(arch)
> {
> +    mpCurrentModule = nullptr;
> +    mpExec = nullptr;
> +
>     InitializeNativeTarget();
>     InitializeNativeTargetAsmPrinter();
>     InitializeNativeTargetDisassembler();
> 
> 
> -    TargetOptions tOpts;
> -    tOpts.AllowFPOpFusion = FPOpFusion::Fast;
> -    tOpts.NoInfsFPMath    = false;
> -    tOpts.NoNaNsFPMath    = false;
> -    tOpts.UnsafeFPMath = false;
> -
> -    // tOpts.PrintMachineCode    = true;
> -
> -    std::unique_ptr<Module> newModule(new Module("", mContext));
> -    mpCurrentModule = newModule.get();
> -
> -    StringRef hostCPUName;
> -
>     // force JIT to use the same CPU arch as the rest of swr
>     if (mArch.AVX512F())
>     {
> #if USE_SIMD16_SHADERS
>         if (mArch.AVX512ER())
>         {
> -            hostCPUName = StringRef("knl");
> +            mHostCpuName = StringRef("knl");
>         }
>         else
>         {
> -            hostCPUName = StringRef("skylake-avx512");
> +            mHostCpuName = StringRef("skylake-avx512");
>         }
>         mUsingAVX512 = true;
> #else
> -        hostCPUName = StringRef("core-avx2");
> +        mHostCpuName = StringRef("core-avx2");
> #endif
>         if (mVWidth == 0)
>         {
> @@ -104,7 +94,7 @@ JitManager::JitManager(uint32_t simdWidth, const char* arch, const char* core) :
>     }
>     else if (mArch.AVX2())
>     {
> -        hostCPUName = StringRef("core-avx2");
> +        mHostCpuName = StringRef("core-avx2");
>         if (mVWidth == 0)
>         {
>             mVWidth = 8;
> @@ -114,11 +104,11 @@ JitManager::JitManager(uint32_t simdWidth, const char* arch, const char* core) :
>     {
>         if (mArch.F16C())
>         {
> -            hostCPUName = StringRef("core-avx-i");
> +            mHostCpuName = StringRef("core-avx-i");
>         }
>         else
>         {
> -            hostCPUName = StringRef("corei7-avx");
> +            mHostCpuName = StringRef("corei7-avx");
>         }
>         if (mVWidth == 0)
>         {
> @@ -131,31 +121,21 @@ JitManager::JitManager(uint32_t simdWidth, const char* arch, const char* core) :
>     }
> 
> 
> -    auto optLevel = CodeGenOpt::Aggressive;
> +    mOptLevel = CodeGenOpt::Aggressive;
> 
>     if (KNOB_JIT_OPTIMIZATION_LEVEL >= CodeGenOpt::None &&
>         KNOB_JIT_OPTIMIZATION_LEVEL <= CodeGenOpt::Aggressive)
>     {
> -        optLevel = CodeGenOpt::Level(KNOB_JIT_OPTIMIZATION_LEVEL);
> +        mOptLevel = CodeGenOpt::Level(KNOB_JIT_OPTIMIZATION_LEVEL);
>     }
> 
> -    mpCurrentModule->setTargetTriple(sys::getProcessTriple());
> -    mpExec = EngineBuilder(std::move(newModule))
> -                 .setTargetOptions(tOpts)
> -                 .setOptLevel(optLevel)
> -                 .setMCPU(hostCPUName)
> -                 .create();
> -
>     if (KNOB_JIT_ENABLE_CACHE)
>     {
> -        mCache.Init(this, hostCPUName, optLevel);
> -        mpExec->setObjectCache(&mCache);
> +        mCache.Init(this, mHostCpuName, mOptLevel);
>     }
> 
> -#if LLVM_USE_INTEL_JITEVENTS
> -    JITEventListener* vTune = JITEventListener::createIntelJITEventListener();
> -    mpExec->RegisterJITEventListener(vTune);
> -#endif
> +    SetupNewModule();
> +    mIsModuleFinalized = true;
> 
>     // fetch function signature
> #if USE_SIMD16_SHADERS
> @@ -198,6 +178,35 @@ JitManager::JitManager(uint32_t simdWidth, const char* arch, const char* core) :
> #endif
> }
> 
> +void JitManager::CreateExecEngine(std::unique_ptr<Module> pModule)
> +{
> +    TargetOptions tOpts;
> +    tOpts.AllowFPOpFusion = FPOpFusion::Fast;
> +    tOpts.NoInfsFPMath    = false;
> +    tOpts.NoNaNsFPMath    = false;
> +    tOpts.UnsafeFPMath = false;
> +
> +    // tOpts.PrintMachineCode    = true;
> +
> +    mpExec = EngineBuilder(std::move(pModule))
> +                 .setTargetOptions(tOpts)
> +                 .setOptLevel(mOptLevel)
> +                 .setMCPU(mHostCpuName)
> +                 .create();
> +
> +    if (KNOB_JIT_ENABLE_CACHE)
> +    {
> +        mpExec->setObjectCache(&mCache);
> +    }
> +
> +#if LLVM_USE_INTEL_JITEVENTS
> +    JITEventListener* vTune = JITEventListener::createIntelJITEventListener();
> +    mpExec->RegisterJITEventListener(vTune);
> +#endif
> +
> +    mvExecEngines.push_back(mpExec);
> +}
> +
> //////////////////////////////////////////////////////////////////////////
> /// @brief Create new LLVM module.
> void JitManager::SetupNewModule()
> @@ -207,7 +216,7 @@ void JitManager::SetupNewModule()
>     std::unique_ptr<Module> newModule(new Module("", mContext));
>     mpCurrentModule = newModule.get();
>     mpCurrentModule->setTargetTriple(sys::getProcessTriple());
> -    mpExec->addModule(std::move(newModule));
> +    CreateExecEngine(std::move(newModule));
>     mIsModuleFinalized = false;
> }
> 
> diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
> index 2f479314c76..5659191525d 100644
> --- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
> +++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
> @@ -124,12 +124,21 @@ private:
> struct JitManager
> {
>     JitManager(uint32_t w, const char* arch, const char* core);
> -    ~JitManager(){};
> +    ~JitManager()
> +    {
> +        for (auto* pExec : mvExecEngines)
> +        {
> +            delete pExec;
> +        }
> +    }
> 
> -    JitLLVMContext         mContext; ///< LLVM compiler
> -    llvm::IRBuilder<>      mBuilder; ///< LLVM IR Builder
> -    llvm::ExecutionEngine* mpExec;
> -    JitCache               mCache;
> +    JitLLVMContext                      mContext; ///< LLVM compiler
> +    llvm::IRBuilder<>                   mBuilder; ///< LLVM IR Builder
> +    llvm::ExecutionEngine*              mpExec;
> +    std::vector<llvm::ExecutionEngine*> mvExecEngines;
> +    JitCache                            mCache;
> +    llvm::StringRef                     mHostCpuName;
> +    llvm::CodeGenOpt::Level             mOptLevel;
> 
>     // Need to be rebuilt after a JIT and before building new IR
>     llvm::Module* mpCurrentModule;
> @@ -148,11 +157,14 @@ struct JitManager
>     // Debugging support
>     std::unordered_map<llvm::StructType*, llvm::DIType*> mDebugStructMap;
> 
> +    void CreateExecEngine(std::unique_ptr<llvm::Module> M);
>     void SetupNewModule();
> 
>     void               DumpAsm(llvm::Function* pFunction, const char* fileName);
>     static void        DumpToFile(llvm::Function* f, const char* fileName);
> -    static void        DumpToFile(llvm::Module* M, const char* fileName, llvm::AssemblyAnnotationWriter* annotater = nullptr);
> +    static void        DumpToFile(llvm::Module*                   M,
> +                                  const char*                     fileName,
> +                                  llvm::AssemblyAnnotationWriter* annotater = nullptr);
>     static std::string GetOutputDir();
> 
>     // Debugging support methods
> @@ -183,8 +195,10 @@ struct JitManager
> class InterleaveAssemblyAnnotater : public llvm::AssemblyAnnotationWriter
> {
> public:
> -    void emitInstructionAnnot(const llvm::Instruction *pInst, llvm::formatted_raw_ostream &OS) override;
> +    void                     emitInstructionAnnot(const llvm::Instruction*     pInst,
> +                                                  llvm::formatted_raw_ostream& OS) override;
>     std::vector<std::string> mAssembly;
> +
> private:
>     uint32_t mCurrentLineNo = 0;
> };
> -- 
> 2.17.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev



More information about the mesa-dev mailing list