Use MultiDeviceKernel instead of Kernel in clCloneKernel

Related-To: NEO-5001
Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski
2021-03-18 15:05:25 +00:00
committed by Compute-Runtime-Automation
parent 693f2ff384
commit 487f10f999
5 changed files with 370 additions and 296 deletions

View File

@@ -636,7 +636,7 @@ class Kernel : public ReferenceTrackedObject<Kernel> {
bool singleSubdevicePreferedInCurrentEnqueue = false;
bool kernelHasIndirectAccess = true;
MultiDeviceKernel *pMultiDeviceKernel;
MultiDeviceKernel *pMultiDeviceKernel = nullptr;
};
} // namespace NEO

View File

@@ -15,12 +15,21 @@ MultiDeviceKernel::~MultiDeviceKernel() {
}
}
}
MultiDeviceKernel::MultiDeviceKernel(KernelVectorType kernelVector) : kernels(std::move(kernelVector)) {
Kernel *MultiDeviceKernel::determineDefaultKernel(KernelVectorType &kernelVector) {
for (auto &pKernel : kernelVector) {
if (pKernel) {
return kernelVector[(*pKernel->getDevices().begin())->getRootDeviceIndex()];
}
}
return nullptr;
}
MultiDeviceKernel::MultiDeviceKernel(KernelVectorType kernelVector) : kernels(std::move(kernelVector)),
defaultKernel(MultiDeviceKernel::determineDefaultKernel(kernels)),
program(defaultKernel->getProgram()),
kernelInfos(defaultKernel->getKernelInfos()) {
for (auto &pKernel : kernels) {
if (pKernel) {
if (!defaultKernel) {
defaultKernel = kernels[(*pKernel->getDevices().begin())->getRootDeviceIndex()];
}
pKernel->incRefInternal();
pKernel->setMultiDeviceKernel(this);
}
@@ -35,7 +44,6 @@ size_t MultiDeviceKernel::getKernelArgsNumber() const { return defaultKernel->ge
Context &MultiDeviceKernel::getContext() const { return defaultKernel->getContext(); }
bool MultiDeviceKernel::getHasIndirectAccess() const { return defaultKernel->getHasIndirectAccess(); }
cl_int MultiDeviceKernel::cloneKernel(Kernel *pSourceKernel) { return getResultFromEachKernel(&Kernel::cloneKernel, pSourceKernel); }
cl_int MultiDeviceKernel::checkCorrectImageAccessQualifier(cl_uint argIndex, size_t argSize, const void *argValue) const { return getResultFromEachKernel(&Kernel::checkCorrectImageAccessQualifier, argIndex, argSize, argValue); }
void MultiDeviceKernel::unsetArg(uint32_t argIndex) { callOnEachKernel(&Kernel::unsetArg, argIndex); }
cl_int MultiDeviceKernel::setArg(uint32_t argIndex, size_t argSize, const void *argVal) { return getResultFromEachKernel(&Kernel::setArgument, argIndex, argSize, argVal); }
@@ -49,4 +57,14 @@ int MultiDeviceKernel::setKernelThreadArbitrationPolicy(uint32_t propertyValue)
cl_int MultiDeviceKernel::setKernelExecutionType(cl_execution_info_kernel_type_intel executionType) { return getResultFromEachKernel(&Kernel::setKernelExecutionType, executionType); }
int32_t MultiDeviceKernel::setAdditionalKernelExecInfoWithParam(uint32_t paramName, size_t paramValueSize, const void *paramValue) { return getResultFromEachKernel(&Kernel::setAdditionalKernelExecInfoWithParam, paramName, paramValueSize, paramValue); }
cl_int MultiDeviceKernel::cloneKernel(MultiDeviceKernel *pSourceMultiDeviceKernel) {
for (auto rootDeviceIndex = 0u; rootDeviceIndex < kernels.size(); rootDeviceIndex++) {
auto pSrcKernel = pSourceMultiDeviceKernel->getKernel(rootDeviceIndex);
auto pDstKernel = getKernel(rootDeviceIndex);
if (pSrcKernel) {
pDstKernel->cloneKernel(pSrcKernel);
}
}
return CL_SUCCESS;
}
} // namespace NEO

View File

@@ -43,7 +43,7 @@ class MultiDeviceKernel : public BaseObject<_cl_kernel> {
return pMultiDeviceKernel;
}
cl_int cloneKernel(Kernel *pSourceKernel);
cl_int cloneKernel(MultiDeviceKernel *pSourceMultiDeviceKernel);
const std::vector<Kernel::SimpleKernelArgInfo> &getKernelArguments() const;
cl_int checkCorrectImageAccessQualifier(cl_uint argIndex, size_t argSize, const void *argValue) const;
void unsetArg(uint32_t argIndex);
@@ -63,6 +63,8 @@ class MultiDeviceKernel : public BaseObject<_cl_kernel> {
int setKernelThreadArbitrationPolicy(uint32_t propertyValue);
cl_int setKernelExecutionType(cl_execution_info_kernel_type_intel executionType);
int32_t setAdditionalKernelExecInfoWithParam(uint32_t paramName, size_t paramValueSize, const void *paramValue);
Program *getProgram() const { return program; }
const KernelInfoContainer &getKernelInfos() const { return kernelInfos; }
protected:
template <typename FuncType, typename... Args>
@@ -87,8 +89,11 @@ class MultiDeviceKernel : public BaseObject<_cl_kernel> {
}
}
}
static Kernel *determineDefaultKernel(KernelVectorType &kernelVector);
KernelVectorType kernels;
Kernel *defaultKernel = nullptr;
Program *program = nullptr;
const KernelInfoContainer &kernelInfos;
};
} // namespace NEO