[Beignet] [PATCH 08/19] Backend: Add IVAR OCL_PROFILING_LOG to control profiling log.

Yang, Rong R rong.r.yang at intel.com
Tue Nov 3 05:12:48 PST 2015



> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> junyan.he at inbox.com
> Sent: Wednesday, September 9, 2015 8:01
> To: beignet at lists.freedesktop.org
> Subject: [Beignet] [PATCH 08/19] Backend: Add IVAR OCL_PROFILING_LOG
> to control profiling log.
> 
> From: Junyan He <junyan.he at linux.intel.com>
> 
> We add OCL_PROFILING_LOG as a int type, because there may be different
> types of profiling format in the future.
> 
> Signed-off-by: Junyan He <junyan.he at linux.intel.com>
> ---
>  backend/src/backend/gen_context.hpp   |    3 +++
>  backend/src/backend/gen_program.cpp   |    9 ++++++++-
>  backend/src/backend/gen_program.hpp   |    2 +-
>  backend/src/backend/program.cpp       |    9 +++++----
>  backend/src/backend/program.hpp       |    3 ++-
>  backend/src/llvm/llvm_gen_backend.hpp |    3 +++
>  backend/src/llvm/llvm_to_gen.cpp      |    7 ++++++-
>  backend/src/llvm/llvm_to_gen.hpp      |    3 ++-
>  8 files changed, 30 insertions(+), 9 deletions(-)
> 
> diff --git a/backend/src/backend/gen_context.hpp
> b/backend/src/backend/gen_context.hpp
> index 34f9293..8c7b821 100644
> --- a/backend/src/backend/gen_context.hpp
> +++ b/backend/src/backend/gen_context.hpp
> @@ -207,6 +207,8 @@ namespace gbe
>      bool relaxMath;
>      bool getIFENDIFFix(void) const { return ifEndifFix; }
>      void setIFENDIFFix(bool fix) { ifEndifFix = fix; }
> +    bool getProfilingMode(void) const { return inProfilingMode; }
> +    void setProfilingMode(bool b) { inProfilingMode = b; }
>      CompileErrorCode getErrCode() { return errCode; }
> 
>    protected:
> @@ -221,6 +223,7 @@ namespace gbe
>    private:
>      CompileErrorCode errCode;
>      bool ifEndifFix;
> +    bool inProfilingMode;
>      uint32_t regSpillTick;
>      const char* asmFileName;
>      /*! Build the curbe patch list for the given kernel */ diff --git
> a/backend/src/backend/gen_program.cpp
> b/backend/src/backend/gen_program.cpp
> index 3c4983e..8f1fe8e 100644
> --- a/backend/src/backend/gen_program.cpp
> +++ b/backend/src/backend/gen_program.cpp
> @@ -140,7 +140,8 @@ namespace gbe {
>      {8, 16, false},
>    };
> 
> -  Kernel *GenProgram::compileKernel(const ir::Unit &unit, const std::string
> &name, bool relaxMath) {
> +  Kernel *GenProgram::compileKernel(const ir::Unit &unit, const std::string
> &name,
> +                                    bool relaxMath, int profiling) {
>  #ifdef GBE_COMPILER_AVAILABLE
>      // Be careful when the simdWidth is forced by the programmer. We can
> see it
>      // when the function already provides the simd width we need to use (i.e.
> @@ -172,6 +173,12 @@ namespace gbe {
>        ctx = GBE_NEW(Gen9Context, unit, name, deviceID, relaxMath);
>      }
>      GBE_ASSERTM(ctx != NULL, "Fail to create the gen context\n");
> +
> +    if (profiling) {
> +      ctx->setProfilingMode(true);
> +      unit.getProfilingInfo()->setDeviceID(deviceID);
> +    }
> +
>      ctx->setASMFileName(this->asm_file_name);
> 
>      for (; codeGen < codeGenNum; ++codeGen) { diff --git
> a/backend/src/backend/gen_program.hpp
> b/backend/src/backend/gen_program.hpp
> index 75d77ba..cc1d526 100644
> --- a/backend/src/backend/gen_program.hpp
> +++ b/backend/src/backend/gen_program.hpp
> @@ -69,7 +69,7 @@ namespace gbe
>      /*! Clean LLVM resource */
>      virtual void CleanLlvmResource(void);
>      /*! Implements base class */
> -    virtual Kernel *compileKernel(const ir::Unit &unit, const std::string &name,
> bool relaxMath);
> +    virtual Kernel *compileKernel(const ir::Unit &unit, const
> + std::string &name, bool relaxMath, int profiling);
>      /*! Allocate an empty kernel. */
>      virtual Kernel *allocateKernel(const std::string &name) {
>        return GBE_NEW(GenKernel, name, deviceID); diff --git
> a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp
> index d9e6416..9408621 100644
> --- a/backend/src/backend/program.cpp
> +++ b/backend/src/backend/program.cpp
> @@ -114,6 +114,7 @@ namespace gbe {
>  #ifdef GBE_COMPILER_AVAILABLE
>    BVAR(OCL_OUTPUT_GEN_IR, false);
>    BVAR(OCL_STRICT_CONFORMANCE, true);
> +  IVAR(OCL_PROFILING_LOG, 0, 0, 1); // Int for different profiling types.
> 
>    bool Program::buildFromLLVMFile(const char *fileName, const void*
> module, std::string &error, int optLevel) {
>      ir::Unit *unit = new ir::Unit();
> @@ -121,7 +122,7 @@ namespace gbe {
>      if(module){
>        cloned_module = llvm::CloneModule((llvm::Module*)module);
>      }
> -    if (llvmToGen(*unit, fileName, module, optLevel,
> OCL_STRICT_CONFORMANCE) == false) {
> +    if (llvmToGen(*unit, fileName, module, optLevel,
> + OCL_STRICT_CONFORMANCE, OCL_PROFILING_LOG) == false) {
>        if (fileName)
>          error = std::string(fileName) + " not found";
>        delete unit;
> @@ -134,10 +135,10 @@ namespace gbe {
>        unit = new ir::Unit();
>        if(cloned_module){
>          //suppose file exists and llvmToGen will not return false.
> -        llvmToGen(*unit, fileName, cloned_module, 0,
> OCL_STRICT_CONFORMANCE);
> +        llvmToGen(*unit, fileName, cloned_module, 0,
> + OCL_STRICT_CONFORMANCE, OCL_PROFILING_LOG);
>        }else{
>          //suppose file exists and llvmToGen will not return false.
> -        llvmToGen(*unit, fileName, module, 0, OCL_STRICT_CONFORMANCE);
> +        llvmToGen(*unit, fileName, module, 0, OCL_STRICT_CONFORMANCE,
> + OCL_PROFILING_LOG);
>        }
>      }
>      assert(unit->getValid());
> @@ -157,7 +158,7 @@ namespace gbe {
>      if (kernelNum == 0) return true;
>      for (const auto &pair : set) {
>        const std::string &name = pair.first;
> -      Kernel *kernel = this->compileKernel(unit,
> name, !OCL_STRICT_CONFORMANCE);
> +      Kernel *kernel = this->compileKernel(unit, name,
> + !OCL_STRICT_CONFORMANCE, OCL_PROFILING_LOG);
>        kernel->setSamplerSet(pair.second->getSamplerSet());
>        kernel->setImageSet(pair.second->getImageSet());
>        kernel->setPrintfSet(pair.second->getPrintfSet());
> diff --git a/backend/src/backend/program.hpp
> b/backend/src/backend/program.hpp index efe192f..d5c6442 100644
> --- a/backend/src/backend/program.hpp
> +++ b/backend/src/backend/program.hpp
> @@ -302,7 +302,8 @@ namespace gbe {
> 
>    protected:
>      /*! Compile a kernel */
> -    virtual Kernel *compileKernel(const ir::Unit &unit, const std::string &name,
> bool relaxMath) = 0;
> +    virtual Kernel *compileKernel(const ir::Unit &unit, const std::string
> &name,
> +                                  bool relaxMath, int profiling) = 0;
>      /*! Allocate an empty kernel. */
>      virtual Kernel *allocateKernel(const std::string &name) = 0;
>      /*! Kernels sorted by their name */ diff --git
> a/backend/src/llvm/llvm_gen_backend.hpp
> b/backend/src/llvm/llvm_gen_backend.hpp
> index 1f16557..cb08a28 100644
> --- a/backend/src/llvm/llvm_gen_backend.hpp
> +++ b/backend/src/llvm/llvm_gen_backend.hpp
> @@ -146,6 +146,9 @@ namespace gbe
>    /*! Passer the printf function call. */
>    llvm::FunctionPass* createPrintfParserPass();
> 
> +  /*! Insert the time stamp for profiling. */
> +  llvm::FunctionPass* createProfilingInserterPass(int profilingType);
> +
>  #if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 5
>    /* customized loop unrolling pass. */
>    llvm::LoopPass *createCustomLoopUnrollPass(); diff --git
> a/backend/src/llvm/llvm_to_gen.cpp b/backend/src/llvm/llvm_to_gen.cpp
> index 891f2a1..93d3e6a 100644
> --- a/backend/src/llvm/llvm_to_gen.cpp
> +++ b/backend/src/llvm/llvm_to_gen.cpp
> @@ -222,7 +222,8 @@ namespace gbe
>    BVAR(OCL_OUTPUT_LLVM_AFTER_LINK, false);
>    BVAR(OCL_OUTPUT_LLVM_AFTER_GEN, false);
> 
> -  bool llvmToGen(ir::Unit &unit, const char *fileName,const void* module,
> int optLevel, bool strictMath)
> +  bool llvmToGen(ir::Unit &unit, const char *fileName,const void* module,
> +                 int optLevel, bool strictMath, int profiling)
>    {
>      std::string errInfo;
>      std::unique_ptr<llvm::raw_fd_ostream> o = NULL; @@ -298,6 +299,10
> @@ namespace gbe
>      passes.add(createDeadInstEliminationPass());   // Remove simplified
> instructions
>      passes.add(createCFGSimplificationPass());     // Merge & remove BBs
>      passes.add(createLowerSwitchPass());           // simplify cfg will generate
> switch-case instruction
> +    if (profiling) {
> +      passes.add(createProfilingInserterPass(profiling));     // insert the time
> stamp for profiling.
> +      unit.setInProfilingMode(true);
> +    }
I think it is not a good idea to change the unit in llvmToGen function. How about move it to createProfilingInserterPass?

>      passes.add(createScalarizePass());             // Expand all vector ops
> 
>      if(OCL_OUTPUT_CFG)
> diff --git a/backend/src/llvm/llvm_to_gen.hpp
> b/backend/src/llvm/llvm_to_gen.hpp
> index 22ffcb4..5667197 100644
> --- a/backend/src/llvm/llvm_to_gen.hpp
> +++ b/backend/src/llvm/llvm_to_gen.hpp
> @@ -32,7 +32,8 @@ namespace gbe {
> 
>    /*! Convert the LLVM IR code to a GEN IR code,
>  		  optLevel 0 equal to clang -O1 and 1 equal to clang -O2*/
> -  bool llvmToGen(ir::Unit &unit, const char *fileName, const void* module,
> int optLevel, bool strictMath);
> +  bool llvmToGen(ir::Unit &unit, const char *fileName, const void* module,
> +                 int optLevel, bool strictMath, int profiling);
> 
>  } /* namespace gbe */
> 
> --
> 1.7.9.5
> 
> 
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list