Move PATCH_TOKEN_GLOBAL_HOST_ACCESS_TABLE to kernel scope tokens

This commit moves patch token with global host access table to the
kernel scope from the program scope.

Related-To: NEO-6734
Signed-off-by: Kacper Nowak <kacper.nowak@intel.com>
This commit is contained in:
Kacper Nowak
2022-03-15 23:41:56 +00:00
committed by Compute-Runtime-Automation
parent a5ac961726
commit 86434e485d
5 changed files with 51 additions and 40 deletions

View File

@@ -390,6 +390,9 @@ inline bool decodeToken(const SPatchItemHeader *token, KernelFromPatchtokens &ou
case PATCH_TOKEN_KERNEL_ARGUMENT_INFO:
assignArgInfo(out, token);
break;
case _PATCH_TOKEN_GLOBAL_HOST_ACCESS_TABLE:
assignToken(out.tokens.hostAccessTable, token);
break;
case PATCH_TOKEN_SAMPLER_KERNEL_ARGUMENT:
case PATCH_TOKEN_IMAGE_MEMORY_OBJECT_KERNEL_ARGUMENT:
@@ -440,9 +443,6 @@ inline bool decodeToken(const SPatchItemHeader *token, ProgramFromPatchtokens &o
case PATCH_TOKEN_PROGRAM_SYMBOL_TABLE:
assignToken(progTok.symbolTable, token);
break;
case _PATCH_TOKEN_GLOBAL_HOST_ACCESS_TABLE:
assignToken(progTok.hostAccessTable, token);
break;
}
return true;
}

View File

