From: Junyan He <junyan...@linux.intel.com> Signed-off-by: Bai Yannan <yannan....@intel.com> --- backend/src/backend/program.cpp | 26 +++++++++++++++++++++++++- backend/src/backend/program.h | 11 +++++++++++ backend/src/backend/program.hpp | 22 ++++++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-)
diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp index bad3749..cb15443 100644 --- a/backend/src/backend/program.cpp +++ b/backend/src/backend/program.cpp @@ -89,12 +89,14 @@ namespace gbe { Kernel::Kernel(const std::string &name) : name(name), args(NULL), argNum(0), curbeSize(0), stackSize(0), useSLM(false), - slmSize(0), ctx(NULL), samplerSet(NULL), imageSet(NULL), printfSet(NULL) {} + slmSize(0), ctx(NULL), samplerSet(NULL), imageSet(NULL), printfSet(NULL), + profilingInfo(NULL) {} Kernel::~Kernel(void) { if(ctx) GBE_DELETE(ctx); if(samplerSet) GBE_DELETE(samplerSet); if(imageSet) GBE_DELETE(imageSet); if(printfSet) GBE_DELETE(printfSet); + if(profilingInfo) GBE_DELETE(profilingInfo); GBE_SAFE_DELETE_ARRAY(args); } int32_t Kernel::getCurbeOffset(gbe_curbe_type type, uint32_t subType) const { @@ -160,6 +162,7 @@ namespace gbe { for (const auto &pair : set) { const std::string &name = pair.first; Kernel *kernel = this->compileKernel(unit, name, !OCL_STRICT_CONFORMANCE, OCL_PROFILING_LOG); + kernel->setProfilingInfo(new ir::ProfilingInfo(*unit.getProfilingInfo())); kernel->setSamplerSet(pair.second->getSamplerSet()); kernel->setImageSet(pair.second->getImageSet()); kernel->setPrintfSet(pair.second->getPrintfSet()); @@ -1076,6 +1079,21 @@ namespace gbe { kernel->getSamplerData(samplers); } + static void* kernelDupProfiling(gbe_kernel gbeKernel) { + if (gbeKernel == NULL) return NULL; + const gbe::Kernel *kernel = (const gbe::Kernel*) gbeKernel; + return kernel->dupProfilingInfo(); + } + static uint32_t kernelGetProfilingBTI(gbe_kernel gbeKernel) { + if (gbeKernel == NULL) return 0; + const gbe::Kernel *kernel = (const gbe::Kernel*) gbeKernel; + return kernel->getProfilingBTI(); + } + static void kernelOutputProfiling(void *profiling_info, void* buf) { + if (profiling_info == NULL) return; + ir::ProfilingInfo *pi = (ir::ProfilingInfo *)profiling_info; + return pi->outputProfilingInfo(buf); + } static uint32_t kernelGetPrintfNum(void * printf_info) { if (printf_info == NULL) return 0; const ir::PrintfSet *ps = (ir::PrintfSet *)printf_info; @@ -1197,6 +1215,9 @@ GBE_EXPORT_SYMBOL gbe_kernel_get_sampler_data_cb *gbe_kernel_get_sampler_data = GBE_EXPORT_SYMBOL gbe_kernel_get_compile_wg_size_cb *gbe_kernel_get_compile_wg_size = NULL; GBE_EXPORT_SYMBOL gbe_kernel_get_image_size_cb *gbe_kernel_get_image_size = NULL; GBE_EXPORT_SYMBOL gbe_kernel_get_image_data_cb *gbe_kernel_get_image_data = NULL; +GBE_EXPORT_SYMBOL gbe_output_profiling_cb *gbe_output_profiling = NULL; +GBE_EXPORT_SYMBOL gbe_dup_profiling_cb *gbe_dup_profiling = NULL; +GBE_EXPORT_SYMBOL gbe_get_profiling_bti_cb *gbe_get_profiling_bti = NULL; GBE_EXPORT_SYMBOL gbe_get_printf_num_cb *gbe_get_printf_num = NULL; GBE_EXPORT_SYMBOL gbe_dup_printfset_cb *gbe_dup_printfset = NULL; GBE_EXPORT_SYMBOL gbe_get_printf_buf_bti_cb *gbe_get_printf_buf_bti = NULL; @@ -1245,7 +1266,10 @@ namespace gbe gbe_kernel_get_compile_wg_size = gbe::kernelGetCompileWorkGroupSize; gbe_kernel_get_image_size = gbe::kernelGetImageSize; gbe_kernel_get_image_data = gbe::kernelGetImageData; + gbe_get_profiling_bti = gbe::kernelGetProfilingBTI; gbe_get_printf_num = gbe::kernelGetPrintfNum; + gbe_dup_profiling = gbe::kernelDupProfiling; + gbe_output_profiling = gbe::kernelOutputProfiling; gbe_get_printf_buf_bti = gbe::kernelGetPrintfBufBTI; gbe_get_printf_indexbuf_bti = gbe::kernelGetPrintfIndexBufBTI; gbe_dup_printfset = gbe::kernelDupPrintfSet; diff --git a/backend/src/backend/program.h b/backend/src/backend/program.h index bf1c1ba..66a1a19 100644 --- a/backend/src/backend/program.h +++ b/backend/src/backend/program.h @@ -142,6 +142,17 @@ extern gbe_kernel_get_image_size_cb *gbe_kernel_get_image_size; typedef void (gbe_kernel_get_image_data_cb)(gbe_kernel gbeKernel, ImageInfo *images); extern gbe_kernel_get_image_data_cb *gbe_kernel_get_image_data; +/*! Get whether we are in the code profiling mode */ +typedef void (gbe_output_profiling_cb)(void* profiling_info, void* buf); +extern gbe_output_profiling_cb *gbe_output_profiling; + +/*! Get the profiling bti */ +typedef uint32_t (gbe_get_profiling_bti_cb)(gbe_kernel gbeKernel); +extern gbe_get_profiling_bti_cb *gbe_get_profiling_bti; + +typedef void* (gbe_dup_profiling_cb)(gbe_kernel gbeKernel); +extern gbe_dup_profiling_cb *gbe_dup_profiling; + /*! Get the printf number */ typedef uint32_t (gbe_get_printf_num_cb)(void* printf_info); extern gbe_get_printf_num_cb *gbe_get_printf_num; diff --git a/backend/src/backend/program.hpp b/backend/src/backend/program.hpp index d533cea..9a8bd23 100644 --- a/backend/src/backend/program.hpp +++ b/backend/src/backend/program.hpp @@ -128,6 +128,17 @@ namespace gbe { void setImageSet(ir::ImageSet * from) { imageSet = from; } + /*! Set profiling info. */ + void setProfilingInfo(ir::ProfilingInfo * from) { + profilingInfo = from; + } + void * dupProfilingInfo() const { + void* ptr = profilingInfo ? (void *)(new ir::ProfilingInfo(*profilingInfo)) : NULL; + return ptr; + } + uint32_t getProfilingBTI(void) const { + return profilingInfo ? profilingInfo->getBTI() : 0; + } /*! Set printf set. */ void setPrintfSet(ir::PrintfSet * from) { printfSet = from; @@ -161,6 +172,16 @@ namespace gbe { global_wk_sz1, global_wk_sz2, output_sz); } + uint32_t getProfilingBufBTI() const { + GBE_ASSERT(profilingInfo); + return profilingInfo->getBTI(); + } + + void outputProfilingInfo(void* buf) { + if(profilingInfo) + profilingInfo->outputProfilingInfo(buf); + } + ir::FunctionArgument::InfoFromLLVM* getArgInfo(uint32_t id) const { return &args[id].info; } /*! Set compile work group size */ @@ -231,6 +252,7 @@ namespace gbe { ir::SamplerSet *samplerSet;//!< Copy from the corresponding function. ir::ImageSet *imageSet; //!< Copy from the corresponding function. ir::PrintfSet *printfSet; //!< Copy from the corresponding function. + ir::ProfilingInfo *profilingInfo; //!< Copy from the corresponding function. size_t compileWgSize[3]; //!< required work group size by kernel attribute. std::string functionAttributes; //!< function attribute qualifiers combined. GBE_CLASS(Kernel); //!< Use custom allocators -- 1.7.9.5 _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/beignet