@@ -85,6 +85,7 @@ void ZEBinaryBuilder::createKernel(
8585 addPayloadArgsAndBTI (annotations, zeKernel);
8686 addMemoryBuffer (annotations, zeKernel);
8787 addGTPinInfo (annotations);
88+ addFunctionAttrs (annotations);
8889 if (!visaasm.empty ())
8990 addKernelVISAAsm (annotations.m_kernelName , visaasm);
9091 if (isProgramDebuggable)
@@ -123,6 +124,29 @@ void ZEBinaryBuilder::addGTPinInfo(const IGC::SOpenCLKernelInfo& annotations)
123124 }
124125}
125126
127+ void ZEBinaryBuilder::addFunctionAttrs (const IGC::SOpenCLKernelInfo& annotations)
128+ {
129+ // get function attribute list from the current process SKernelProgram
130+ auto funcAttrs = [](int simdSize, const IGC::SKernelProgram& program) {
131+ if (simdSize == 8 )
132+ return program.simd8 .m_funcAttrs ;
133+ else if (simdSize == 16 )
134+ return program.simd16 .m_funcAttrs ;
135+ else if (simdSize == 32 )
136+ return program.simd32 .m_funcAttrs ;
137+ else
138+ return program.simd1 .m_funcAttrs ;
139+ } (annotations.m_executionEnivronment .CompiledSIMDSize ,
140+ annotations.m_kernelProgram );
141+
142+ for (auto & funcAttr : funcAttrs) {
143+ if (!funcAttr.f_isKernel && funcAttr.f_isExternal ) {
144+ zeInfoFunction& zeFunction = mZEInfoBuilder .createFunction (funcAttr.f_name );
145+ addFunctionExecEnv (annotations, funcAttr, zeFunction);
146+ }
147+ }
148+ }
149+
126150void ZEBinaryBuilder::addProgramScopeInfo (const IGC::SOpenCLProgramInfo& programInfo)
127151{
128152 addGlobalConstants (programInfo);
@@ -493,6 +517,18 @@ void ZEBinaryBuilder::addKernelExecEnv(const SOpenCLKernelInfo& annotations,
493517 }
494518}
495519
520+ void ZEBinaryBuilder::addFunctionExecEnv (const SOpenCLKernelInfo& annotations,
521+ const vISA::ZEFuncAttribEntry& zeFuncAttr,
522+ zeInfoFunction& zeFunction)
523+ {
524+ // TODO: Currently we only set barrier count and other required information
525+ // such as GRF count and SIMD size in per-function execution environment.
526+ zeInfoExecutionEnv& env = zeFunction.execution_env ;
527+ env.grf_count = annotations.m_executionEnivronment .NumGRFRequired ;
528+ env.simd_size = annotations.m_executionEnivronment .CompiledSIMDSize ;
529+ env.barrier_count = zeFuncAttr.f_BarrierCount ;
530+ }
531+
496532void ZEBinaryBuilder::addLocalIds (uint32_t simdSize, uint32_t grfSize,
497533 bool has_local_id_x, bool has_local_id_y, bool has_local_id_z,
498534 zebin::zeInfoKernel& zeinfoKernel)
0 commit comments