Skip to content

Commit dccee61

Browse files
Handle when gtpin kernel start offset is not zero
Change-Id: I3e8365455a23b0f271c5c1211dda6e2f4241a4e9
1 parent 36621b2 commit dccee61

File tree

5 files changed

+60
-8
lines changed

5 files changed

+60
-8
lines changed

runtime/gtpin/gtpin_callbacks.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ void gtpinNotifyKernelSubmit(cl_kernel kernel, void *pCmdQueue) {
126126
// Notify GT-Pin that kernel was submited for execution
127127
(*GTPinCallbacks.onKernelSubmit)(commandBuffer, kernelId, &kernelOffset, &resource);
128128
// Create new record in Kernel Execution Queue describing submited kernel
129+
pKernel->setStartOffset(kernelOffset);
129130
gtpinkexec_t kExec;
130131
kExec.pKernel = pKernel;
131132
kExec.gtpinResource = (cl_mem)resource;
@@ -250,4 +251,4 @@ void gtpinNotifyPlatformShutdown() {
250251
kernelExecQueue.clear();
251252
}
252253
}
253-
}
254+
} // namespace OCLRT

runtime/helpers/kernel_commands.inl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ size_t KernelCommandsHelper<GfxFamily>::sendIndirectState(
319319
if (kernelAllocation) {
320320
kernelStartOffset = kernelInfo.getGraphicsAllocation()->getGpuAddressToPatch();
321321
}
322-
322+
kernelStartOffset += kernel.getStartOffset();
323323
const auto &patchInfo = kernelInfo.patchInfo;
324324

325325
auto dstBindingTablePointer = pushBindingTableAndSurfaceStates(ssh, kernel);

runtime/kernel/kernel.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,12 @@ void Kernel::setKernelId(uint64_t newKernelId) {
726726
KernelInfo *pKernelInfo = const_cast<KernelInfo *>(&kernelInfo);
727727
pKernelInfo->kernelId = newKernelId;
728728
}
729+
uint32_t Kernel::getStartOffset() const {
730+
return this->startOffset;
731+
}
732+
void Kernel::setStartOffset(uint32_t offset) {
733+
this->startOffset = offset;
734+
}
729735

730736
const void *Kernel::getSurfaceStateHeap() const {
731737
return kernelInfo.usesSsh

runtime/kernel/kernel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,8 @@ class Kernel : public BaseObject<_cl_kernel> {
171171
bool isKernelHeapSubstituted() const;
172172
uint64_t getKernelId() const;
173173
void setKernelId(uint64_t newKernelId);
174+
uint32_t getStartOffset() const;
175+
void setStartOffset(uint32_t offset);
174176

175177
const std::vector<SimpleKernelArgInfo> &getKernelArguments() const {
176178
return kernelArguments;
@@ -487,6 +489,7 @@ class Kernel : public BaseObject<_cl_kernel> {
487489

488490
bool usingSharedObjArgs;
489491
uint32_t patchedArgumentsNum = 0;
492+
uint32_t startOffset = 0;
490493

491494
std::vector<PatchInfoData> patchInfoDataList;
492495
std::unique_ptr<ImageTransformer> imageTransformer;

unit_tests/gtpin/gtpin_tests.cpp

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@
3939
#include "unit_tests/fixtures/platform_fixture.h"
4040
#include "unit_tests/helpers/kernel_binary_helper.h"
4141
#include "unit_tests/helpers/test_files.h"
42+
#include "unit_tests/helpers/variable_backup.h"
43+
#include "unit_tests/mocks/mock_command_queue.h"
44+
#include "unit_tests/mocks/mock_context.h"
45+
#include "unit_tests/mocks/mock_kernel.h"
4246
#include "test.h"
4347
#include "gtest/gtest.h"
4448
#include <deque>
@@ -59,6 +63,7 @@ int KernelCreateCallbackCount = 0;
5963
int KernelSubmitCallbackCount = 0;
6064
int CommandBufferCreateCallbackCount = 0;
6165
int CommandBufferCompleteCallbackCount = 0;
66+
uint32_t kernelOffset = 0;
6267
bool returnNullResource = false;
6368

6469
context_handle_t currContext = nullptr;
@@ -98,7 +103,7 @@ void OnKernelSubmit(command_buffer_handle_t cb, uint64_t kernelId, uint32_t *ent
98103
EXPECT_EQ(GTPIN_DI_SUCCESS, st);
99104
EXPECT_NE(nullptr, bufAddress);
100105
}
101-
*entryOffset = 0;
106+
*entryOffset = kernelOffset;
102107
*resource = currResource;
103108
kernelResources.push_back(currResource);
104109

@@ -122,15 +127,10 @@ void OnCommandBufferComplete(command_buffer_handle_t cb) {
122127

123128
CommandBufferCompleteCallbackCount++;
124129
}
125-
126130
class GTPinFixture : public ContextFixture, public MemoryManagementFixture {
127131
using ContextFixture::SetUp;
128132

129133
public:
130-
GTPinFixture() {
131-
}
132-
133-
protected:
134134
void SetUp() override {
135135
MemoryManagementFixture::SetUp();
136136
pPlatform = platform();
@@ -152,6 +152,7 @@ class GTPinFixture : public ContextFixture, public MemoryManagementFixture {
152152
gtpinCallbacks.onCommandBufferComplete = nullptr;
153153

154154
OCLRT::isGTPinInitialized = false;
155+
kernelOffset = 0;
155156
}
156157

157158
void TearDown() override {
@@ -2183,4 +2184,45 @@ TEST(GTPinOfflineTests, givenGtPinInDisabledStateWhenCallbacksFromEnqueuePathAre
21832184
gtpinNotifyFlushTask(dummyCompletedTask);
21842185
EXPECT_FALSE(gtpinIsGTPinInitialized());
21852186
}
2187+
TEST_F(GTPinTests, givenInitializedGTPinInterfaceWhenOnKernelSubitIsCalledThenCorrectOffsetisSetInKernel) {
2188+
gtpinCallbacks.onContextCreate = OnContextCreate;
2189+
gtpinCallbacks.onContextDestroy = OnContextDestroy;
2190+
gtpinCallbacks.onKernelCreate = OnKernelCreate;
2191+
gtpinCallbacks.onKernelSubmit = OnKernelSubmit;
2192+
gtpinCallbacks.onCommandBufferCreate = OnCommandBufferCreate;
2193+
gtpinCallbacks.onCommandBufferComplete = OnCommandBufferComplete;
2194+
retFromGtPin = GTPin_Init(&gtpinCallbacks, &driverServices, nullptr);
2195+
VariableBackup<bool> returnNullResourceBckp(&returnNullResource);
2196+
VariableBackup<uint32_t> kernelOffsetBckp(&kernelOffset);
2197+
EXPECT_EQ(GTPIN_DI_SUCCESS, retFromGtPin);
2198+
2199+
char surfaceStateHeap[0x80];
2200+
SKernelBinaryHeaderCommon kernelHeader;
2201+
std::unique_ptr<MockContext> context(new MockContext(pDevice));
2202+
2203+
EXPECT_EQ(CL_SUCCESS, retVal);
2204+
std::unique_ptr<KernelInfo> pKernelInfo(KernelInfo::create());
2205+
kernelHeader.SurfaceStateHeapSize = sizeof(surfaceStateHeap);
2206+
pKernelInfo->heapInfo.pSsh = surfaceStateHeap;
2207+
pKernelInfo->heapInfo.pKernelHeader = &kernelHeader;
2208+
pKernelInfo->usesSsh = true;
2209+
2210+
std::unique_ptr<MockProgram> pProgramm(new MockProgram(context.get(), false));
2211+
std::unique_ptr<MockCommandQueue> cmdQ(new MockCommandQueue(context.get(), pDevice, nullptr));
2212+
std::unique_ptr<MockKernel> pKernel(new MockKernel(pProgramm.get(), *pKernelInfo, *pDevice));
2213+
2214+
pKernel->setSshLocal(nullptr, sizeof(surfaceStateHeap));
2215+
2216+
kernelOffset = 0x1234;
2217+
EXPECT_NE(pKernel->getStartOffset(), kernelOffset);
2218+
returnNullResource = true;
2219+
cl_context ctxt = (cl_context)((Context *)context.get());
2220+
currContext = (gtpin::context_handle_t)ctxt;
2221+
gtpinNotifyKernelSubmit(pKernel.get(), cmdQ.get());
2222+
EXPECT_EQ(pKernel->getStartOffset(), kernelOffset);
2223+
2224+
EXPECT_EQ(CL_SUCCESS, retVal);
2225+
2226+
kernelResources.clear();
2227+
}
21862228
} // namespace ULT

0 commit comments

Comments
 (0)