@@ -143,6 +143,7 @@ struct KernelFromPatchtokens {
const SPatchItemHeader *gtpinInfo = nullptr;
const SPatchFunctionTableInfo *programSymbolTable = nullptr;
const SPatchFunctionTableInfo *programRelocationTable = nullptr;
const SPatchFunctionTableInfo *hostAccessTable = nullptr;
StackVecKernelArgs kernelArgs;
StackVecStrings strings;
struct {
@@ -183,7 +184,6 @@ struct ProgramFromPatchtokens {
StackVec<const SPatchConstantPointerProgramBinaryInfo *, 4> constantPointer;
StackVec<const SPatchGlobalPointerProgramBinaryInfo *, 4> globalPointer;
const SPatchFunctionTableInfo *symbolTable = nullptr;
const SPatchFunctionTableInfo *hostAccessTable = nullptr;
} programScopeTokens;
StackVec<KernelFromPatchtokens, 2> kernels;
StackVec<const SPatchItemHeader *, 4> unhandledTokens;

View File

@@ -43,6 +43,10 @@ void populateSingleKernelInfo(ProgramInfo &dst, const PatchTokenBinary::ProgramF
dst.linkerInput->decodeRelocationTable(decodedKernel.tokens.programRelocationTable + 1, decodedKernel.tokens.programRelocationTable->NumEntries, kernelNum);
}
if (decodedKernel.tokens.hostAccessTable) {
parseHostAccessTable(dst, decodedKernel.tokens.hostAccessTable);
}
dst.kernelInfos.push_back(kernelInfo.release());
}
@@ -107,10 +111,6 @@ void populateProgramInfo(ProgramInfo &dst, const PatchTokenBinary::ProgramFromPa
const auto patch = src.programScopeTokens.symbolTable;
dst.linkerInput->decodeGlobalVariablesSymbolTable(patch + 1, patch->NumEntries);
}
if (src.programScopeTokens.hostAccessTable != nullptr) {
parseHostAccessTable(dst, src.programScopeTokens.hostAccessTable);
}
}
void parseHostAccessTable(ProgramInfo &dst, const void *hostAccessTable) {

View File

@@ -101,34 +101,6 @@ struct ValidEmptyProgram : NEO::PatchTokenBinary::ProgramFromPatchtokens {
iOpenCL::SProgramBinaryHeader *headerMutable = nullptr;
};
struct ValidProgramWithHostAccessTable : ValidEmptyProgram {
ValidProgramWithHostAccessTable() {
iOpenCL::SPatchFunctionTableInfo hostAccessTok = {};
hostAccessTok.Token = NEO::PatchTokenBinary::_PATCH_TOKEN_GLOBAL_HOST_ACCESS_TABLE;
hostAccessTok.NumEntries = 2;
struct HostAccessTableEntry {
char deviceName[vISA::MAX_SYMBOL_NAME_LENGTH];
char hostName[vISA::MAX_SYMBOL_NAME_LENGTH];
};
hostAccessTok.Size = sizeof(hostAccessTok) + 2 * sizeof(HostAccessTableEntry);
const size_t hostAccessTokStorageSize = sizeof(hostAccessTok) + 2 * sizeof(HostAccessTableEntry);
uint8_t hostAccessTokStorage[hostAccessTokStorageSize] = {};
uint8_t *storagePtr = hostAccessTokStorage;
memcpy_s(storagePtr, hostAccessTokStorageSize, &hostAccessTok, sizeof(iOpenCL::SPatchFunctionTableInfo));
storagePtr = ptrOffset(storagePtr, sizeof(iOpenCL::SPatchFunctionTableInfo));
HostAccessTableEntry *entries = reinterpret_cast<HostAccessTableEntry *>(storagePtr);
strcpy_s(entries[0].deviceName, vISA::MAX_SYMBOL_NAME_LENGTH, "deviceNameOne");
strcpy_s(entries[0].hostName, vISA::MAX_SYMBOL_NAME_LENGTH, "hostNameOne");
strcpy_s(entries[1].deviceName, vISA::MAX_SYMBOL_NAME_LENGTH, "deviceNameTwo");
strcpy_s(entries[1].hostName, vISA::MAX_SYMBOL_NAME_LENGTH, "hostNameTwo");
storage.insert(storage.end(), hostAccessTokStorage, hostAccessTokStorage + hostAccessTokStorageSize);
recalcTokPtr();
headerMutable->PatchListSize = hostAccessTokStorageSize;
}
};
struct ValidProgramWithConstantSurface : ValidEmptyProgram {
ValidProgramWithConstantSurface() {
iOpenCL::SPatchAllocateConstantMemorySurfaceProgramBinaryInfo constSurfTok = {};
@@ -362,4 +334,40 @@ struct ValidProgramWithKernelAndArg : ValidProgramWithKernel {
size_t kernelArgOffset = 0U;
};
struct ValidProgramWithKernelUsingHostAccessTable : ValidProgramWithKernel {
ValidProgramWithKernelUsingHostAccessTable() {
hostAccessMutableOffset = storage.size();
iOpenCL::SPatchFunctionTableInfo hostAccessTok = {};
hostAccessTok.Token = NEO::PatchTokenBinary::_PATCH_TOKEN_GLOBAL_HOST_ACCESS_TABLE;
hostAccessTok.NumEntries = 2;
struct HostAccessTableEntry {
char deviceName[vISA::MAX_SYMBOL_NAME_LENGTH];
char hostName[vISA::MAX_SYMBOL_NAME_LENGTH];
};
hostAccessTok.Size = sizeof(hostAccessTok) + 2 * sizeof(HostAccessTableEntry);
const size_t hostAccessTokStorageSize = sizeof(hostAccessTok) + 2 * sizeof(HostAccessTableEntry);
uint8_t hostAccessTokStorage[hostAccessTokStorageSize] = {};
uint8_t *storagePtr = hostAccessTokStorage;
memcpy_s(storagePtr, hostAccessTokStorageSize, &hostAccessTok, sizeof(iOpenCL::SPatchFunctionTableInfo));
storagePtr = ptrOffset(storagePtr, sizeof(iOpenCL::SPatchFunctionTableInfo));
HostAccessTableEntry *entries = reinterpret_cast<HostAccessTableEntry *>(storagePtr);
strcpy_s(entries[0].deviceName, vISA::MAX_SYMBOL_NAME_LENGTH, "deviceNameOne");
strcpy_s(entries[0].hostName, vISA::MAX_SYMBOL_NAME_LENGTH, "hostNameOne");
strcpy_s(entries[1].deviceName, vISA::MAX_SYMBOL_NAME_LENGTH, "deviceNameTwo");
strcpy_s(entries[1].hostName, vISA::MAX_SYMBOL_NAME_LENGTH, "hostNameTwo");
storage.insert(storage.end(), hostAccessTokStorage, hostAccessTokStorage + hostAccessTokStorageSize);
ValidProgramWithKernel::recalcTokPtr();
}
void recalcTokPtr() {
ValidProgramWithKernel::recalcTokPtr();
hostAccessMutable = reinterpret_cast<iOpenCL::SPatchFunctionTableInfo *>(storage.data() + hostAccessMutableOffset);
this->kernels[0].tokens.hostAccessTable = hostAccessMutable;
}
iOpenCL::SPatchFunctionTableInfo *hostAccessMutable = nullptr;
size_t hostAccessMutableOffset = 0u;
};
} // namespace PatchTokensTestData

View File

@@ -300,12 +300,15 @@ TEST(PopulateProgramInfoFromPatchtokensTests, GivenProgramWithKernelsWhenKernelH
EXPECT_EQ(1U, receivedSegmentIds[1]);
}
TEST(PopulateProgramInfoFromPatchtokensTests, givenProgramWithHostAccessTableGThenPopulateDeviceHostNameMapCorrectly) {
PatchTokensTestData::ValidProgramWithHostAccessTable programTokens;
TEST(PopulateProgramInfoFromPatchtokensTests, givenProgramWithKernelWhenKernelHasHostAccessTableThenPopulateDeviceHostNameMapCorrectly) {
PatchTokensTestData::ValidProgramWithKernelUsingHostAccessTable programToEncode;
programToEncode.headerMutable->NumberOfKernels = 1;
programToEncode.storage.insert(programToEncode.storage.end(), programToEncode.kernels[0].blobs.kernelInfo.begin(), programToEncode.kernels[0].blobs.kernelInfo.end());
NEO::PatchTokenBinary::ProgramFromPatchtokens decodedProgram;
bool decodeSuccess = NEO::PatchTokenBinary::decodeProgramFromPatchtokensBlob(programTokens.blobs.programInfo, decodedProgram);
bool decodeSuccess = NEO::PatchTokenBinary::decodeProgramFromPatchtokensBlob(programToEncode.storage, decodedProgram);
EXPECT_TRUE(decodeSuccess);
NEO::ProgramInfo programInfo;
NEO::ProgramInfo programInfo = {};
NEO::populateProgramInfo(programInfo, decodedProgram);
EXPECT_EQ(2u, programInfo.globalsDeviceToHostNameMap.size());
EXPECT_STREQ("hostNameOne", programInfo.globalsDeviceToHostNameMap["deviceNameOne"].c_str());