2017-12-21 07:45:38 +08:00
|
|
|
/*
|
2021-05-17 02:51:16 +08:00
|
|
|
* Copyright (C) 2018-2021 Intel Corporation
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
2018-09-18 15:11:08 +08:00
|
|
|
* SPDX-License-Identifier: MIT
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2020-02-24 05:44:01 +08:00
|
|
|
#include "shared/source/helpers/get_info.h"
|
2019-02-27 18:39:32 +08:00
|
|
|
|
2020-02-24 05:44:01 +08:00
|
|
|
#include "shared/source/device/device.h"
|
2021-09-30 03:10:53 +08:00
|
|
|
#include "shared/source/program/kernel_info.h"
|
2020-02-24 17:22:30 +08:00
|
|
|
|
2020-03-20 18:15:25 +08:00
|
|
|
#include "opencl/source/cl_device/cl_device.h"
|
2020-02-23 05:50:57 +08:00
|
|
|
#include "opencl/source/context/context.h"
|
|
|
|
#include "opencl/source/helpers/base_object.h"
|
2021-10-13 02:58:51 +08:00
|
|
|
#include "opencl/source/helpers/cl_validators.h"
|
2020-02-23 05:50:57 +08:00
|
|
|
#include "opencl/source/helpers/get_info_status_mapper.h"
|
2019-02-27 18:39:32 +08:00
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
#include "program.h"
|
|
|
|
|
2019-03-26 18:59:46 +08:00
|
|
|
namespace NEO {
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
cl_int Program::getInfo(cl_program_info paramName, size_t paramValueSize,
|
|
|
|
void *paramValue, size_t *paramValueSizeRet) {
|
|
|
|
cl_int retVal = CL_SUCCESS;
|
|
|
|
const void *pSrc = nullptr;
|
2020-05-18 22:13:59 +08:00
|
|
|
size_t srcSize = GetInfo::invalidSourceSize;
|
2017-12-21 07:45:38 +08:00
|
|
|
size_t retSize = 0;
|
|
|
|
std::string kernelNamesString;
|
|
|
|
cl_uint refCount = 0;
|
|
|
|
size_t numKernels;
|
|
|
|
cl_context clContext = context;
|
2020-04-23 00:33:32 +08:00
|
|
|
cl_uint clFalse = CL_FALSE;
|
2020-10-20 19:15:39 +08:00
|
|
|
std::vector<cl_device_id> devicesToExpose;
|
2020-10-21 16:25:03 +08:00
|
|
|
StackVec<size_t, 1> binarySizes;
|
2020-11-10 00:55:46 +08:00
|
|
|
uint32_t numDevices = static_cast<uint32_t>(clDevices.size());
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
switch (paramName) {
|
|
|
|
case CL_PROGRAM_CONTEXT:
|
|
|
|
pSrc = &clContext;
|
|
|
|
retSize = srcSize = sizeof(clContext);
|
|
|
|
break;
|
|
|
|
|
2020-10-21 16:25:03 +08:00
|
|
|
case CL_PROGRAM_BINARIES: {
|
|
|
|
auto requiredSize = clDevices.size() * sizeof(const unsigned char **);
|
|
|
|
if (!paramValue) {
|
|
|
|
retSize = requiredSize;
|
|
|
|
srcSize = 0u;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (paramValueSize < requiredSize) {
|
|
|
|
retVal = CL_INVALID_VALUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
auto outputBinaries = reinterpret_cast<unsigned char **>(paramValue);
|
|
|
|
for (auto i = 0u; i < clDevices.size(); i++) {
|
|
|
|
if (outputBinaries[i] == nullptr) {
|
|
|
|
continue;
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
2020-10-21 16:25:03 +08:00
|
|
|
auto rootDeviceIndex = clDevices[i]->getRootDeviceIndex();
|
|
|
|
auto binarySize = buildInfos[rootDeviceIndex].packedDeviceBinarySize;
|
|
|
|
memcpy_s(outputBinaries[i], binarySize, buildInfos[rootDeviceIndex].packedDeviceBinary.get(), binarySize);
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
2020-10-21 16:25:03 +08:00
|
|
|
GetInfo::setParamValueReturnSize(paramValueSizeRet, requiredSize, GetInfoStatus::SUCCESS);
|
|
|
|
return CL_SUCCESS;
|
|
|
|
} break;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
case CL_PROGRAM_BINARY_SIZES:
|
2020-10-21 16:25:03 +08:00
|
|
|
for (auto i = 0u; i < clDevices.size(); i++) {
|
|
|
|
auto rootDeviceIndex = clDevices[i]->getRootDeviceIndex();
|
2020-11-04 18:08:45 +08:00
|
|
|
packDeviceBinary(*clDevices[i]);
|
2020-10-21 16:25:03 +08:00
|
|
|
binarySizes.push_back(buildInfos[rootDeviceIndex].packedDeviceBinarySize);
|
|
|
|
}
|
|
|
|
|
|
|
|
pSrc = binarySizes.data();
|
|
|
|
retSize = srcSize = binarySizes.size() * sizeof(cl_device_id);
|
2017-12-21 07:45:38 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case CL_PROGRAM_KERNEL_NAMES:
|
2020-12-01 01:38:28 +08:00
|
|
|
kernelNamesString = concatenateKernelNames(buildInfos[clDevices[0]->getRootDeviceIndex()].kernelInfoArray);
|
2017-12-21 07:45:38 +08:00
|
|
|
pSrc = kernelNamesString.c_str();
|
|
|
|
retSize = srcSize = kernelNamesString.length() + 1;
|
|
|
|
|
2020-10-27 00:13:50 +08:00
|
|
|
if (!isBuilt()) {
|
2017-12-21 07:45:38 +08:00
|
|
|
retVal = CL_INVALID_PROGRAM_EXECUTABLE;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CL_PROGRAM_NUM_KERNELS:
|
2020-12-01 01:38:28 +08:00
|
|
|
numKernels = getNumKernels();
|
2017-12-21 07:45:38 +08:00
|
|
|
pSrc = &numKernels;
|
|
|
|
retSize = srcSize = sizeof(numKernels);
|
|
|
|
|
2020-10-27 00:13:50 +08:00
|
|
|
if (!isBuilt()) {
|
2017-12-21 07:45:38 +08:00
|
|
|
retVal = CL_INVALID_PROGRAM_EXECUTABLE;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CL_PROGRAM_NUM_DEVICES:
|
|
|
|
pSrc = &numDevices;
|
|
|
|
retSize = srcSize = sizeof(cl_uint);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CL_PROGRAM_DEVICES:
|
2020-10-20 19:15:39 +08:00
|
|
|
clDevices.toDeviceIDs(devicesToExpose);
|
|
|
|
pSrc = devicesToExpose.data();
|
|
|
|
retSize = srcSize = devicesToExpose.size() * sizeof(cl_device_id);
|
2017-12-21 07:45:38 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case CL_PROGRAM_REFERENCE_COUNT:
|
|
|
|
refCount = static_cast<cl_uint>(this->getReference());
|
|
|
|
retSize = srcSize = sizeof(refCount);
|
|
|
|
pSrc = &refCount;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CL_PROGRAM_SOURCE:
|
2019-03-15 22:26:06 +08:00
|
|
|
if (createdFrom == CreatedFrom::SOURCE) {
|
|
|
|
pSrc = sourceCode.c_str();
|
|
|
|
retSize = srcSize = strlen(sourceCode.c_str()) + 1;
|
|
|
|
} else {
|
|
|
|
if (paramValueSizeRet) {
|
|
|
|
*paramValueSizeRet = 0;
|
|
|
|
}
|
|
|
|
return CL_SUCCESS;
|
|
|
|
}
|
2017-12-21 07:45:38 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case CL_PROGRAM_IL:
|
2019-10-20 20:22:34 +08:00
|
|
|
if (createdFrom != CreatedFrom::IL) {
|
2017-12-21 07:45:38 +08:00
|
|
|
if (paramValueSizeRet) {
|
|
|
|
*paramValueSizeRet = 0;
|
|
|
|
}
|
|
|
|
return CL_SUCCESS;
|
|
|
|
}
|
2019-10-20 20:22:34 +08:00
|
|
|
pSrc = irBinary.get();
|
|
|
|
retSize = srcSize = irBinarySize;
|
2017-12-21 07:45:38 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case CL_PROGRAM_DEBUG_INFO_SIZES_INTEL:
|
|
|
|
retSize = srcSize = sizeof(debugDataSize);
|
|
|
|
pSrc = &debugDataSize;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CL_PROGRAM_DEBUG_INFO_INTEL:
|
2019-08-29 21:10:51 +08:00
|
|
|
pSrc = debugData.get();
|
2017-12-21 07:45:38 +08:00
|
|
|
retSize = numDevices * sizeof(void **);
|
|
|
|
srcSize = debugDataSize;
|
|
|
|
if (paramValue != nullptr) {
|
|
|
|
if (paramValueSize < retSize) {
|
|
|
|
retVal = CL_INVALID_VALUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
paramValueSize = srcSize;
|
|
|
|
paramValue = *(void **)paramValue;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2020-04-23 00:33:32 +08:00
|
|
|
case CL_PROGRAM_SCOPE_GLOBAL_CTORS_PRESENT:
|
|
|
|
case CL_PROGRAM_SCOPE_GLOBAL_DTORS_PRESENT:
|
|
|
|
retSize = srcSize = sizeof(clFalse);
|
|
|
|
pSrc = &clFalse;
|
|
|
|
break;
|
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
default:
|
|
|
|
retVal = CL_INVALID_VALUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2020-05-18 22:13:59 +08:00
|
|
|
auto getInfoStatus = GetInfoStatus::INVALID_VALUE;
|
|
|
|
if (retVal == CL_SUCCESS) {
|
|
|
|
getInfoStatus = GetInfo::getInfo(paramValue, paramValueSize, pSrc, srcSize);
|
|
|
|
retVal = changeGetInfoStatusToCLResultType(getInfoStatus);
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
2020-05-18 22:13:59 +08:00
|
|
|
GetInfo::setParamValueReturnSize(paramValueSizeRet, retSize, getInfoStatus);
|
2017-12-21 07:45:38 +08:00
|
|
|
return retVal;
|
|
|
|
}
|
|
|
|
|
|
|
|
cl_int Program::getBuildInfo(cl_device_id device, cl_program_build_info paramName,
|
|
|
|
size_t paramValueSize, void *paramValue, size_t *paramValueSizeRet) const {
|
|
|
|
cl_int retVal = CL_SUCCESS;
|
|
|
|
const void *pSrc = nullptr;
|
2020-05-18 22:13:59 +08:00
|
|
|
size_t srcSize = GetInfo::invalidSourceSize;
|
2017-12-21 07:45:38 +08:00
|
|
|
size_t retSize = 0;
|
|
|
|
|
2020-01-14 21:32:11 +08:00
|
|
|
auto pClDev = castToObject<ClDevice>(device);
|
2020-09-15 23:34:49 +08:00
|
|
|
auto rootDeviceIndex = pClDev->getRootDeviceIndex();
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
switch (paramName) {
|
|
|
|
case CL_PROGRAM_BUILD_STATUS:
|
|
|
|
srcSize = retSize = sizeof(cl_build_status);
|
2020-11-03 18:13:26 +08:00
|
|
|
pSrc = &deviceBuildInfos.at(pClDev).buildStatus;
|
2017-12-21 07:45:38 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case CL_PROGRAM_BUILD_OPTIONS:
|
|
|
|
srcSize = retSize = strlen(options.c_str()) + 1;
|
|
|
|
pSrc = options.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CL_PROGRAM_BUILD_LOG: {
|
2020-08-24 19:07:06 +08:00
|
|
|
const char *pBuildLog = getBuildLog(pClDev->getRootDeviceIndex());
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2020-08-24 19:07:06 +08:00
|
|
|
pSrc = pBuildLog;
|
|
|
|
srcSize = retSize = strlen(pBuildLog) + 1;
|
2017-12-21 07:45:38 +08:00
|
|
|
} break;
|
|
|
|
|
|
|
|
case CL_PROGRAM_BINARY_TYPE:
|
|
|
|
srcSize = retSize = sizeof(cl_program_binary_type);
|
2020-11-04 18:08:45 +08:00
|
|
|
pSrc = &deviceBuildInfos.at(pClDev).programBinaryType;
|
2017-12-21 07:45:38 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case CL_PROGRAM_BUILD_GLOBAL_VARIABLE_TOTAL_SIZE:
|
2020-09-15 23:34:49 +08:00
|
|
|
pSrc = &buildInfos[rootDeviceIndex].globalVarTotalSize;
|
2017-12-21 07:45:38 +08:00
|
|
|
retSize = srcSize = sizeof(size_t);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
retVal = CL_INVALID_VALUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2020-05-18 22:13:59 +08:00
|
|
|
auto getInfoStatus = GetInfoStatus::INVALID_VALUE;
|
|
|
|
if (retVal == CL_SUCCESS) {
|
|
|
|
getInfoStatus = GetInfo::getInfo(paramValue, paramValueSize, pSrc, srcSize);
|
|
|
|
retVal = changeGetInfoStatusToCLResultType(getInfoStatus);
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
2020-05-18 22:13:59 +08:00
|
|
|
GetInfo::setParamValueReturnSize(paramValueSizeRet, retSize, getInfoStatus);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
return retVal;
|
|
|
|
}
|
2019-03-26 18:59:46 +08:00
|
|
|
} // namespace NEO
|