@@ -1797,7 +1797,6 @@ cl_int ExecCGCommand::enqueueImp() {
1797
1797
1798
1798
// Run OpenCL kernel
1799
1799
sycl::context Context = MQueue->get_context ();
1800
- const detail::plugin &Plugin = MQueue->getPlugin ();
1801
1800
RT::PiKernel Kernel = nullptr ;
1802
1801
std::mutex *KernelMutex = nullptr ;
1803
1802
@@ -1810,65 +1809,75 @@ cl_int ExecCGCommand::enqueueImp() {
1810
1809
detail::ProgramManager::getInstance ().getOrCreateKernel (
1811
1810
ExecKernel->MOSModuleHandle , Context, ExecKernel->MKernelName ,
1812
1811
nullptr );
1813
- KernelMutex->lock ();
1814
1812
}
1815
1813
1816
- for (ArgDesc &Arg : ExecKernel->MArgs ) {
1817
- switch (Arg.MType ) {
1818
- case kernel_param_kind_t ::kind_accessor: {
1819
- Requirement *Req = (Requirement *)(Arg.MPtr );
1820
- AllocaCommandBase *AllocaCmd = getAllocaForReq (Req);
1821
- RT::PiMem MemArg = (RT::PiMem)AllocaCmd->getMemAllocation ();
1822
- if (Plugin.getBackend () == backend::opencl) {
1814
+ auto SetKernelParamsAndLaunch = [this , &ExecKernel, &Kernel, &NDRDesc,
1815
+ &RawEvents, &Event] {
1816
+ const detail::plugin &Plugin = MQueue->getPlugin ();
1817
+ for (ArgDesc &Arg : ExecKernel->MArgs ) {
1818
+ switch (Arg.MType ) {
1819
+ case kernel_param_kind_t ::kind_accessor: {
1820
+ Requirement *Req = (Requirement *)(Arg.MPtr );
1821
+ AllocaCommandBase *AllocaCmd = getAllocaForReq (Req);
1822
+ RT::PiMem MemArg = (RT::PiMem)AllocaCmd->getMemAllocation ();
1823
+ if (Plugin.getBackend () == backend::opencl) {
1824
+ Plugin.call <PiApiKind::piKernelSetArg>(Kernel, Arg.MIndex ,
1825
+ sizeof (RT::PiMem), &MemArg);
1826
+ } else {
1827
+ Plugin.call <PiApiKind::piextKernelSetArgMemObj>(Kernel, Arg.MIndex ,
1828
+ &MemArg);
1829
+ }
1830
+ break ;
1831
+ }
1832
+ case kernel_param_kind_t ::kind_std_layout: {
1833
+ Plugin.call <PiApiKind::piKernelSetArg>(Kernel, Arg.MIndex , Arg.MSize ,
1834
+ Arg.MPtr );
1835
+ break ;
1836
+ }
1837
+ case kernel_param_kind_t ::kind_sampler: {
1838
+ sampler *SamplerPtr = (sampler *)Arg.MPtr ;
1839
+ RT::PiSampler Sampler =
1840
+ detail::getSyclObjImpl (*SamplerPtr)
1841
+ ->getOrCreateSampler (MQueue->get_context ());
1823
1842
Plugin.call <PiApiKind::piKernelSetArg>(Kernel, Arg.MIndex ,
1824
- sizeof (RT::PiMem), &MemArg);
1825
- } else {
1826
- Plugin.call <PiApiKind::piextKernelSetArgMemObj>(Kernel, Arg.MIndex ,
1827
- &MemArg);
1843
+ sizeof (cl_sampler), &Sampler);
1844
+ break ;
1845
+ }
1846
+ case kernel_param_kind_t ::kind_pointer: {
1847
+ Plugin.call <PiApiKind::piextKernelSetArgPointer>(Kernel, Arg.MIndex ,
1848
+ Arg.MSize , Arg.MPtr );
1849
+ break ;
1850
+ }
1828
1851
}
1829
- break ;
1830
- }
1831
- case kernel_param_kind_t ::kind_std_layout: {
1832
- Plugin.call <PiApiKind::piKernelSetArg>(Kernel, Arg.MIndex , Arg.MSize ,
1833
- Arg.MPtr );
1834
- break ;
1835
- }
1836
- case kernel_param_kind_t ::kind_sampler: {
1837
- sampler *SamplerPtr = (sampler *)Arg.MPtr ;
1838
- RT::PiSampler Sampler =
1839
- detail::getSyclObjImpl (*SamplerPtr)->getOrCreateSampler (Context);
1840
- Plugin.call <PiApiKind::piKernelSetArg>(Kernel, Arg.MIndex ,
1841
- sizeof (cl_sampler), &Sampler);
1842
- break ;
1843
- }
1844
- case kernel_param_kind_t ::kind_pointer: {
1845
- Plugin.call <PiApiKind::piextKernelSetArgPointer>(Kernel, Arg.MIndex ,
1846
- Arg.MSize , Arg.MPtr );
1847
- break ;
1848
- }
1849
1852
}
1850
- }
1851
-
1852
- adjustNDRangePerKernel (NDRDesc, Kernel,
1853
- *(detail::getSyclObjImpl (MQueue->get_device ())));
1854
1853
1855
- // Some PI Plugins (like OpenCL) require this call to enable USM
1856
- // For others, PI will turn this into a NOP.
1857
- Plugin.call <PiApiKind::piKernelSetExecInfo>(Kernel, PI_USM_INDIRECT_ACCESS,
1858
- sizeof (pi_bool), &PI_TRUE);
1854
+ adjustNDRangePerKernel (NDRDesc, Kernel,
1855
+ *(detail::getSyclObjImpl (MQueue->get_device ())));
1859
1856
1860
- // Remember this information before the range dimensions are reversed
1861
- const bool HasLocalSize = (NDRDesc.LocalSize [0 ] != 0 );
1857
+ // Some PI Plugins (like OpenCL) require this call to enable USM
1858
+ // For others, PI will turn this into a NOP.
1859
+ Plugin.call <PiApiKind::piKernelSetExecInfo>(
1860
+ Kernel, PI_USM_INDIRECT_ACCESS, sizeof (pi_bool), &PI_TRUE);
1862
1861
1863
- ReverseRangeDimensionsForKernel (NDRDesc);
1862
+ // Remember this information before the range dimensions are reversed
1863
+ const bool HasLocalSize = (NDRDesc.LocalSize [0 ] != 0 );
1864
1864
1865
- pi_result Error = Plugin.call_nocheck <PiApiKind::piEnqueueKernelLaunch>(
1866
- MQueue->getHandleRef (), Kernel, NDRDesc.Dims , &NDRDesc.GlobalOffset [0 ],
1867
- &NDRDesc.GlobalSize [0 ], HasLocalSize ? &NDRDesc.LocalSize [0 ] : nullptr ,
1868
- RawEvents.size (), RawEvents.empty () ? nullptr : &RawEvents[0 ], &Event);
1865
+ ReverseRangeDimensionsForKernel (NDRDesc);
1866
+ pi_result Error = Plugin.call_nocheck <PiApiKind::piEnqueueKernelLaunch>(
1867
+ MQueue->getHandleRef (), Kernel, NDRDesc.Dims ,
1868
+ &NDRDesc.GlobalOffset [0 ], &NDRDesc.GlobalSize [0 ],
1869
+ HasLocalSize ? &NDRDesc.LocalSize [0 ] : nullptr , RawEvents.size (),
1870
+ RawEvents.empty () ? nullptr : &RawEvents[0 ], &Event);
1871
+ return Error;
1872
+ };
1869
1873
1870
- if (KernelMutex != nullptr )
1871
- KernelMutex->unlock ();
1874
+ pi_result Error = PI_SUCCESS;
1875
+ if (KernelMutex != nullptr ) {
1876
+ std::lock_guard<std::mutex> Lock (*KernelMutex);
1877
+ Error = SetKernelParamsAndLaunch ();
1878
+ } else {
1879
+ Error = SetKernelParamsAndLaunch ();
1880
+ }
1872
1881
1873
1882
if (PI_SUCCESS != Error) {
1874
1883
// If we have got non-success error code, let's analyze it to emit nice
0 commit comments