Skip to content

Commit fcb4e6c

Browse files
committed
[SYCL] Use lock_guard to lock mutex
Signed-off-by: Alexander Flegontov <[email protected]>
1 parent 2bdd731 commit fcb4e6c

File tree

2 files changed

+60
-50
lines changed

2 files changed

+60
-50
lines changed

sycl/source/detail/scheduler/commands.cpp

Lines changed: 59 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1797,7 +1797,6 @@ cl_int ExecCGCommand::enqueueImp() {
17971797

17981798
// Run OpenCL kernel
17991799
sycl::context Context = MQueue->get_context();
1800-
const detail::plugin &Plugin = MQueue->getPlugin();
18011800
RT::PiKernel Kernel = nullptr;
18021801
std::mutex *KernelMutex = nullptr;
18031802

@@ -1810,65 +1809,75 @@ cl_int ExecCGCommand::enqueueImp() {
18101809
detail::ProgramManager::getInstance().getOrCreateKernel(
18111810
ExecKernel->MOSModuleHandle, Context, ExecKernel->MKernelName,
18121811
nullptr);
1813-
KernelMutex->lock();
18141812
}
18151813

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());
18231842
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+
}
18281851
}
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-
}
18491852
}
1850-
}
1851-
1852-
adjustNDRangePerKernel(NDRDesc, Kernel,
1853-
*(detail::getSyclObjImpl(MQueue->get_device())));
18541853

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())));
18591856

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);
18621861

1863-
ReverseRangeDimensionsForKernel(NDRDesc);
1862+
// Remember this information before the range dimensions are reversed
1863+
const bool HasLocalSize = (NDRDesc.LocalSize[0] != 0);
18641864

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+
};
18691873

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+
}
18721881

18731882
if (PI_SUCCESS != Error) {
18741883
// If we have got non-success error code, let's analyze it to emit nice

sycl/source/detail/scheduler/scheduler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ EventImplPtr Scheduler::addCG(std::unique_ptr<detail::CG> CommandGroup,
8484

8585
{
8686
std::shared_lock<std::shared_timed_mutex> Lock(MGraphLock);
87+
8788
// TODO: Check if lazy mode.
8889
EnqueueResultT Res;
8990
bool Enqueued = GraphProcessor::enqueueCommand(NewCmd, Res);

0 commit comments

Comments
 (0)