mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-03 06:49:52 +08:00
feat(ocl): Generate minimal set of args info
Provide minimalistic arg info metada when provided native binary is missing kernels_misc_info section. - For args passed by value and by pointer (-images/samplers), do not specify type name - instead, return an opaque* type name with size. Signed-off-by: Kacper Nowak <kacper.nowak@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
9f3fc6858e
commit
a262bffeb4
@@ -490,9 +490,7 @@ cl_int Kernel::getArgInfo(cl_uint argIndex, cl_kernel_arg_info paramName, size_t
|
||||
}
|
||||
|
||||
program->callPopulateZebinExtendedArgsMetadataOnce(clDevice.getRootDeviceIndex());
|
||||
if (kernelInfo.kernelDescriptor.explicitArgsExtendedMetadata.empty()) {
|
||||
return CL_KERNEL_ARG_INFO_NOT_AVAILABLE;
|
||||
}
|
||||
program->callGenerateDefaultExtendedArgsMetadataOnce(clDevice.getRootDeviceIndex());
|
||||
|
||||
const auto &argTraits = args[argIndex].getTraits();
|
||||
const auto &argMetadata = kernelInfo.kernelDescriptor.explicitArgsExtendedMetadata[argIndex];
|
||||
|
||||
@@ -381,4 +381,98 @@ void Program::callPopulateZebinExtendedArgsMetadataOnce(uint32_t rootDeviceIndex
|
||||
};
|
||||
std::call_once(extractAndDecodeMetadataOnce, extractAndDecodeMetadata);
|
||||
}
|
||||
|
||||
void Program::callGenerateDefaultExtendedArgsMetadataOnce(uint32_t rootDeviceIndex) {
|
||||
auto ensureTypeNone = [](ArgTypeTraits &typeTraits) -> void {
|
||||
typeTraits.typeQualifiers.constQual = false;
|
||||
typeTraits.typeQualifiers.pipeQual = false;
|
||||
typeTraits.typeQualifiers.restrictQual = false;
|
||||
typeTraits.typeQualifiers.unknownQual = false;
|
||||
typeTraits.typeQualifiers.volatileQual = false;
|
||||
};
|
||||
|
||||
auto &buildInfo = this->buildInfos[rootDeviceIndex];
|
||||
auto generateDefaultMetadata = [&]() {
|
||||
for (const auto &kernelInfo : buildInfo.kernelInfoArray) {
|
||||
if (false == kernelInfo->kernelDescriptor.explicitArgsExtendedMetadata.empty()) {
|
||||
continue;
|
||||
}
|
||||
size_t argIndex = 0u;
|
||||
kernelInfo->kernelDescriptor.explicitArgsExtendedMetadata.resize(kernelInfo->kernelDescriptor.payloadMappings.explicitArgs.size());
|
||||
for (auto &kernelArg : kernelInfo->kernelDescriptor.payloadMappings.explicitArgs) {
|
||||
ArgTypeMetadataExtended argMetadataExtended;
|
||||
auto &argTypeTraits = kernelArg.getTraits();
|
||||
argMetadataExtended.argName = std::string("arg" + std::to_string(argIndex));
|
||||
|
||||
if (kernelArg.is<ArgDescriptor::ArgTValue>()) {
|
||||
const auto &argAsValue = kernelArg.as<ArgDescValue>(false);
|
||||
uint16_t maxSourceOffset = 0u, elemSize = 0u;
|
||||
for (const auto &elem : argAsValue.elements) {
|
||||
if (maxSourceOffset <= elem.sourceOffset) {
|
||||
maxSourceOffset = elem.sourceOffset;
|
||||
elemSize = elem.size;
|
||||
}
|
||||
}
|
||||
if (maxSourceOffset != 0u) {
|
||||
argMetadataExtended.type = std::string("__opaque_var;" + std::to_string(maxSourceOffset + elemSize));
|
||||
} else {
|
||||
argMetadataExtended.type = std::string("__opaque;" + std::to_string(elemSize));
|
||||
}
|
||||
ensureTypeNone(argTypeTraits);
|
||||
argTypeTraits.addressQualifier = KernelArgMetadata::AddrPrivate;
|
||||
argTypeTraits.accessQualifier = KernelArgMetadata::AccessNone;
|
||||
} else if (kernelArg.is<ArgDescriptor::ArgTPointer>()) {
|
||||
const auto &argAsPtr = kernelArg.as<ArgDescPointer>(false);
|
||||
argMetadataExtended.type = std::string("__opaque_ptr;" + std::to_string(argAsPtr.pointerSize));
|
||||
} else if (kernelArg.is<ArgDescriptor::ArgTImage>()) {
|
||||
const auto &argAsImage = kernelArg.as<ArgDescImage>(false);
|
||||
switch (argAsImage.imageType) {
|
||||
case NEOImageType::ImageTypeBuffer:
|
||||
argMetadataExtended.type = std::string("image1d_buffer_t");
|
||||
break;
|
||||
case NEOImageType::ImageType1D:
|
||||
argMetadataExtended.type = std::string("image1d_t");
|
||||
break;
|
||||
case NEOImageType::ImageType1DArray:
|
||||
argMetadataExtended.type = std::string("image1d_array_t");
|
||||
break;
|
||||
case NEOImageType::ImageType2DArray:
|
||||
argMetadataExtended.type = std::string("image2d_array_t");
|
||||
break;
|
||||
case NEOImageType::ImageType3D:
|
||||
argMetadataExtended.type = std::string("image3d_t");
|
||||
break;
|
||||
case NEOImageType::ImageType2DDepth:
|
||||
argMetadataExtended.type = std::string("image2d_depth_t");
|
||||
break;
|
||||
case NEOImageType::ImageType2DArrayDepth:
|
||||
argMetadataExtended.type = std::string("image2d_array_depth_t");
|
||||
break;
|
||||
case NEOImageType::ImageType2DMSAA:
|
||||
argMetadataExtended.type = std::string("image2d_msaa_t");
|
||||
break;
|
||||
case NEOImageType::ImageType2DMSAADepth:
|
||||
argMetadataExtended.type = std::string("image2d_msaa_depth_t");
|
||||
break;
|
||||
case NEOImageType::ImageType2DArrayMSAA:
|
||||
argMetadataExtended.type = std::string("image2d_array_msaa_t");
|
||||
break;
|
||||
case NEOImageType::ImageType2DArrayMSAADepth:
|
||||
argMetadataExtended.type = std::string("image2d_array_msaa_depth_t");
|
||||
break;
|
||||
default:
|
||||
argMetadataExtended.type = std::string("image2d_t");
|
||||
break;
|
||||
}
|
||||
} else if (kernelArg.is<ArgDescriptor::ArgTSampler>()) {
|
||||
argMetadataExtended.type = std::string("sampler_t");
|
||||
}
|
||||
kernelInfo->kernelDescriptor.explicitArgsExtendedMetadata.at(argIndex) = std::move(argMetadataExtended);
|
||||
argIndex++;
|
||||
}
|
||||
}
|
||||
};
|
||||
std::call_once(generateDefaultMetadataOnce, generateDefaultMetadata);
|
||||
}
|
||||
|
||||
} // namespace NEO
|
||||
|
||||
@@ -282,6 +282,7 @@ class Program : public BaseObject<_cl_program> {
|
||||
MOCKABLE_VIRTUAL void createDebugZebin(uint32_t rootDeviceIndex);
|
||||
Debug::Segments getZebinSegments(uint32_t rootDeviceIndex);
|
||||
MOCKABLE_VIRTUAL void callPopulateZebinExtendedArgsMetadataOnce(uint32_t rootDeviceIndex);
|
||||
MOCKABLE_VIRTUAL void callGenerateDefaultExtendedArgsMetadataOnce(uint32_t rootDeviceIndex);
|
||||
|
||||
protected:
|
||||
MOCKABLE_VIRTUAL cl_int createProgramFromBinary(const void *pBinary, size_t binarySize, ClDevice &clDevice);
|
||||
@@ -376,6 +377,7 @@ class Program : public BaseObject<_cl_program> {
|
||||
size_t exportedFunctionsKernelId = std::numeric_limits<size_t>::max();
|
||||
|
||||
std::once_flag extractAndDecodeMetadataOnce;
|
||||
std::once_flag generateDefaultMetadataOnce;
|
||||
};
|
||||
|
||||
} // namespace NEO
|
||||
|
||||
Reference in New Issue
Block a user