2017-12-21 07:45:38 +08:00
|
|
|
/*
|
2023-01-12 17:59:50 +08:00
|
|
|
* Copyright (C) 2018-2023 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/os_interface/os_interface.h"
|
2022-07-24 12:21:16 +08:00
|
|
|
#include "shared/source/utilities/hw_timestamps.h"
|
|
|
|
#include "shared/source/utilities/perf_counter.h"
|
2020-02-24 17:22:30 +08:00
|
|
|
#include "shared/source/utilities/tag_allocator.h"
|
2021-01-21 20:10:13 +08:00
|
|
|
#include "shared/test/common/helpers/debug_manager_state_restore.h"
|
2021-12-21 01:54:26 +08:00
|
|
|
#include "shared/test/common/mocks/mock_timestamp_container.h"
|
2021-12-15 01:40:08 +08:00
|
|
|
#include "shared/test/common/test_macros/test.h"
|
2022-08-11 23:58:56 +08:00
|
|
|
#include "shared/test/common/utilities/base_object_utils.h"
|
2020-02-24 17:22:30 +08:00
|
|
|
|
2020-02-23 05:50:57 +08:00
|
|
|
#include "opencl/source/command_queue/command_queue_hw.h"
|
|
|
|
#include "opencl/source/command_queue/enqueue_common.h"
|
|
|
|
#include "opencl/source/command_queue/enqueue_marker.h"
|
|
|
|
#include "opencl/source/helpers/dispatch_info.h"
|
2020-02-23 22:20:22 +08:00
|
|
|
#include "opencl/test/unit_test/command_queue/command_enqueue_fixture.h"
|
|
|
|
#include "opencl/test/unit_test/event/event_fixture.h"
|
|
|
|
#include "opencl/test/unit_test/mocks/mock_command_queue.h"
|
|
|
|
#include "opencl/test/unit_test/mocks/mock_context.h"
|
|
|
|
#include "opencl/test/unit_test/mocks/mock_event.h"
|
|
|
|
#include "opencl/test/unit_test/mocks/mock_kernel.h"
|
|
|
|
#include "opencl/test/unit_test/mocks/mock_program.h"
|
|
|
|
#include "opencl/test/unit_test/os_interface/mock_performance_counters.h"
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2019-03-26 18:59:46 +08:00
|
|
|
namespace NEO {
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
struct ProfilingTests : public CommandEnqueueFixture,
|
|
|
|
public ::testing::Test {
|
|
|
|
void SetUp() override {
|
2022-08-16 22:51:17 +08:00
|
|
|
CommandEnqueueFixture::setUp(CL_QUEUE_PROFILING_ENABLE);
|
2019-02-04 20:08:47 +08:00
|
|
|
|
2020-10-16 21:00:28 +08:00
|
|
|
program = ReleaseableObjectPtr<MockProgram>(new MockProgram(toClDeviceVector(*pClDevice)));
|
2019-07-04 18:17:42 +08:00
|
|
|
program->setContext(&ctx);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2020-11-19 19:30:44 +08:00
|
|
|
kernelInfo.kernelDescriptor.kernelAttributes.simdSize = 32;
|
2021-04-08 17:05:45 +08:00
|
|
|
kernelInfo.setCrossThreadDataSize(sizeof(crossThreadData));
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2021-04-08 17:05:45 +08:00
|
|
|
kernelInfo.setLocalIds({1, 1, 1});
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
kernelInfo.heapInfo.pKernelHeap = kernelIsa;
|
2020-05-26 15:36:04 +08:00
|
|
|
kernelInfo.heapInfo.KernelHeapSize = sizeof(kernelIsa);
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void TearDown() override {
|
2022-08-16 22:51:17 +08:00
|
|
|
CommandEnqueueFixture::tearDown();
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
2019-02-04 20:08:47 +08:00
|
|
|
ReleaseableObjectPtr<MockProgram> program;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2018-12-06 22:33:02 +08:00
|
|
|
SKernelBinaryHeaderCommon kernelHeader = {};
|
2021-04-08 17:05:45 +08:00
|
|
|
MockKernelInfo kernelInfo;
|
2019-07-04 18:17:42 +08:00
|
|
|
MockContext ctx;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
uint32_t kernelIsa[32];
|
|
|
|
uint32_t crossThreadData[32];
|
|
|
|
};
|
|
|
|
|
2020-07-09 16:29:18 +08:00
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, ProfilingTests, GivenCommandQueueWithProfilingAndForWorkloadWithKernelWhenGetCSFromCmdQueueThenEnoughSpaceInCS) {
|
2017-12-21 07:45:38 +08:00
|
|
|
typedef typename FamilyType::MI_STORE_REGISTER_MEM MI_STORE_REGISTER_MEM;
|
|
|
|
typedef typename FamilyType::PIPE_CONTROL PIPE_CONTROL;
|
|
|
|
typedef typename FamilyType::GPGPU_WALKER GPGPU_WALKER;
|
|
|
|
|
2021-03-22 23:26:03 +08:00
|
|
|
MockKernel kernel(program.get(), kernelInfo, *pClDevice);
|
2018-12-06 22:33:02 +08:00
|
|
|
|
2021-03-26 22:32:49 +08:00
|
|
|
uint64_t requiredSize = 2 * sizeof(PIPE_CONTROL) + 2 * sizeof(MI_STORE_REGISTER_MEM) + sizeof(GPGPU_WALKER) + HardwareCommandsHelper<FamilyType>::getSizeRequiredCS();
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2019-07-18 22:14:41 +08:00
|
|
|
MultiDispatchInfo multiDispatchInfo(&kernel);
|
|
|
|
auto &commandStreamNDRangeKernel = getCommandStream<FamilyType, CL_COMMAND_NDRANGE_KERNEL>(*pCmdQ, CsrDependencies(), true, false, false,
|
2023-01-20 00:11:39 +08:00
|
|
|
multiDispatchInfo, nullptr, 0, false, false, nullptr);
|
2021-03-04 01:29:32 +08:00
|
|
|
auto expectedSizeCS = EnqueueOperation<FamilyType>::getSizeRequiredCS(CL_COMMAND_NDRANGE_KERNEL, true, false, *pCmdQ, &kernel, {});
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_GE(expectedSizeCS, requiredSize);
|
|
|
|
EXPECT_GE(commandStreamNDRangeKernel.getAvailableSpace(), requiredSize);
|
|
|
|
|
2019-07-18 22:14:41 +08:00
|
|
|
auto &commandStreamTask = getCommandStream<FamilyType, CL_COMMAND_TASK>(*pCmdQ, CsrDependencies(), true, false, false,
|
2023-01-20 00:11:39 +08:00
|
|
|
multiDispatchInfo, nullptr, 0, false, false, nullptr);
|
2021-03-04 01:29:32 +08:00
|
|
|
expectedSizeCS = EnqueueOperation<FamilyType>::getSizeRequiredCS(CL_COMMAND_TASK, true, false, *pCmdQ, &kernel, {});
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_GE(expectedSizeCS, requiredSize);
|
|
|
|
EXPECT_GE(commandStreamTask.getAvailableSpace(), requiredSize);
|
|
|
|
}
|
|
|
|
|
2020-07-09 16:29:18 +08:00
|
|
|
HWTEST_F(ProfilingTests, GivenCommandQueueWithProfilingAndForWorkloadWithNoKernelWhenGetCSFromCmdQueueThenEnoughSpaceInCS) {
|
2017-12-21 07:45:38 +08:00
|
|
|
typedef typename FamilyType::MI_STORE_REGISTER_MEM MI_STORE_REGISTER_MEM;
|
|
|
|
typedef typename FamilyType::PIPE_CONTROL PIPE_CONTROL;
|
2018-10-01 17:57:36 +08:00
|
|
|
typedef typename FamilyType::WALKER_TYPE GPGPU_WALKER;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
uint64_t requiredSize = 2 * sizeof(PIPE_CONTROL) + 4 * sizeof(MI_STORE_REGISTER_MEM);
|
|
|
|
|
2019-07-18 22:14:41 +08:00
|
|
|
MultiDispatchInfo multiDispatchInfo(nullptr);
|
|
|
|
auto &commandStreamMigrateMemObjects = getCommandStream<FamilyType, CL_COMMAND_MIGRATE_MEM_OBJECTS>(*pCmdQ, CsrDependencies(),
|
|
|
|
true, false, false,
|
2023-01-20 00:11:39 +08:00
|
|
|
multiDispatchInfo, nullptr, 0, false, false, nullptr);
|
2021-03-04 01:29:32 +08:00
|
|
|
auto expectedSizeCS = EnqueueOperation<FamilyType>::getSizeRequiredCS(CL_COMMAND_MIGRATE_MEM_OBJECTS, true, false, *pCmdQ, nullptr, {});
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_GE(expectedSizeCS, requiredSize);
|
|
|
|
EXPECT_GE(commandStreamMigrateMemObjects.getAvailableSpace(), requiredSize);
|
|
|
|
|
2019-07-18 22:14:41 +08:00
|
|
|
auto &commandStreamMarker = getCommandStream<FamilyType, CL_COMMAND_MARKER>(*pCmdQ, CsrDependencies(), true,
|
2023-01-20 00:11:39 +08:00
|
|
|
false, false, multiDispatchInfo, nullptr, 0, false, false, nullptr);
|
2021-03-04 01:29:32 +08:00
|
|
|
expectedSizeCS = EnqueueOperation<FamilyType>::getSizeRequiredCS(CL_COMMAND_MARKER, true, false, *pCmdQ, nullptr, {});
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_GE(expectedSizeCS, requiredSize);
|
|
|
|
EXPECT_GE(commandStreamMarker.getAvailableSpace(), requiredSize);
|
|
|
|
}
|
|
|
|
|
2020-07-09 16:29:18 +08:00
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, ProfilingTests, GivenCommandQueueWithProfilingAndForWorkloadWithTwoKernelsInMdiWhenGetCSFromCmdQueueThenEnoughSpaceInCS) {
|
2017-12-21 07:45:38 +08:00
|
|
|
typedef typename FamilyType::MI_STORE_REGISTER_MEM MI_STORE_REGISTER_MEM;
|
|
|
|
typedef typename FamilyType::PIPE_CONTROL PIPE_CONTROL;
|
|
|
|
typedef typename FamilyType::GPGPU_WALKER GPGPU_WALKER;
|
|
|
|
|
2021-03-22 23:26:03 +08:00
|
|
|
MockKernel kernel(program.get(), kernelInfo, *pClDevice);
|
2018-12-06 22:33:02 +08:00
|
|
|
|
2021-03-26 22:32:49 +08:00
|
|
|
uint64_t requiredSize = 2 * sizeof(PIPE_CONTROL) + 4 * sizeof(MI_STORE_REGISTER_MEM) + HardwareCommandsHelper<FamilyType>::getSizeRequiredCS();
|
2017-12-21 07:45:38 +08:00
|
|
|
requiredSize += 2 * sizeof(GPGPU_WALKER);
|
|
|
|
|
|
|
|
DispatchInfo dispatchInfo;
|
|
|
|
dispatchInfo.setKernel(&kernel);
|
2018-08-16 21:47:25 +08:00
|
|
|
MultiDispatchInfo multiDispatchInfo;
|
|
|
|
multiDispatchInfo.push(dispatchInfo);
|
2017-12-21 07:45:38 +08:00
|
|
|
multiDispatchInfo.push(dispatchInfo);
|
2019-07-18 22:14:41 +08:00
|
|
|
auto &commandStreamTask = getCommandStream<FamilyType, CL_COMMAND_TASK>(*pCmdQ, CsrDependencies(), true, false, false,
|
2023-01-20 00:11:39 +08:00
|
|
|
multiDispatchInfo, nullptr, 0, false, false, nullptr);
|
2019-07-03 15:30:30 +08:00
|
|
|
auto expectedSizeCS = EnqueueOperation<FamilyType>::getTotalSizeRequiredCS(CL_COMMAND_TASK, CsrDependencies(), true, false,
|
2023-01-20 00:11:39 +08:00
|
|
|
false, *pCmdQ, multiDispatchInfo, false, false, nullptr);
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_GE(expectedSizeCS, requiredSize);
|
|
|
|
EXPECT_GE(commandStreamTask.getAvailableSpace(), requiredSize);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
# Two additional PIPE_CONTROLs are expected before first MI_STORE_REGISTER_MEM (which is before GPGPU_WALKER)
|
|
|
|
# and after second MI_STORE_REGISTER_MEM (which is after GPGPU_WALKER).
|
|
|
|
*/
|
2020-07-09 16:29:18 +08:00
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, ProfilingTests, GivenCommandQueueWithProfolingWhenWalkerIsDispatchedThenPipeControlWithTimeStampIsPresentInCS) {
|
2017-12-21 07:45:38 +08:00
|
|
|
typedef typename FamilyType::PIPE_CONTROL PIPE_CONTROL;
|
|
|
|
typedef typename FamilyType::GPGPU_WALKER GPGPU_WALKER;
|
|
|
|
|
2021-03-22 23:26:03 +08:00
|
|
|
MockKernel kernel(program.get(), kernelInfo, *pClDevice);
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_EQ(CL_SUCCESS, kernel.initialize());
|
|
|
|
|
|
|
|
size_t globalOffsets[3] = {0, 0, 0};
|
|
|
|
size_t workItems[3] = {1, 1, 1};
|
|
|
|
uint32_t dimensions = 1;
|
|
|
|
cl_event event;
|
|
|
|
|
|
|
|
static_cast<CommandQueueHw<FamilyType> *>(pCmdQ)->enqueueKernel(
|
2021-03-09 00:27:24 +08:00
|
|
|
&kernel,
|
2017-12-21 07:45:38 +08:00
|
|
|
dimensions,
|
|
|
|
globalOffsets,
|
|
|
|
workItems,
|
|
|
|
nullptr,
|
|
|
|
0,
|
|
|
|
nullptr,
|
|
|
|
&event);
|
|
|
|
|
|
|
|
parseCommands<FamilyType>(*pCmdQ);
|
|
|
|
|
|
|
|
// Find GPGPU_WALKER
|
|
|
|
auto itorGPGPUWalkerCmd = find<GPGPU_WALKER *>(cmdList.begin(), cmdList.end());
|
|
|
|
GenCmdList::reverse_iterator rItorGPGPUWalkerCmd(itorGPGPUWalkerCmd);
|
|
|
|
ASSERT_NE(cmdList.end(), itorGPGPUWalkerCmd);
|
|
|
|
|
|
|
|
// Check PIPE_CONTROLs
|
2022-05-16 22:06:56 +08:00
|
|
|
auto itorBeforePC = reverseFind<PIPE_CONTROL *>(rItorGPGPUWalkerCmd, cmdList.rbegin());
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(cmdList.rbegin(), itorBeforePC);
|
|
|
|
auto pBeforePC = genCmdCast<PIPE_CONTROL *>(*itorBeforePC);
|
|
|
|
ASSERT_NE(nullptr, pBeforePC);
|
|
|
|
EXPECT_EQ(1u, pBeforePC->getCommandStreamerStallEnable());
|
|
|
|
|
|
|
|
auto itorAfterPC = find<PIPE_CONTROL *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterPC);
|
|
|
|
auto pAfterPC = genCmdCast<PIPE_CONTROL *>(*itorAfterPC);
|
|
|
|
ASSERT_NE(nullptr, pAfterPC);
|
|
|
|
EXPECT_EQ(1u, pAfterPC->getCommandStreamerStallEnable());
|
|
|
|
|
|
|
|
EXPECT_EQ(PIPE_CONTROL::POST_SYNC_OPERATION_WRITE_TIMESTAMP, pBeforePC->getPostSyncOperation());
|
|
|
|
|
2019-01-21 18:44:56 +08:00
|
|
|
EXPECT_TRUE(static_cast<MockEvent<Event> *>(event)->calcProfilingData());
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
clReleaseEvent(event);
|
|
|
|
}
|
|
|
|
|
2021-08-17 17:17:21 +08:00
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, ProfilingTests, GivenCommandQueueWithProfilingWhenNonBlockedEnqueueIsExecutedThenSubmittedTimestampDoesntHaveGPUTime) {
|
2021-03-22 23:26:03 +08:00
|
|
|
MockKernel kernel(program.get(), kernelInfo, *pClDevice);
|
2020-10-23 21:38:35 +08:00
|
|
|
ASSERT_EQ(CL_SUCCESS, kernel.initialize());
|
|
|
|
|
|
|
|
size_t globalOffsets[3] = {0, 0, 0};
|
|
|
|
size_t workItems[3] = {1, 1, 1};
|
|
|
|
uint32_t dimensions = 1;
|
|
|
|
cl_event event;
|
|
|
|
|
|
|
|
static_cast<CommandQueueHw<FamilyType> *>(pCmdQ)->enqueueKernel(
|
2021-03-09 00:27:24 +08:00
|
|
|
&kernel,
|
2020-10-23 21:38:35 +08:00
|
|
|
dimensions,
|
|
|
|
globalOffsets,
|
|
|
|
workItems,
|
|
|
|
nullptr,
|
|
|
|
0,
|
|
|
|
nullptr,
|
|
|
|
&event);
|
|
|
|
|
|
|
|
auto mockEvent = static_cast<MockEvent<Event> *>(event);
|
|
|
|
EXPECT_NE(0u, mockEvent->queueTimeStamp.GPUTimeStamp);
|
|
|
|
EXPECT_NE(0u, mockEvent->queueTimeStamp.CPUTimeinNS);
|
|
|
|
EXPECT_LT(mockEvent->queueTimeStamp.CPUTimeinNS, mockEvent->submitTimeStamp.CPUTimeinNS);
|
2021-08-17 17:17:21 +08:00
|
|
|
EXPECT_EQ(0u, mockEvent->submitTimeStamp.GPUTimeStamp);
|
2020-10-23 21:38:35 +08:00
|
|
|
|
|
|
|
clReleaseEvent(event);
|
|
|
|
}
|
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
/*
|
2018-02-23 15:08:30 +08:00
|
|
|
# One additional MI_STORE_REGISTER_MEM is expected before and after GPGPU_WALKER.
|
2017-12-21 07:45:38 +08:00
|
|
|
*/
|
|
|
|
|
2020-07-09 16:29:18 +08:00
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, ProfilingTests, GivenCommandQueueWithProflingWhenWalkerIsDispatchedThenMiStoreRegisterMemIsPresentInCS) {
|
2017-12-21 07:45:38 +08:00
|
|
|
typedef typename FamilyType::MI_STORE_REGISTER_MEM MI_STORE_REGISTER_MEM;
|
|
|
|
typedef typename FamilyType::GPGPU_WALKER GPGPU_WALKER;
|
|
|
|
|
2021-03-22 23:26:03 +08:00
|
|
|
MockKernel kernel(program.get(), kernelInfo, *pClDevice);
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_EQ(CL_SUCCESS, kernel.initialize());
|
|
|
|
|
|
|
|
size_t globalOffsets[3] = {0, 0, 0};
|
|
|
|
size_t workItems[3] = {1, 1, 1};
|
|
|
|
uint32_t dimensions = 1;
|
|
|
|
cl_event event;
|
|
|
|
|
|
|
|
static_cast<CommandQueueHw<FamilyType> *>(pCmdQ)->enqueueKernel(
|
|
|
|
&kernel,
|
|
|
|
dimensions,
|
|
|
|
globalOffsets,
|
|
|
|
workItems,
|
|
|
|
nullptr,
|
|
|
|
0,
|
|
|
|
nullptr,
|
|
|
|
&event);
|
|
|
|
|
|
|
|
parseCommands<FamilyType>(*pCmdQ);
|
|
|
|
|
|
|
|
// Find GPGPU_WALKER
|
|
|
|
auto itorGPGPUWalkerCmd = find<GPGPU_WALKER *>(cmdList.begin(), cmdList.end());
|
|
|
|
GenCmdList::reverse_iterator rItorGPGPUWalkerCmd(itorGPGPUWalkerCmd);
|
|
|
|
ASSERT_NE(cmdList.end(), itorGPGPUWalkerCmd);
|
|
|
|
|
|
|
|
// Check MI_STORE_REGISTER_MEMs
|
2022-05-16 22:06:56 +08:00
|
|
|
auto itorBeforeMI = reverseFind<MI_STORE_REGISTER_MEM *>(rItorGPGPUWalkerCmd, cmdList.rbegin());
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(cmdList.rbegin(), itorBeforeMI);
|
|
|
|
auto pBeforeMI = genCmdCast<MI_STORE_REGISTER_MEM *>(*itorBeforeMI);
|
|
|
|
pBeforeMI = genCmdCast<MI_STORE_REGISTER_MEM *>(*itorBeforeMI);
|
|
|
|
ASSERT_NE(nullptr, pBeforeMI);
|
|
|
|
EXPECT_EQ(GP_THREAD_TIME_REG_ADDRESS_OFFSET_LOW, pBeforeMI->getRegisterAddress());
|
|
|
|
|
|
|
|
auto itorAfterMI = find<MI_STORE_REGISTER_MEM *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterMI);
|
|
|
|
auto pAfterMI = genCmdCast<MI_STORE_REGISTER_MEM *>(*itorAfterMI);
|
|
|
|
ASSERT_NE(nullptr, pAfterMI);
|
|
|
|
EXPECT_EQ(GP_THREAD_TIME_REG_ADDRESS_OFFSET_LOW, pAfterMI->getRegisterAddress());
|
|
|
|
++itorAfterMI;
|
|
|
|
pAfterMI = genCmdCast<MI_STORE_REGISTER_MEM *>(*itorAfterMI);
|
2018-02-23 15:08:30 +08:00
|
|
|
EXPECT_EQ(nullptr, pAfterMI);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
clReleaseEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
# Two additional PIPE_CONTROLs are expected before first MI_STORE_REGISTER_MEM (which is before GPGPU_WALKER)
|
|
|
|
# and after second MI_STORE_REGISTER_MEM (which is after GPGPU_WALKER).
|
|
|
|
# If queue is blocked commands should be added to event
|
|
|
|
*/
|
2020-07-09 16:29:18 +08:00
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, ProfilingTests, GivenCommandQueueBlockedWithProfilingWhenWalkerIsDispatchedThenPipeControlWithTimeStampIsPresentInCS) {
|
2017-12-21 07:45:38 +08:00
|
|
|
typedef typename FamilyType::PIPE_CONTROL PIPE_CONTROL;
|
|
|
|
typedef typename FamilyType::GPGPU_WALKER GPGPU_WALKER;
|
|
|
|
|
2021-03-22 23:26:03 +08:00
|
|
|
MockKernel kernel(program.get(), kernelInfo, *pClDevice);
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_EQ(CL_SUCCESS, kernel.initialize());
|
2021-03-09 18:30:21 +08:00
|
|
|
kernel.incRefInternal();
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
size_t globalOffsets[3] = {0, 0, 0};
|
|
|
|
size_t workItems[3] = {1, 1, 1};
|
|
|
|
uint32_t dimensions = 1;
|
|
|
|
cl_event event;
|
|
|
|
cl_event ue = new UserEvent();
|
|
|
|
static_cast<CommandQueueHw<FamilyType> *>(pCmdQ)->enqueueKernel(
|
|
|
|
&kernel,
|
|
|
|
dimensions,
|
|
|
|
globalOffsets,
|
|
|
|
workItems,
|
|
|
|
nullptr,
|
|
|
|
1, // one user event to block queue
|
|
|
|
&ue, // user event not signaled
|
|
|
|
&event);
|
|
|
|
|
2022-07-24 12:21:16 +08:00
|
|
|
// rseCommands<FamilyType>(*pCmdQ);
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(nullptr, pCmdQ->virtualEvent);
|
|
|
|
ASSERT_NE(nullptr, pCmdQ->virtualEvent->peekCommand());
|
2019-03-26 18:59:46 +08:00
|
|
|
NEO::LinearStream *eventCommandStream = pCmdQ->virtualEvent->peekCommand()->getCommandStream();
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(nullptr, eventCommandStream);
|
|
|
|
parseCommands<FamilyType>(*eventCommandStream);
|
|
|
|
|
|
|
|
// Find GPGPU_WALKER
|
|
|
|
auto itorGPGPUWalkerCmd = find<GPGPU_WALKER *>(cmdList.begin(), cmdList.end());
|
|
|
|
GenCmdList::reverse_iterator rItorGPGPUWalkerCmd(itorGPGPUWalkerCmd);
|
|
|
|
ASSERT_NE(cmdList.end(), itorGPGPUWalkerCmd);
|
|
|
|
|
|
|
|
// Check PIPE_CONTROLs
|
2022-05-16 22:06:56 +08:00
|
|
|
auto itorBeforePC = reverseFind<PIPE_CONTROL *>(rItorGPGPUWalkerCmd, cmdList.rbegin());
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(cmdList.rbegin(), itorBeforePC);
|
|
|
|
auto pBeforePC = genCmdCast<PIPE_CONTROL *>(*itorBeforePC);
|
|
|
|
ASSERT_NE(nullptr, pBeforePC);
|
|
|
|
|
|
|
|
auto itorAfterPC = find<PIPE_CONTROL *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterPC);
|
|
|
|
auto pAfterPC = genCmdCast<PIPE_CONTROL *>(*itorAfterPC);
|
|
|
|
ASSERT_NE(nullptr, pAfterPC);
|
|
|
|
|
|
|
|
EXPECT_EQ(PIPE_CONTROL::POST_SYNC_OPERATION_WRITE_TIMESTAMP, pBeforePC->getPostSyncOperation());
|
|
|
|
|
|
|
|
clReleaseEvent(event);
|
|
|
|
((UserEvent *)ue)->release();
|
2019-02-04 20:08:47 +08:00
|
|
|
pCmdQ->isQueueBlocked();
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2018-02-23 15:08:30 +08:00
|
|
|
# One additional MI_STORE_REGISTER_MEM is expected before and after GPGPU_WALKER.
|
2017-12-21 07:45:38 +08:00
|
|
|
# If queue is blocked commands should be added to event
|
|
|
|
*/
|
|
|
|
|
2020-07-09 16:29:18 +08:00
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, ProfilingTests, GivenCommandQueueBlockedWithProfilingWhenWalkerIsDispatchedThenMiStoreRegisterMemIsPresentInCS) {
|
2017-12-21 07:45:38 +08:00
|
|
|
typedef typename FamilyType::MI_STORE_REGISTER_MEM MI_STORE_REGISTER_MEM;
|
|
|
|
typedef typename FamilyType::GPGPU_WALKER GPGPU_WALKER;
|
|
|
|
|
2021-03-22 23:26:03 +08:00
|
|
|
MockKernel kernel(program.get(), kernelInfo, *pClDevice);
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_EQ(CL_SUCCESS, kernel.initialize());
|
2021-03-09 18:30:21 +08:00
|
|
|
kernel.incRefInternal();
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
size_t globalOffsets[3] = {0, 0, 0};
|
|
|
|
size_t workItems[3] = {1, 1, 1};
|
|
|
|
uint32_t dimensions = 1;
|
|
|
|
cl_event event;
|
|
|
|
cl_event ue = new UserEvent();
|
|
|
|
|
|
|
|
static_cast<CommandQueueHw<FamilyType> *>(pCmdQ)->enqueueKernel(
|
|
|
|
&kernel,
|
|
|
|
dimensions,
|
|
|
|
globalOffsets,
|
|
|
|
workItems,
|
|
|
|
nullptr,
|
|
|
|
1, // one user event to block queue
|
|
|
|
&ue, // user event not signaled
|
|
|
|
&event);
|
|
|
|
|
|
|
|
// parseCommands<FamilyType>(*pCmdQ);
|
|
|
|
ASSERT_NE(nullptr, pCmdQ->virtualEvent);
|
|
|
|
ASSERT_NE(nullptr, pCmdQ->virtualEvent->peekCommand());
|
2019-03-26 18:59:46 +08:00
|
|
|
NEO::LinearStream *eventCommandStream = pCmdQ->virtualEvent->peekCommand()->getCommandStream();
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(nullptr, eventCommandStream);
|
|
|
|
parseCommands<FamilyType>(*eventCommandStream);
|
|
|
|
|
|
|
|
// Find GPGPU_WALKER
|
|
|
|
auto itorGPGPUWalkerCmd = find<GPGPU_WALKER *>(cmdList.begin(), cmdList.end());
|
|
|
|
GenCmdList::reverse_iterator rItorGPGPUWalkerCmd(itorGPGPUWalkerCmd);
|
|
|
|
ASSERT_NE(cmdList.end(), itorGPGPUWalkerCmd);
|
|
|
|
|
|
|
|
// Check MI_STORE_REGISTER_MEMs
|
2022-05-16 22:06:56 +08:00
|
|
|
auto itorBeforeMI = reverseFind<MI_STORE_REGISTER_MEM *>(rItorGPGPUWalkerCmd, cmdList.rbegin());
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(cmdList.rbegin(), itorBeforeMI);
|
|
|
|
auto pBeforeMI = genCmdCast<MI_STORE_REGISTER_MEM *>(*itorBeforeMI);
|
|
|
|
pBeforeMI = genCmdCast<MI_STORE_REGISTER_MEM *>(*itorBeforeMI);
|
|
|
|
ASSERT_NE(nullptr, pBeforeMI);
|
|
|
|
EXPECT_EQ(GP_THREAD_TIME_REG_ADDRESS_OFFSET_LOW, pBeforeMI->getRegisterAddress());
|
|
|
|
|
|
|
|
auto itorAfterMI = find<MI_STORE_REGISTER_MEM *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterMI);
|
|
|
|
auto pAfterMI = genCmdCast<MI_STORE_REGISTER_MEM *>(*itorAfterMI);
|
|
|
|
ASSERT_NE(nullptr, pAfterMI);
|
|
|
|
EXPECT_EQ(GP_THREAD_TIME_REG_ADDRESS_OFFSET_LOW, pAfterMI->getRegisterAddress());
|
|
|
|
++itorAfterMI;
|
2018-02-23 15:08:30 +08:00
|
|
|
EXPECT_EQ(itorAfterMI, cmdList.end());
|
2017-12-21 07:45:38 +08:00
|
|
|
clReleaseEvent(event);
|
|
|
|
((UserEvent *)ue)->release();
|
2019-02-04 20:08:47 +08:00
|
|
|
pCmdQ->isQueueBlocked();
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
2021-05-20 23:07:00 +08:00
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, ProfilingTests, GivenCommandQueueWithProflingWhenMarkerIsDispatchedThenPipeControlIsPresentInCS) {
|
|
|
|
typedef typename FamilyType::PIPE_CONTROL PIPE_CONTROL;
|
|
|
|
|
|
|
|
cl_event event;
|
|
|
|
|
|
|
|
static_cast<CommandQueueHw<FamilyType> *>(pCmdQ)->enqueueMarkerWithWaitList(
|
|
|
|
0,
|
|
|
|
nullptr,
|
|
|
|
&event);
|
|
|
|
|
|
|
|
parseCommands<FamilyType>(*pCmdQ);
|
|
|
|
|
|
|
|
// Check PIPE_CONTROLs
|
|
|
|
auto itorFirstPC = find<PIPE_CONTROL *>(cmdList.begin(), cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorFirstPC);
|
|
|
|
auto pFirstPC = genCmdCast<PIPE_CONTROL *>(*itorFirstPC);
|
|
|
|
ASSERT_NE(nullptr, pFirstPC);
|
|
|
|
|
|
|
|
auto itorSecondPC = find<PIPE_CONTROL *>(itorFirstPC, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorSecondPC);
|
|
|
|
auto pSecondPC = genCmdCast<PIPE_CONTROL *>(*itorSecondPC);
|
|
|
|
ASSERT_NE(nullptr, pSecondPC);
|
|
|
|
|
|
|
|
EXPECT_TRUE(static_cast<MockEvent<Event> *>(event)->calcProfilingData());
|
|
|
|
|
|
|
|
clReleaseEvent(event);
|
|
|
|
}
|
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
HWTEST_F(ProfilingTests, givenNonKernelEnqueueWhenNonBlockedEnqueueThenSetCpuPath) {
|
|
|
|
cl_event event;
|
2021-05-20 23:07:00 +08:00
|
|
|
pCmdQ->enqueueBarrierWithWaitList(0, nullptr, &event);
|
2017-12-21 07:45:38 +08:00
|
|
|
auto eventObj = static_cast<Event *>(event);
|
|
|
|
EXPECT_TRUE(eventObj->isCPUProfilingPath() == CL_TRUE);
|
2019-09-13 16:11:17 +08:00
|
|
|
pCmdQ->finish();
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
uint64_t queued, submit, start, end;
|
2018-02-27 22:21:59 +08:00
|
|
|
cl_int retVal;
|
|
|
|
|
|
|
|
retVal = eventObj->getEventProfilingInfo(CL_PROFILING_COMMAND_QUEUED, sizeof(uint64_t), &queued, 0);
|
|
|
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
|
|
|
retVal = eventObj->getEventProfilingInfo(CL_PROFILING_COMMAND_SUBMIT, sizeof(uint64_t), &submit, 0);
|
|
|
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
|
|
|
retVal = eventObj->getEventProfilingInfo(CL_PROFILING_COMMAND_START, sizeof(uint64_t), &start, 0);
|
|
|
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
|
|
|
retVal = eventObj->getEventProfilingInfo(CL_PROFILING_COMMAND_END, sizeof(uint64_t), &end, 0);
|
|
|
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
EXPECT_LT(0u, queued);
|
|
|
|
EXPECT_LT(queued, submit);
|
|
|
|
EXPECT_LT(submit, start);
|
|
|
|
EXPECT_LT(start, end);
|
|
|
|
eventObj->release();
|
|
|
|
}
|
|
|
|
|
2021-05-20 23:07:00 +08:00
|
|
|
HWTEST_F(ProfilingTests, givenMarkerEnqueueWhenNonBlockedEnqueueThenSetGpuPath) {
|
|
|
|
cl_event event;
|
|
|
|
pCmdQ->enqueueMarkerWithWaitList(0, nullptr, &event);
|
|
|
|
auto eventObj = static_cast<Event *>(event);
|
|
|
|
EXPECT_TRUE(eventObj->isCPUProfilingPath() == CL_FALSE);
|
|
|
|
pCmdQ->finish();
|
|
|
|
|
|
|
|
uint64_t queued, submit;
|
|
|
|
cl_int retVal;
|
|
|
|
|
|
|
|
retVal = eventObj->getEventProfilingInfo(CL_PROFILING_COMMAND_QUEUED, sizeof(uint64_t), &queued, 0);
|
|
|
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
|
|
|
retVal = eventObj->getEventProfilingInfo(CL_PROFILING_COMMAND_SUBMIT, sizeof(uint64_t), &submit, 0);
|
|
|
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
|
|
|
|
|
|
|
EXPECT_LT(0u, queued);
|
|
|
|
EXPECT_LT(queued, submit);
|
|
|
|
eventObj->release();
|
|
|
|
}
|
|
|
|
|
2021-06-22 21:16:27 +08:00
|
|
|
HWTEST_F(ProfilingTests, givenMarkerEnqueueWhenBlockedEnqueueThenSetGpuPath) {
|
|
|
|
cl_event event = nullptr;
|
|
|
|
cl_event userEvent = new UserEvent();
|
|
|
|
pCmdQ->enqueueMarkerWithWaitList(1, &userEvent, &event);
|
|
|
|
|
|
|
|
auto eventObj = static_cast<Event *>(event);
|
|
|
|
EXPECT_FALSE(eventObj->isCPUProfilingPath());
|
|
|
|
|
|
|
|
auto userEventObj = static_cast<UserEvent *>(userEvent);
|
|
|
|
|
|
|
|
pCmdQ->flush();
|
|
|
|
userEventObj->setStatus(CL_COMPLETE);
|
|
|
|
Event::waitForEvents(1, &event);
|
|
|
|
|
|
|
|
uint64_t queued = 0u, submit = 0u;
|
|
|
|
cl_int retVal;
|
|
|
|
|
|
|
|
retVal = eventObj->getEventProfilingInfo(CL_PROFILING_COMMAND_QUEUED, sizeof(uint64_t), &queued, 0);
|
|
|
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
|
|
|
retVal = eventObj->getEventProfilingInfo(CL_PROFILING_COMMAND_SUBMIT, sizeof(uint64_t), &submit, 0);
|
|
|
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
|
|
|
|
|
|
|
EXPECT_LT(0u, queued);
|
|
|
|
EXPECT_LT(queued, submit);
|
|
|
|
|
|
|
|
eventObj->release();
|
|
|
|
userEventObj->release();
|
|
|
|
}
|
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
template <typename TagType>
|
|
|
|
struct MockTagNode : public TagNode<TagType> {
|
|
|
|
public:
|
2019-02-08 17:27:48 +08:00
|
|
|
using TagNode<TagType>::tagForCpuAccess;
|
2017-12-21 07:45:38 +08:00
|
|
|
using TagNode<TagType>::gfxAllocation;
|
|
|
|
MockTagNode() {
|
|
|
|
gfxAllocation = nullptr;
|
2019-02-08 17:27:48 +08:00
|
|
|
tagForCpuAccess = nullptr;
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2021-05-21 01:49:44 +08:00
|
|
|
class MyOSDeviceTime : public DeviceTime {
|
2018-04-10 22:19:13 +08:00
|
|
|
double getDynamicDeviceTimerResolution(HardwareInfo const &hwInfo) const override {
|
|
|
|
EXPECT_FALSE(true);
|
|
|
|
return 1.0;
|
|
|
|
}
|
2021-03-25 01:57:46 +08:00
|
|
|
uint64_t getDynamicDeviceTimerClock(HardwareInfo const &hwInfo) const override {
|
|
|
|
EXPECT_FALSE(true);
|
|
|
|
return 0;
|
|
|
|
}
|
2021-05-21 01:49:44 +08:00
|
|
|
bool getCpuGpuTime(TimeStampData *pGpuCpuTime, OSTime *) override {
|
2018-04-10 22:19:13 +08:00
|
|
|
EXPECT_FALSE(true);
|
|
|
|
return false;
|
|
|
|
}
|
2021-05-21 01:49:44 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
class MyOSTime : public OSTime {
|
|
|
|
public:
|
|
|
|
static int instanceNum;
|
|
|
|
MyOSTime() {
|
|
|
|
instanceNum++;
|
|
|
|
this->deviceTime = std::make_unique<MyOSDeviceTime>();
|
|
|
|
}
|
|
|
|
|
2018-04-10 22:19:13 +08:00
|
|
|
bool getCpuTime(uint64_t *timeStamp) override {
|
|
|
|
EXPECT_FALSE(true);
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
double getHostTimerResolution() const override {
|
|
|
|
EXPECT_FALSE(true);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
uint64_t getCpuRawTimestamp() override {
|
|
|
|
EXPECT_FALSE(true);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
};
|
2019-04-18 18:25:29 +08:00
|
|
|
|
2018-04-10 22:19:13 +08:00
|
|
|
int MyOSTime::instanceNum = 0;
|
2019-04-18 18:25:29 +08:00
|
|
|
|
2020-09-03 15:06:11 +08:00
|
|
|
using EventProfilingTest = ProfilingTests;
|
|
|
|
|
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, EventProfilingTest, givenEventWhenCompleteIsZeroThenCalcProfilingDataSetsEndTimestampInCompleteTimestampAndDoesntCallOsTimeMethods) {
|
2020-01-14 21:32:11 +08:00
|
|
|
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(nullptr));
|
2018-04-10 22:19:13 +08:00
|
|
|
MyOSTime::instanceNum = 0;
|
|
|
|
device->setOSTime(new MyOSTime());
|
|
|
|
EXPECT_EQ(1, MyOSTime::instanceNum);
|
2017-12-21 07:45:38 +08:00
|
|
|
MockContext context;
|
|
|
|
cl_command_queue_properties props[5] = {0, 0, 0, 0, 0};
|
2021-07-23 18:36:36 +08:00
|
|
|
MockCommandQueue cmdQ(&context, device.get(), props, false);
|
2017-12-21 07:45:38 +08:00
|
|
|
cmdQ.setProfilingEnabled();
|
2018-04-10 22:19:13 +08:00
|
|
|
cmdQ.device = device.get();
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
HwTimeStamps timestamp;
|
|
|
|
timestamp.GlobalStartTS = 10;
|
|
|
|
timestamp.ContextStartTS = 20;
|
|
|
|
timestamp.GlobalEndTS = 80;
|
|
|
|
timestamp.ContextEndTS = 56;
|
|
|
|
timestamp.GlobalCompleteTS = 0;
|
|
|
|
timestamp.ContextCompleteTS = 0;
|
|
|
|
|
|
|
|
MockTagNode<HwTimeStamps> timestampNode;
|
2019-02-08 17:27:48 +08:00
|
|
|
timestampNode.tagForCpuAccess = ×tamp;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
MockEvent<Event> event(&cmdQ, CL_COMPLETE, 0, 0);
|
|
|
|
|
|
|
|
event.setCPUProfilingPath(false);
|
|
|
|
event.timeStampNode = ×tampNode;
|
|
|
|
event.calcProfilingData();
|
|
|
|
|
|
|
|
EXPECT_EQ(timestamp.ContextEndTS, timestamp.ContextCompleteTS);
|
|
|
|
cmdQ.device = nullptr;
|
2018-11-15 21:47:52 +08:00
|
|
|
event.timeStampNode = nullptr;
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
2020-09-03 15:06:11 +08:00
|
|
|
using EventProfilingTests = ProfilingTests;
|
|
|
|
|
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, EventProfilingTests, givenRawTimestampsDebugModeWhenDataIsQueriedThenRawDataIsReturned) {
|
2018-09-12 17:17:36 +08:00
|
|
|
DebugManagerStateRestore stateRestore;
|
|
|
|
DebugManager.flags.ReturnRawGpuTimestamps.set(1);
|
2020-01-14 21:32:11 +08:00
|
|
|
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(nullptr));
|
2018-09-12 17:17:36 +08:00
|
|
|
MyOSTime::instanceNum = 0;
|
|
|
|
device->setOSTime(new MyOSTime());
|
|
|
|
EXPECT_EQ(1, MyOSTime::instanceNum);
|
|
|
|
MockContext context;
|
|
|
|
cl_command_queue_properties props[5] = {0, 0, 0, 0, 0};
|
2021-07-23 18:36:36 +08:00
|
|
|
MockCommandQueue cmdQ(&context, device.get(), props, false);
|
2018-09-12 17:17:36 +08:00
|
|
|
cmdQ.setProfilingEnabled();
|
|
|
|
cmdQ.device = device.get();
|
|
|
|
|
|
|
|
HwTimeStamps timestamp;
|
|
|
|
timestamp.GlobalStartTS = 10;
|
|
|
|
timestamp.ContextStartTS = 20;
|
|
|
|
timestamp.GlobalEndTS = 80;
|
|
|
|
timestamp.ContextEndTS = 56;
|
|
|
|
timestamp.GlobalCompleteTS = 0;
|
|
|
|
timestamp.ContextCompleteTS = 70;
|
|
|
|
|
|
|
|
MockTagNode<HwTimeStamps> timestampNode;
|
2019-02-08 17:27:48 +08:00
|
|
|
timestampNode.tagForCpuAccess = ×tamp;
|
2018-09-12 17:17:36 +08:00
|
|
|
|
|
|
|
MockEvent<Event> event(&cmdQ, CL_COMPLETE, 0, 0);
|
|
|
|
cl_event clEvent = &event;
|
|
|
|
|
|
|
|
event.queueTimeStamp.CPUTimeinNS = 1;
|
|
|
|
event.queueTimeStamp.GPUTimeStamp = 2;
|
|
|
|
|
|
|
|
event.submitTimeStamp.CPUTimeinNS = 3;
|
|
|
|
event.submitTimeStamp.GPUTimeStamp = 4;
|
|
|
|
|
|
|
|
event.setCPUProfilingPath(false);
|
|
|
|
event.timeStampNode = ×tampNode;
|
|
|
|
event.calcProfilingData();
|
|
|
|
|
|
|
|
cl_ulong queued, submited, start, end, complete;
|
|
|
|
|
|
|
|
clGetEventProfilingInfo(clEvent, CL_PROFILING_COMMAND_QUEUED, sizeof(cl_ulong), &queued, nullptr);
|
|
|
|
clGetEventProfilingInfo(clEvent, CL_PROFILING_COMMAND_SUBMIT, sizeof(cl_ulong), &submited, nullptr);
|
|
|
|
clGetEventProfilingInfo(clEvent, CL_PROFILING_COMMAND_START, sizeof(cl_ulong), &start, nullptr);
|
|
|
|
clGetEventProfilingInfo(clEvent, CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &end, nullptr);
|
|
|
|
clGetEventProfilingInfo(clEvent, CL_PROFILING_COMMAND_COMPLETE, sizeof(cl_ulong), &complete, nullptr);
|
|
|
|
|
|
|
|
EXPECT_EQ(timestamp.ContextCompleteTS, complete);
|
|
|
|
EXPECT_EQ(timestamp.ContextEndTS, end);
|
|
|
|
EXPECT_EQ(timestamp.ContextStartTS, start);
|
|
|
|
EXPECT_EQ(event.submitTimeStamp.GPUTimeStamp, submited);
|
|
|
|
EXPECT_EQ(event.queueTimeStamp.GPUTimeStamp, queued);
|
2018-11-15 21:47:52 +08:00
|
|
|
event.timeStampNode = nullptr;
|
2018-09-12 17:17:36 +08:00
|
|
|
}
|
|
|
|
|
2020-09-03 15:06:11 +08:00
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, EventProfilingTest, givenRawTimestampsDebugModeWhenStartTimeStampLTQueueTimeStampThenIncreaseStartTimeStamp) {
|
2020-05-12 18:50:20 +08:00
|
|
|
DebugManagerStateRestore stateRestore;
|
|
|
|
DebugManager.flags.ReturnRawGpuTimestamps.set(1);
|
|
|
|
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(nullptr));
|
|
|
|
MyOSTime::instanceNum = 0;
|
|
|
|
device->setOSTime(new MyOSTime());
|
|
|
|
EXPECT_EQ(1, MyOSTime::instanceNum);
|
|
|
|
MockContext context(device.get());
|
2021-07-23 18:36:36 +08:00
|
|
|
MockCommandQueue cmdQ(&context, device.get(), nullptr, false);
|
2020-05-12 18:50:20 +08:00
|
|
|
cmdQ.setProfilingEnabled();
|
|
|
|
cmdQ.device = device.get();
|
|
|
|
|
|
|
|
HwTimeStamps timestamp;
|
|
|
|
timestamp.GlobalStartTS = 0;
|
|
|
|
timestamp.ContextStartTS = 20;
|
|
|
|
timestamp.GlobalEndTS = 80;
|
|
|
|
timestamp.ContextEndTS = 56;
|
|
|
|
timestamp.GlobalCompleteTS = 0;
|
|
|
|
timestamp.ContextCompleteTS = 70;
|
|
|
|
|
|
|
|
MockTagNode<HwTimeStamps> timestampNode;
|
|
|
|
timestampNode.tagForCpuAccess = ×tamp;
|
|
|
|
|
|
|
|
MockEvent<Event> event(&cmdQ, CL_COMPLETE, 0, 0);
|
|
|
|
cl_event clEvent = &event;
|
|
|
|
|
|
|
|
event.queueTimeStamp.CPUTimeinNS = 83;
|
|
|
|
event.queueTimeStamp.GPUTimeStamp = 1;
|
|
|
|
|
|
|
|
event.setCPUProfilingPath(false);
|
|
|
|
event.timeStampNode = ×tampNode;
|
|
|
|
event.calcProfilingData();
|
|
|
|
|
|
|
|
cl_ulong queued, start;
|
|
|
|
|
|
|
|
clGetEventProfilingInfo(clEvent, CL_PROFILING_COMMAND_QUEUED, sizeof(cl_ulong), &queued, nullptr);
|
|
|
|
clGetEventProfilingInfo(clEvent, CL_PROFILING_COMMAND_START, sizeof(cl_ulong), &start, nullptr);
|
|
|
|
|
|
|
|
EXPECT_LT(queued, start);
|
|
|
|
event.timeStampNode = nullptr;
|
|
|
|
}
|
|
|
|
|
2020-02-21 22:25:04 +08:00
|
|
|
struct ProfilingWithPerfCountersTests : public PerformanceCountersFixture, ::testing::Test {
|
2017-12-21 07:45:38 +08:00
|
|
|
void SetUp() override {
|
2022-08-16 22:51:17 +08:00
|
|
|
setUp(defaultHwInfo.get());
|
2020-06-26 21:54:40 +08:00
|
|
|
}
|
|
|
|
|
2022-08-16 22:51:17 +08:00
|
|
|
void setUp(const NEO::HardwareInfo *hardwareInfo) {
|
|
|
|
PerformanceCountersFixture::setUp();
|
2020-02-21 22:25:04 +08:00
|
|
|
|
2020-06-26 21:54:40 +08:00
|
|
|
HardwareInfo hwInfo = *hardwareInfo;
|
2020-02-21 22:25:04 +08:00
|
|
|
if (hwInfo.capabilityTable.defaultEngineType == aub_stream::EngineType::ENGINE_CCS) {
|
2021-11-25 17:31:14 +08:00
|
|
|
hwInfo.featureTable.flags.ftrCCSNode = true;
|
2020-02-21 22:25:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
pDevice = MockDevice::createWithNewExecutionEnvironment<MockDevice>(&hwInfo, 0);
|
|
|
|
pClDevice = std::make_unique<ClDevice>(*pDevice, nullptr);
|
|
|
|
|
2022-07-07 01:44:49 +08:00
|
|
|
pDevice->setPerfCounters(MockPerformanceCounters::create());
|
2020-02-21 22:25:04 +08:00
|
|
|
|
|
|
|
context = std::make_unique<MockContext>(pClDevice.get());
|
|
|
|
|
|
|
|
cl_int retVal = CL_SUCCESS;
|
|
|
|
cl_queue_properties properties[] = {CL_QUEUE_PROPERTIES, CL_QUEUE_PROFILING_ENABLE, 0};
|
|
|
|
pCmdQ.reset(CommandQueue::create(context.get(), pClDevice.get(), properties, false, retVal));
|
|
|
|
|
|
|
|
kernel = std::make_unique<MockKernelWithInternals>(*pClDevice);
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void TearDown() override {
|
2022-08-16 22:51:17 +08:00
|
|
|
PerformanceCountersFixture::tearDown();
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
2019-04-18 18:25:29 +08:00
|
|
|
|
|
|
|
template <typename GfxFamily>
|
2020-02-21 22:25:04 +08:00
|
|
|
GenCmdList::iterator expectStoreRegister(const GenCmdList &cmdList, GenCmdList::iterator itor, uint64_t memoryAddress, uint32_t registerAddress) {
|
2019-04-18 18:25:29 +08:00
|
|
|
using MI_STORE_REGISTER_MEM = typename GfxFamily::MI_STORE_REGISTER_MEM;
|
|
|
|
|
|
|
|
itor = find<MI_STORE_REGISTER_MEM *>(itor, cmdList.end());
|
|
|
|
EXPECT_NE(cmdList.end(), itor);
|
|
|
|
auto pStore = genCmdCast<MI_STORE_REGISTER_MEM *>(*itor);
|
|
|
|
EXPECT_EQ(memoryAddress, pStore->getMemoryAddress());
|
|
|
|
EXPECT_EQ(registerAddress, pStore->getRegisterAddress());
|
|
|
|
itor++;
|
|
|
|
return itor;
|
|
|
|
}
|
2020-02-21 22:25:04 +08:00
|
|
|
|
|
|
|
MockDevice *pDevice = nullptr;
|
|
|
|
std::unique_ptr<ClDevice> pClDevice;
|
|
|
|
std::unique_ptr<MockContext> context;
|
|
|
|
std::unique_ptr<CommandQueue> pCmdQ;
|
|
|
|
std::unique_ptr<MockKernelWithInternals> kernel;
|
2017-12-21 07:45:38 +08:00
|
|
|
};
|
2019-04-18 18:25:29 +08:00
|
|
|
|
2020-06-26 21:54:40 +08:00
|
|
|
struct ProfilingWithPerfCountersOnCCSTests : ProfilingWithPerfCountersTests {
|
|
|
|
void SetUp() override {
|
|
|
|
auto hwInfo = *defaultHwInfo;
|
|
|
|
hwInfo.capabilityTable.defaultEngineType = aub_stream::ENGINE_CCS;
|
2022-08-16 22:51:17 +08:00
|
|
|
ProfilingWithPerfCountersTests::setUp(&hwInfo);
|
2020-06-26 21:54:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void TearDown() override {
|
|
|
|
ProfilingWithPerfCountersTests::TearDown();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-07-09 16:29:18 +08:00
|
|
|
HWTEST_F(ProfilingWithPerfCountersTests, GivenCommandQueueWithProfilingPerfCounterAndForWorkloadWithNoKernelWhenGetCSFromCmdQueueThenEnoughSpaceInCS) {
|
2017-12-21 07:45:38 +08:00
|
|
|
typedef typename FamilyType::MI_STORE_REGISTER_MEM MI_STORE_REGISTER_MEM;
|
|
|
|
typedef typename FamilyType::PIPE_CONTROL PIPE_CONTROL;
|
2018-10-01 17:57:36 +08:00
|
|
|
typedef typename FamilyType::WALKER_TYPE GPGPU_WALKER;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2019-12-19 19:58:02 +08:00
|
|
|
pCmdQ->setPerfCountersEnabled();
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
uint64_t requiredSize = 2 * sizeof(PIPE_CONTROL) + 4 * sizeof(MI_STORE_REGISTER_MEM);
|
|
|
|
|
2019-07-18 22:14:41 +08:00
|
|
|
MultiDispatchInfo multiDispatchInfo(nullptr);
|
|
|
|
auto &commandStreamMigrateMemObjects = getCommandStream<FamilyType, CL_COMMAND_MIGRATE_MEM_OBJECTS>(*pCmdQ, CsrDependencies(),
|
|
|
|
true, true, false, multiDispatchInfo,
|
2023-01-20 00:11:39 +08:00
|
|
|
nullptr, 0, false, false, nullptr);
|
2021-03-04 01:29:32 +08:00
|
|
|
auto expectedSizeCS = EnqueueOperation<FamilyType>::getSizeRequiredCS(CL_COMMAND_MIGRATE_MEM_OBJECTS, true, true, *pCmdQ, nullptr, {});
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_GE(expectedSizeCS, requiredSize);
|
|
|
|
EXPECT_GE(commandStreamMigrateMemObjects.getAvailableSpace(), requiredSize);
|
|
|
|
|
2019-07-18 22:14:41 +08:00
|
|
|
auto &commandStreamMarker = getCommandStream<FamilyType, CL_COMMAND_MARKER>(*pCmdQ, CsrDependencies(), true, true, false,
|
2023-01-20 00:11:39 +08:00
|
|
|
multiDispatchInfo, nullptr, 0, false, false, nullptr);
|
2021-03-04 01:29:32 +08:00
|
|
|
expectedSizeCS = EnqueueOperation<FamilyType>::getSizeRequiredCS(CL_COMMAND_MARKER, true, true, *pCmdQ, nullptr, {});
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_GE(expectedSizeCS, requiredSize);
|
|
|
|
EXPECT_GE(commandStreamMarker.getAvailableSpace(), requiredSize);
|
|
|
|
}
|
|
|
|
|
2020-07-09 16:29:18 +08:00
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, ProfilingWithPerfCountersTests, GivenCommandQueueWithProfilingPerfCountersWhenWalkerIsDispatchedThenPipeControlWithTimeStampIsPresentInCS) {
|
2017-12-21 07:45:38 +08:00
|
|
|
typedef typename FamilyType::PIPE_CONTROL PIPE_CONTROL;
|
|
|
|
typedef typename FamilyType::GPGPU_WALKER GPGPU_WALKER;
|
|
|
|
typedef typename FamilyType::MI_REPORT_PERF_COUNT MI_REPORT_PERF_COUNT;
|
|
|
|
|
2019-12-19 19:58:02 +08:00
|
|
|
pCmdQ->setPerfCountersEnabled();
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
size_t globalOffsets[3] = {0, 0, 0};
|
|
|
|
size_t workItems[3] = {1, 1, 1};
|
|
|
|
uint32_t dimensions = 1;
|
|
|
|
cl_event event;
|
|
|
|
|
2021-03-09 00:27:24 +08:00
|
|
|
static_cast<CommandQueueHw<FamilyType> *>(pCmdQ.get())->enqueueKernel(kernel->mockKernel, dimensions, globalOffsets, workItems, nullptr, 0, nullptr, &event);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2021-10-13 16:58:23 +08:00
|
|
|
ClHardwareParse parse;
|
2020-02-21 22:25:04 +08:00
|
|
|
auto &cmdList = parse.cmdList;
|
|
|
|
parse.parseCommands<FamilyType>(*pCmdQ);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
// expect MI_REPORT_PERF_COUNT before WALKER
|
|
|
|
auto itorBeforeReportPerf = find<MI_REPORT_PERF_COUNT *>(cmdList.begin(), cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorBeforeReportPerf);
|
|
|
|
|
|
|
|
// Find GPGPU_WALKER
|
|
|
|
auto itorGPGPUWalkerCmd = find<GPGPU_WALKER *>(itorBeforeReportPerf, cmdList.end());
|
|
|
|
GenCmdList::reverse_iterator rItorGPGPUWalkerCmd(itorGPGPUWalkerCmd);
|
|
|
|
ASSERT_NE(cmdList.end(), itorGPGPUWalkerCmd);
|
|
|
|
|
|
|
|
// Check PIPE_CONTROLs
|
2022-05-16 22:06:56 +08:00
|
|
|
auto itorBeforePC = reverseFind<PIPE_CONTROL *>(rItorGPGPUWalkerCmd, cmdList.rbegin());
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(cmdList.rbegin(), itorBeforePC);
|
|
|
|
auto pBeforePC = genCmdCast<PIPE_CONTROL *>(*itorBeforePC);
|
|
|
|
ASSERT_NE(nullptr, pBeforePC);
|
|
|
|
EXPECT_EQ(1u, pBeforePC->getCommandStreamerStallEnable());
|
|
|
|
|
|
|
|
auto itorAfterPC = find<PIPE_CONTROL *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterPC);
|
|
|
|
auto pAfterPC = genCmdCast<PIPE_CONTROL *>(*itorAfterPC);
|
|
|
|
ASSERT_NE(nullptr, pAfterPC);
|
|
|
|
EXPECT_EQ(1u, pAfterPC->getCommandStreamerStallEnable());
|
|
|
|
|
|
|
|
EXPECT_EQ(PIPE_CONTROL::POST_SYNC_OPERATION_WRITE_TIMESTAMP, pBeforePC->getPostSyncOperation());
|
|
|
|
|
|
|
|
// expect MI_REPORT_PERF_COUNT after WALKER
|
|
|
|
auto itorAfterReportPerf = find<MI_REPORT_PERF_COUNT *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterReportPerf);
|
|
|
|
|
2019-01-21 18:44:56 +08:00
|
|
|
EXPECT_TRUE(static_cast<MockEvent<Event> *>(event)->calcProfilingData());
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
clReleaseEvent(event);
|
|
|
|
}
|
|
|
|
|
2020-07-09 16:29:18 +08:00
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, ProfilingWithPerfCountersTests, GivenCommandQueueWithProfilingPerfCountersNoUserRegistersWhenWalkerIsDispatchedThenPipeControlWithTimeStampIsPresentInCS) {
|
2017-12-21 07:45:38 +08:00
|
|
|
typedef typename FamilyType::PIPE_CONTROL PIPE_CONTROL;
|
|
|
|
typedef typename FamilyType::GPGPU_WALKER GPGPU_WALKER;
|
|
|
|
typedef typename FamilyType::MI_REPORT_PERF_COUNT MI_REPORT_PERF_COUNT;
|
|
|
|
|
2019-12-19 19:58:02 +08:00
|
|
|
pCmdQ->setPerfCountersEnabled();
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
size_t globalOffsets[3] = {0, 0, 0};
|
|
|
|
size_t workItems[3] = {1, 1, 1};
|
|
|
|
uint32_t dimensions = 1;
|
|
|
|
cl_event event;
|
|
|
|
|
2021-03-09 00:27:24 +08:00
|
|
|
static_cast<CommandQueueHw<FamilyType> *>(pCmdQ.get())->enqueueKernel(kernel->mockKernel, dimensions, globalOffsets, workItems, nullptr, 0, nullptr, &event);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2021-10-13 16:58:23 +08:00
|
|
|
ClHardwareParse parse;
|
2020-02-21 22:25:04 +08:00
|
|
|
auto &cmdList = parse.cmdList;
|
|
|
|
parse.parseCommands<FamilyType>(*pCmdQ);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
// expect MI_REPORT_PERF_COUNT before WALKER
|
|
|
|
auto itorBeforeReportPerf = find<MI_REPORT_PERF_COUNT *>(cmdList.begin(), cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorBeforeReportPerf);
|
|
|
|
|
|
|
|
// Find GPGPU_WALKER
|
|
|
|
auto itorGPGPUWalkerCmd = find<GPGPU_WALKER *>(itorBeforeReportPerf, cmdList.end());
|
|
|
|
GenCmdList::reverse_iterator rItorGPGPUWalkerCmd(itorGPGPUWalkerCmd);
|
|
|
|
ASSERT_NE(cmdList.end(), itorGPGPUWalkerCmd);
|
|
|
|
|
|
|
|
// Check PIPE_CONTROLs
|
2022-05-16 22:06:56 +08:00
|
|
|
auto itorBeforePC = reverseFind<PIPE_CONTROL *>(rItorGPGPUWalkerCmd, cmdList.rbegin());
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(cmdList.rbegin(), itorBeforePC);
|
|
|
|
auto pBeforePC = genCmdCast<PIPE_CONTROL *>(*itorBeforePC);
|
|
|
|
ASSERT_NE(nullptr, pBeforePC);
|
|
|
|
EXPECT_EQ(1u, pBeforePC->getCommandStreamerStallEnable());
|
|
|
|
|
|
|
|
auto itorAfterPC = find<PIPE_CONTROL *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterPC);
|
|
|
|
auto pAfterPC = genCmdCast<PIPE_CONTROL *>(*itorAfterPC);
|
|
|
|
ASSERT_NE(nullptr, pAfterPC);
|
|
|
|
EXPECT_EQ(1u, pAfterPC->getCommandStreamerStallEnable());
|
|
|
|
|
|
|
|
EXPECT_EQ(PIPE_CONTROL::POST_SYNC_OPERATION_WRITE_TIMESTAMP, pBeforePC->getPostSyncOperation());
|
|
|
|
|
|
|
|
// expect MI_REPORT_PERF_COUNT after WALKER
|
|
|
|
auto itorAfterReportPerf = find<MI_REPORT_PERF_COUNT *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterReportPerf);
|
|
|
|
|
2019-01-21 18:44:56 +08:00
|
|
|
EXPECT_TRUE(static_cast<MockEvent<Event> *>(event)->calcProfilingData());
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
clReleaseEvent(event);
|
|
|
|
}
|
|
|
|
|
2020-07-09 16:29:18 +08:00
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, ProfilingWithPerfCountersTests, GivenCommandQueueBlockedWithProflingPerfCounterWhenWalkerIsDispatchedThenPipeControlWithTimeStampIsPresentInCS) {
|
2017-12-21 07:45:38 +08:00
|
|
|
typedef typename FamilyType::PIPE_CONTROL PIPE_CONTROL;
|
|
|
|
typedef typename FamilyType::GPGPU_WALKER GPGPU_WALKER;
|
|
|
|
typedef typename FamilyType::MI_REPORT_PERF_COUNT MI_REPORT_PERF_COUNT;
|
|
|
|
|
2019-12-19 19:58:02 +08:00
|
|
|
pCmdQ->setPerfCountersEnabled();
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
size_t globalOffsets[3] = {0, 0, 0};
|
|
|
|
size_t workItems[3] = {1, 1, 1};
|
|
|
|
uint32_t dimensions = 1;
|
|
|
|
cl_event event;
|
|
|
|
cl_event ue = new UserEvent();
|
2021-03-09 00:27:24 +08:00
|
|
|
static_cast<CommandQueueHw<FamilyType> *>(pCmdQ.get())->enqueueKernel(kernel->mockKernel, dimensions, globalOffsets, workItems, nullptr,
|
2020-02-21 22:25:04 +08:00
|
|
|
1, // one user event to block queue
|
|
|
|
&ue, // user event not signaled
|
|
|
|
&event);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2022-07-24 12:21:16 +08:00
|
|
|
// rseCommands<FamilyType>(*pCmdQ);
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(nullptr, pCmdQ->virtualEvent);
|
|
|
|
ASSERT_NE(nullptr, pCmdQ->virtualEvent->peekCommand());
|
2019-03-26 18:59:46 +08:00
|
|
|
NEO::LinearStream *eventCommandStream = pCmdQ->virtualEvent->peekCommand()->getCommandStream();
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(nullptr, eventCommandStream);
|
2020-02-21 22:25:04 +08:00
|
|
|
|
|
|
|
HardwareParse parse;
|
|
|
|
auto &cmdList = parse.cmdList;
|
|
|
|
parse.parseCommands<FamilyType>(*eventCommandStream);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
// expect MI_REPORT_PERF_COUNT before WALKER
|
|
|
|
auto itorBeforeReportPerf = find<MI_REPORT_PERF_COUNT *>(cmdList.begin(), cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorBeforeReportPerf);
|
|
|
|
|
|
|
|
// Find GPGPU_WALKER
|
|
|
|
auto itorGPGPUWalkerCmd = find<GPGPU_WALKER *>(itorBeforeReportPerf, cmdList.end());
|
|
|
|
GenCmdList::reverse_iterator rItorGPGPUWalkerCmd(itorGPGPUWalkerCmd);
|
|
|
|
ASSERT_NE(cmdList.end(), itorGPGPUWalkerCmd);
|
|
|
|
|
|
|
|
// Check PIPE_CONTROLs
|
2022-05-16 22:06:56 +08:00
|
|
|
auto itorBeforePC = reverseFind<PIPE_CONTROL *>(rItorGPGPUWalkerCmd, cmdList.rbegin());
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(cmdList.rbegin(), itorBeforePC);
|
|
|
|
auto pBeforePC = genCmdCast<PIPE_CONTROL *>(*itorBeforePC);
|
|
|
|
ASSERT_NE(nullptr, pBeforePC);
|
|
|
|
|
|
|
|
auto itorAfterPC = find<PIPE_CONTROL *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterPC);
|
|
|
|
auto pAfterPC = genCmdCast<PIPE_CONTROL *>(*itorAfterPC);
|
|
|
|
ASSERT_NE(nullptr, pAfterPC);
|
|
|
|
|
|
|
|
EXPECT_EQ(PIPE_CONTROL::POST_SYNC_OPERATION_WRITE_TIMESTAMP, pBeforePC->getPostSyncOperation());
|
|
|
|
|
|
|
|
// expect MI_REPORT_PERF_COUNT after WALKER
|
|
|
|
auto itorAfterReportPerf = find<MI_REPORT_PERF_COUNT *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterReportPerf);
|
|
|
|
|
|
|
|
clReleaseEvent(event);
|
|
|
|
((UserEvent *)ue)->release();
|
2019-02-04 20:08:47 +08:00
|
|
|
pCmdQ->isQueueBlocked();
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
2020-07-09 16:29:18 +08:00
|
|
|
HWTEST_F(ProfilingWithPerfCountersTests, GivenCommandQueueWithProfilingPerfCountersNoEventWhenWalkerIsDispatchedThenPipeControlWithTimeStampIsNotPresentInCS) {
|
2017-12-21 07:45:38 +08:00
|
|
|
typedef typename FamilyType::PIPE_CONTROL PIPE_CONTROL;
|
2018-10-01 17:57:36 +08:00
|
|
|
typedef typename FamilyType::WALKER_TYPE GPGPU_WALKER;
|
2017-12-21 07:45:38 +08:00
|
|
|
typedef typename FamilyType::MI_REPORT_PERF_COUNT MI_REPORT_PERF_COUNT;
|
|
|
|
|
2019-12-19 19:58:02 +08:00
|
|
|
pCmdQ->setPerfCountersEnabled();
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
size_t globalOffsets[3] = {0, 0, 0};
|
|
|
|
size_t workItems[3] = {1, 1, 1};
|
|
|
|
uint32_t dimensions = 1;
|
|
|
|
|
2021-03-09 00:27:24 +08:00
|
|
|
static_cast<CommandQueueHw<FamilyType> *>(pCmdQ.get())->enqueueKernel(kernel->mockKernel, dimensions, globalOffsets, workItems, nullptr, 0, nullptr, nullptr);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2021-10-13 16:58:23 +08:00
|
|
|
ClHardwareParse parse;
|
2020-02-21 22:25:04 +08:00
|
|
|
auto &cmdList = parse.cmdList;
|
|
|
|
parse.parseCommands<FamilyType>(*pCmdQ);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
// expect no MI_REPORT_PERF_COUNT before WALKER
|
|
|
|
auto itorBeforeReportPerf = find<MI_REPORT_PERF_COUNT *>(cmdList.begin(), cmdList.end());
|
|
|
|
ASSERT_EQ(cmdList.end(), itorBeforeReportPerf);
|
|
|
|
|
|
|
|
// Find GPGPU_WALKER
|
|
|
|
auto itorGPGPUWalkerCmd = find<GPGPU_WALKER *>(cmdList.begin(), cmdList.end());
|
|
|
|
GenCmdList::reverse_iterator rItorGPGPUWalkerCmd(itorGPGPUWalkerCmd);
|
|
|
|
ASSERT_NE(cmdList.end(), itorGPGPUWalkerCmd);
|
|
|
|
|
|
|
|
// Check PIPE_CONTROLs
|
2022-05-16 22:06:56 +08:00
|
|
|
auto itorBeforePC = reverseFind<PIPE_CONTROL *>(rItorGPGPUWalkerCmd, cmdList.rbegin());
|
2017-12-21 07:45:38 +08:00
|
|
|
ASSERT_NE(cmdList.rbegin(), itorBeforePC);
|
|
|
|
auto pBeforePC = genCmdCast<PIPE_CONTROL *>(*itorBeforePC);
|
|
|
|
ASSERT_NE(nullptr, pBeforePC);
|
|
|
|
EXPECT_EQ(1u, pBeforePC->getCommandStreamerStallEnable());
|
|
|
|
|
|
|
|
auto itorAfterPC = find<PIPE_CONTROL *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterPC);
|
|
|
|
auto pAfterPC = genCmdCast<PIPE_CONTROL *>(*itorAfterPC);
|
|
|
|
ASSERT_NE(nullptr, pAfterPC);
|
|
|
|
EXPECT_EQ(1u, pAfterPC->getCommandStreamerStallEnable());
|
|
|
|
|
2018-02-07 21:08:14 +08:00
|
|
|
EXPECT_EQ(PIPE_CONTROL::POST_SYNC_OPERATION_NO_WRITE, pBeforePC->getPostSyncOperation());
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
// expect MI_REPORT_PERF_COUNT after WALKER
|
|
|
|
auto itorAfterReportPerf = find<MI_REPORT_PERF_COUNT *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_EQ(cmdList.end(), itorAfterReportPerf);
|
|
|
|
}
|
2019-01-21 18:44:56 +08:00
|
|
|
|
2019-04-18 18:25:29 +08:00
|
|
|
template <typename TagType>
|
2021-05-13 02:48:41 +08:00
|
|
|
struct FixedGpuAddressTagAllocator : MockTagAllocator<TagType> {
|
2021-02-25 22:50:02 +08:00
|
|
|
using TagAllocator<TagType>::usedTags;
|
|
|
|
using TagAllocator<TagType>::deferredTags;
|
2019-04-18 18:25:29 +08:00
|
|
|
|
|
|
|
struct MockTagNode : TagNode<TagType> {
|
|
|
|
void setGpuAddress(uint64_t value) { this->gpuAddress = value; }
|
|
|
|
};
|
|
|
|
|
|
|
|
FixedGpuAddressTagAllocator(CommandStreamReceiver &csr, uint64_t gpuAddress)
|
2021-05-13 02:48:41 +08:00
|
|
|
: MockTagAllocator<TagType>(csr.getRootDeviceIndex(), csr.getMemoryManager(), csr.getPreferredTagPoolSize(), MemoryConstants::cacheLineSize,
|
|
|
|
sizeof(TagType), false, csr.getOsContext().getDeviceBitfield()) {
|
2019-04-18 18:25:29 +08:00
|
|
|
auto tag = reinterpret_cast<MockTagNode *>(this->freeTags.peekHead());
|
|
|
|
tag->setGpuAddress(gpuAddress);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-07-14 15:59:16 +08:00
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, ProfilingWithPerfCountersTests, GivenCommandQueueWithProfilingPerfCountersWhenWalkerIsDispatchedThenRegisterStoresArePresentInCS) {
|
2019-04-18 18:25:29 +08:00
|
|
|
uint64_t timeStampGpuAddress = 0x123456000;
|
|
|
|
uint64_t perfCountersGpuAddress = 0xabcdef000;
|
|
|
|
|
|
|
|
auto &csr = pDevice->getUltCommandStreamReceiver<FamilyType>();
|
|
|
|
csr.profilingTimeStampAllocator.reset(new FixedGpuAddressTagAllocator<HwTimeStamps>(csr, timeStampGpuAddress));
|
|
|
|
csr.perfCounterAllocator.reset(new FixedGpuAddressTagAllocator<HwPerfCounter>(csr, perfCountersGpuAddress));
|
|
|
|
|
2019-12-19 19:58:02 +08:00
|
|
|
pCmdQ->setPerfCountersEnabled();
|
2019-04-18 18:25:29 +08:00
|
|
|
|
|
|
|
size_t globalOffsets[3] = {0, 0, 0};
|
|
|
|
size_t workItems[3] = {1, 1, 1};
|
|
|
|
uint32_t dimensions = 1;
|
|
|
|
cl_event event;
|
|
|
|
|
2021-03-09 00:27:24 +08:00
|
|
|
static_cast<CommandQueueHw<FamilyType> *>(pCmdQ.get())->enqueueKernel(kernel->mockKernel, dimensions, globalOffsets, workItems, nullptr, 0, nullptr, &event);
|
2019-04-18 18:25:29 +08:00
|
|
|
|
|
|
|
auto pEvent = static_cast<MockEvent<Event> *>(event);
|
|
|
|
EXPECT_EQ(pEvent->getHwTimeStampNode()->getGpuAddress(), timeStampGpuAddress);
|
|
|
|
EXPECT_EQ(pEvent->getHwPerfCounterNode()->getGpuAddress(), perfCountersGpuAddress);
|
2021-10-13 16:58:23 +08:00
|
|
|
ClHardwareParse parse;
|
2020-02-21 22:25:04 +08:00
|
|
|
auto &cmdList = parse.cmdList;
|
|
|
|
parse.parseCommands<FamilyType>(*pCmdQ);
|
2019-04-18 18:25:29 +08:00
|
|
|
|
2020-02-21 22:25:04 +08:00
|
|
|
auto itor = expectStoreRegister<FamilyType>(cmdList, cmdList.begin(), timeStampGpuAddress + offsetof(HwTimeStamps, ContextStartTS), GP_THREAD_TIME_REG_ADDRESS_OFFSET_LOW);
|
2019-04-18 18:25:29 +08:00
|
|
|
// after WALKER:
|
|
|
|
|
2020-02-21 22:25:04 +08:00
|
|
|
itor = expectStoreRegister<FamilyType>(cmdList, itor, timeStampGpuAddress + offsetof(HwTimeStamps, ContextEndTS), GP_THREAD_TIME_REG_ADDRESS_OFFSET_LOW);
|
2019-04-18 18:25:29 +08:00
|
|
|
|
|
|
|
EXPECT_TRUE(pEvent->calcProfilingData());
|
|
|
|
|
|
|
|
clReleaseEvent(event);
|
|
|
|
}
|
|
|
|
|
2021-02-25 22:50:02 +08:00
|
|
|
HWTEST_F(ProfilingWithPerfCountersTests, givenTimestampPacketsEnabledWhenEnqueueIsCalledThenDontAllocateHwTimeStamps) {
|
|
|
|
auto &csr = pDevice->getUltCommandStreamReceiver<FamilyType>();
|
|
|
|
csr.timestampPacketWriteEnabled = true;
|
|
|
|
|
|
|
|
auto mockAllocator = new FixedGpuAddressTagAllocator<HwTimeStamps>(csr, 0x123);
|
|
|
|
csr.profilingTimeStampAllocator.reset(mockAllocator);
|
|
|
|
|
|
|
|
auto myCmdQ = std::make_unique<MockCommandQueueHw<FamilyType>>(pCmdQ->getContextPtr(), pClDevice.get(), nullptr);
|
|
|
|
myCmdQ->setProfilingEnabled();
|
|
|
|
|
|
|
|
size_t globalOffsets[3] = {0, 0, 0};
|
|
|
|
size_t workItems[3] = {1, 1, 1};
|
|
|
|
cl_event event;
|
|
|
|
|
|
|
|
myCmdQ->enqueueKernel(kernel->mockKernel, 1, globalOffsets, workItems, nullptr, 0, nullptr, &event);
|
|
|
|
|
|
|
|
EXPECT_EQ(!!myCmdQ->getTimestampPacketContainer(), mockAllocator->usedTags.peekIsEmpty());
|
|
|
|
EXPECT_TRUE(mockAllocator->deferredTags.peekIsEmpty());
|
|
|
|
|
|
|
|
clReleaseEvent(event);
|
|
|
|
}
|
|
|
|
|
2020-06-26 21:54:40 +08:00
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, ProfilingWithPerfCountersOnCCSTests, givenCommandQueueBlockedWithProfilingPerfCountersWhenWalkerIsDispatchedThenPipeControlWithTimeStampIsPresentInCS) {
|
|
|
|
using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL;
|
|
|
|
using GPGPU_WALKER = typename FamilyType::GPGPU_WALKER;
|
|
|
|
using MI_REPORT_PERF_COUNT = typename FamilyType::MI_REPORT_PERF_COUNT;
|
|
|
|
|
|
|
|
pCmdQ->setPerfCountersEnabled();
|
|
|
|
|
|
|
|
size_t globalOffsets[3] = {0, 0, 0};
|
|
|
|
size_t workItems[3] = {1, 1, 1};
|
|
|
|
uint32_t dimensions = 1;
|
|
|
|
cl_event event;
|
|
|
|
cl_event userEvent = clCreateUserEvent(context.get(), nullptr);
|
|
|
|
CommandQueueHw<FamilyType> *cmdQHw = static_cast<CommandQueueHw<FamilyType> *>(pCmdQ.get());
|
|
|
|
|
2021-03-09 00:27:24 +08:00
|
|
|
cmdQHw->enqueueKernel(kernel->mockKernel, dimensions, globalOffsets, workItems, nullptr, 1, &userEvent, &event);
|
2020-06-26 21:54:40 +08:00
|
|
|
ASSERT_NE(nullptr, pCmdQ->virtualEvent);
|
|
|
|
ASSERT_NE(nullptr, pCmdQ->virtualEvent->peekCommand());
|
|
|
|
NEO::LinearStream *eventCommandStream = pCmdQ->virtualEvent->peekCommand()->getCommandStream();
|
|
|
|
ASSERT_NE(nullptr, eventCommandStream);
|
|
|
|
|
|
|
|
HardwareParse parse;
|
|
|
|
auto &cmdList = parse.cmdList;
|
|
|
|
parse.parseCommands<FamilyType>(*eventCommandStream);
|
|
|
|
|
|
|
|
// expect MI_REPORT_PERF_COUNT before WALKER
|
|
|
|
auto itorBeforeReportPerf = find<MI_REPORT_PERF_COUNT *>(cmdList.begin(), cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorBeforeReportPerf);
|
|
|
|
|
|
|
|
// find GPGPU_WALKER
|
|
|
|
auto itorGPGPUWalkerCmd = find<GPGPU_WALKER *>(itorBeforeReportPerf, cmdList.end());
|
|
|
|
GenCmdList::reverse_iterator rItorGPGPUWalkerCmd(itorGPGPUWalkerCmd);
|
|
|
|
ASSERT_NE(cmdList.end(), itorGPGPUWalkerCmd);
|
|
|
|
|
|
|
|
// check PIPE_CONTROLs
|
2022-05-16 22:06:56 +08:00
|
|
|
auto itorBeforePC = reverseFind<PIPE_CONTROL *>(rItorGPGPUWalkerCmd, cmdList.rbegin());
|
2020-06-26 21:54:40 +08:00
|
|
|
ASSERT_NE(cmdList.rbegin(), itorBeforePC);
|
|
|
|
auto pBeforePC = genCmdCast<PIPE_CONTROL *>(*itorBeforePC);
|
|
|
|
ASSERT_NE(nullptr, pBeforePC);
|
|
|
|
|
|
|
|
auto itorAfterPC = find<PIPE_CONTROL *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterPC);
|
|
|
|
auto pAfterPC = genCmdCast<PIPE_CONTROL *>(*itorAfterPC);
|
|
|
|
ASSERT_NE(nullptr, pAfterPC);
|
|
|
|
|
|
|
|
EXPECT_EQ(PIPE_CONTROL::POST_SYNC_OPERATION_WRITE_TIMESTAMP, pBeforePC->getPostSyncOperation());
|
|
|
|
|
|
|
|
// expect MI_REPORT_PERF_COUNT after WALKER
|
|
|
|
auto itorAfterReportPerf = find<MI_REPORT_PERF_COUNT *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterReportPerf);
|
|
|
|
|
|
|
|
clReleaseEvent(event);
|
|
|
|
clReleaseEvent(userEvent);
|
|
|
|
}
|
|
|
|
|
|
|
|
HWCMDTEST_F(IGFX_GEN8_CORE, ProfilingWithPerfCountersOnCCSTests, givenCommandQueueWithProfilingPerfCountersWhenWalkerIsDispatchedThenPipeControlWithTimeStampIsPresentInCS) {
|
|
|
|
using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL;
|
|
|
|
using GPGPU_WALKER = typename FamilyType::GPGPU_WALKER;
|
|
|
|
using MI_REPORT_PERF_COUNT = typename FamilyType::MI_REPORT_PERF_COUNT;
|
|
|
|
|
|
|
|
pCmdQ->setPerfCountersEnabled();
|
|
|
|
|
|
|
|
size_t globalOffsets[3] = {0, 0, 0};
|
|
|
|
size_t workItems[3] = {1, 1, 1};
|
|
|
|
uint32_t dimensions = 1;
|
|
|
|
cl_event event;
|
|
|
|
CommandQueueHw<FamilyType> *cmdQHw = static_cast<CommandQueueHw<FamilyType> *>(pCmdQ.get());
|
|
|
|
|
2021-03-09 00:27:24 +08:00
|
|
|
cmdQHw->enqueueKernel(kernel->mockKernel, dimensions, globalOffsets, workItems, nullptr, 0, nullptr, &event);
|
2020-06-26 21:54:40 +08:00
|
|
|
|
2021-10-13 16:58:23 +08:00
|
|
|
ClHardwareParse parse;
|
2020-06-26 21:54:40 +08:00
|
|
|
auto &cmdList = parse.cmdList;
|
|
|
|
parse.parseCommands<FamilyType>(*pCmdQ);
|
|
|
|
|
|
|
|
// expect MI_REPORT_PERF_COUNT before WALKER
|
|
|
|
auto itorBeforeReportPerf = find<MI_REPORT_PERF_COUNT *>(cmdList.begin(), cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorBeforeReportPerf);
|
|
|
|
|
|
|
|
// find GPGPU_WALKER
|
|
|
|
auto itorGPGPUWalkerCmd = find<GPGPU_WALKER *>(itorBeforeReportPerf, cmdList.end());
|
|
|
|
GenCmdList::reverse_iterator rItorGPGPUWalkerCmd(itorGPGPUWalkerCmd);
|
|
|
|
ASSERT_NE(cmdList.end(), itorGPGPUWalkerCmd);
|
|
|
|
|
|
|
|
// check PIPE_CONTROLs
|
2022-05-16 22:06:56 +08:00
|
|
|
auto itorBeforePC = reverseFind<PIPE_CONTROL *>(rItorGPGPUWalkerCmd, cmdList.rbegin());
|
2020-06-26 21:54:40 +08:00
|
|
|
ASSERT_NE(cmdList.rbegin(), itorBeforePC);
|
|
|
|
auto pBeforePC = genCmdCast<PIPE_CONTROL *>(*itorBeforePC);
|
|
|
|
ASSERT_NE(nullptr, pBeforePC);
|
|
|
|
EXPECT_EQ(1u, pBeforePC->getCommandStreamerStallEnable());
|
|
|
|
|
|
|
|
auto itorAfterPC = find<PIPE_CONTROL *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterPC);
|
|
|
|
auto pAfterPC = genCmdCast<PIPE_CONTROL *>(*itorAfterPC);
|
|
|
|
ASSERT_NE(nullptr, pAfterPC);
|
|
|
|
EXPECT_EQ(1u, pAfterPC->getCommandStreamerStallEnable());
|
|
|
|
|
|
|
|
EXPECT_EQ(PIPE_CONTROL::POST_SYNC_OPERATION_WRITE_TIMESTAMP, pBeforePC->getPostSyncOperation());
|
|
|
|
|
|
|
|
// expect MI_REPORT_PERF_COUNT after WALKER
|
|
|
|
auto itorAfterReportPerf = find<MI_REPORT_PERF_COUNT *>(itorGPGPUWalkerCmd, cmdList.end());
|
|
|
|
ASSERT_NE(cmdList.end(), itorAfterReportPerf);
|
|
|
|
|
|
|
|
EXPECT_TRUE(static_cast<MockEvent<Event> *>(event)->calcProfilingData());
|
|
|
|
|
|
|
|
clReleaseEvent(event);
|
|
|
|
}
|
|
|
|
|
2019-04-10 18:44:02 +08:00
|
|
|
struct MockTimestampContainer : public TimestampPacketContainer {
|
|
|
|
~MockTimestampContainer() override {
|
2019-01-21 18:44:56 +08:00
|
|
|
for (const auto &node : timestampPacketNodes) {
|
2021-03-25 02:21:13 +08:00
|
|
|
auto mockNode = static_cast<MockTagNode<TimestampPackets<uint32_t>> *>(node);
|
|
|
|
delete mockNode->tagForCpuAccess;
|
2019-01-21 18:44:56 +08:00
|
|
|
delete node;
|
|
|
|
}
|
|
|
|
timestampPacketNodes.clear();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ProfilingTimestampPacketsTest : public ::testing::Test {
|
|
|
|
void SetUp() override {
|
|
|
|
DebugManager.flags.ReturnRawGpuTimestamps.set(true);
|
|
|
|
cmdQ->setProfilingEnabled();
|
2019-04-10 18:44:02 +08:00
|
|
|
ev->timestampPacketContainer = std::make_unique<MockTimestampContainer>();
|
2019-01-21 18:44:56 +08:00
|
|
|
}
|
|
|
|
|
2021-03-22 23:14:49 +08:00
|
|
|
void addTimestampNode(uint32_t contextStart, uint32_t contextEnd, uint32_t globalStart, uint32_t globalEnd) {
|
2021-03-25 02:21:13 +08:00
|
|
|
auto node = new MockTagNode<TimestampPackets<uint32_t>>();
|
|
|
|
auto timestampPacketStorage = new TimestampPackets<uint32_t>();
|
2019-04-17 19:29:50 +08:00
|
|
|
node->tagForCpuAccess = timestampPacketStorage;
|
|
|
|
|
2021-03-22 23:14:49 +08:00
|
|
|
uint32_t values[4] = {contextStart, globalStart, contextEnd, globalEnd};
|
|
|
|
timestampPacketStorage->assignDataToAllTimestamps(0, values);
|
2019-02-08 17:27:48 +08:00
|
|
|
|
2019-01-21 18:44:56 +08:00
|
|
|
ev->timestampPacketContainer->add(node);
|
|
|
|
}
|
|
|
|
|
2021-03-22 23:14:49 +08:00
|
|
|
void addTimestampNodeMultiOsContext(uint32_t globalStart[16], uint32_t globalEnd[16], uint32_t contextStart[16], uint32_t contextEnd[16], uint32_t size) {
|
2021-03-25 02:21:13 +08:00
|
|
|
auto node = new MockTagNode<TimestampPackets<uint32_t>>();
|
|
|
|
auto timestampPacketStorage = new TimestampPackets<uint32_t>();
|
2021-07-22 23:27:05 +08:00
|
|
|
node->setPacketsUsed(size);
|
2020-05-25 22:42:28 +08:00
|
|
|
|
2021-07-22 23:27:05 +08:00
|
|
|
for (uint32_t i = 0u; i < node->getPacketsUsed(); ++i) {
|
2021-03-22 23:14:49 +08:00
|
|
|
uint32_t values[4] = {contextStart[i], globalStart[i], contextEnd[i], globalEnd[i]};
|
|
|
|
|
|
|
|
timestampPacketStorage->assignDataToAllTimestamps(i, values);
|
2020-05-25 22:42:28 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
node->tagForCpuAccess = timestampPacketStorage;
|
|
|
|
ev->timestampPacketContainer->add(node);
|
|
|
|
}
|
|
|
|
|
2021-03-22 23:14:49 +08:00
|
|
|
void initTimestampNodeMultiOsContextData(uint32_t globalStart[16], uint32_t globalEnd[16], uint32_t size) {
|
2020-05-25 22:42:28 +08:00
|
|
|
|
|
|
|
for (uint32_t i = 0u; i < size; ++i) {
|
|
|
|
globalStart[i] = 100;
|
|
|
|
}
|
|
|
|
globalStart[5] = {50};
|
|
|
|
|
|
|
|
for (uint32_t i = 0u; i < size; ++i) {
|
|
|
|
globalEnd[i] = 200;
|
|
|
|
}
|
|
|
|
globalEnd[7] = {350};
|
|
|
|
}
|
|
|
|
|
2019-01-21 18:44:56 +08:00
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
MockContext context;
|
|
|
|
cl_command_queue_properties props[5] = {0, 0, 0, 0, 0};
|
2021-07-23 18:36:36 +08:00
|
|
|
ReleaseableObjectPtr<MockCommandQueue> cmdQ = clUniquePtr(new MockCommandQueue(&context, context.getDevice(0), props, false));
|
2020-06-16 19:19:11 +08:00
|
|
|
ReleaseableObjectPtr<MockEvent<MyEvent>> ev = clUniquePtr(new MockEvent<MyEvent>(cmdQ.get(), CL_COMMAND_USER, CompletionStamp::notReady, CompletionStamp::notReady));
|
2019-01-21 18:44:56 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
TEST_F(ProfilingTimestampPacketsTest, givenTimestampsPacketContainerWithOneElementAndTimestampNodeWhenCalculatingProfilingThenTimesAreTakenFromPacket) {
|
2020-07-31 16:34:29 +08:00
|
|
|
addTimestampNode(10, 11, 12, 13);
|
2019-01-21 18:44:56 +08:00
|
|
|
|
|
|
|
HwTimeStamps hwTimestamps;
|
|
|
|
hwTimestamps.ContextStartTS = 100;
|
|
|
|
hwTimestamps.ContextEndTS = 110;
|
|
|
|
hwTimestamps.GlobalStartTS = 120;
|
2020-07-31 16:34:29 +08:00
|
|
|
|
2019-01-21 18:44:56 +08:00
|
|
|
MockTagNode<HwTimeStamps> hwTimestampsNode;
|
2019-02-08 17:27:48 +08:00
|
|
|
hwTimestampsNode.tagForCpuAccess = &hwTimestamps;
|
2019-01-21 18:44:56 +08:00
|
|
|
ev->timeStampNode = &hwTimestampsNode;
|
|
|
|
|
|
|
|
ev->calcProfilingData();
|
|
|
|
|
2020-07-31 16:34:29 +08:00
|
|
|
EXPECT_EQ(12u, ev->getStartTimeStamp());
|
|
|
|
EXPECT_EQ(13u, ev->getEndTimeStamp());
|
2019-01-21 18:44:56 +08:00
|
|
|
EXPECT_EQ(12u, ev->getGlobalStartTimestamp());
|
|
|
|
|
|
|
|
ev->timeStampNode = nullptr;
|
|
|
|
}
|
|
|
|
|
2020-05-25 22:42:28 +08:00
|
|
|
TEST_F(ProfilingTimestampPacketsTest, givenMultiOsContextCapableSetToTrueWhenCalcProfilingDataIsCalledThenCorrectedValuesAreReturned) {
|
2021-03-22 23:14:49 +08:00
|
|
|
uint32_t globalStart[16] = {0};
|
|
|
|
uint32_t globalEnd[16] = {0};
|
|
|
|
uint32_t contextStart[16] = {0};
|
|
|
|
uint32_t contextEnd[16] = {0};
|
2020-05-25 22:42:28 +08:00
|
|
|
initTimestampNodeMultiOsContextData(globalStart, globalEnd, 16u);
|
2020-05-29 19:04:11 +08:00
|
|
|
addTimestampNodeMultiOsContext(globalStart, globalEnd, contextStart, contextEnd, 16u);
|
2020-05-25 22:42:28 +08:00
|
|
|
auto &device = reinterpret_cast<MockDevice &>(cmdQ->getDevice());
|
|
|
|
auto &csr = device.getUltCommandStreamReceiver<DEFAULT_TEST_FAMILY_NAME>();
|
|
|
|
csr.multiOsContextCapable = true;
|
|
|
|
|
|
|
|
ev->calcProfilingData();
|
|
|
|
EXPECT_EQ(50u, ev->getStartTimeStamp());
|
|
|
|
EXPECT_EQ(350u, ev->getEndTimeStamp());
|
|
|
|
}
|
|
|
|
|
2020-09-29 20:35:23 +08:00
|
|
|
TEST_F(ProfilingTimestampPacketsTest, givenTimestampPacketWithoutProfilingDataWhenCalculatingThenDontUseThatPacket) {
|
2021-03-22 23:14:49 +08:00
|
|
|
uint32_t globalStart0 = 20;
|
|
|
|
uint32_t globalEnd0 = 51;
|
|
|
|
uint32_t contextStart0 = 21;
|
|
|
|
uint32_t contextEnd0 = 50;
|
2020-09-29 20:35:23 +08:00
|
|
|
|
2021-03-22 23:14:49 +08:00
|
|
|
uint32_t globalStart1 = globalStart0 - 1;
|
|
|
|
uint32_t globalEnd1 = globalEnd0 + 1;
|
|
|
|
uint32_t contextStart1 = contextStart0 - 1;
|
|
|
|
uint32_t contextEnd1 = contextEnd0 + 1;
|
2020-09-29 20:35:23 +08:00
|
|
|
|
|
|
|
addTimestampNodeMultiOsContext(&globalStart0, &globalEnd0, &contextStart0, &contextEnd0, 1);
|
|
|
|
addTimestampNodeMultiOsContext(&globalStart1, &globalEnd1, &contextStart1, &contextEnd1, 1);
|
|
|
|
auto &device = reinterpret_cast<MockDevice &>(cmdQ->getDevice());
|
|
|
|
auto &csr = device.getUltCommandStreamReceiver<DEFAULT_TEST_FAMILY_NAME>();
|
|
|
|
csr.multiOsContextCapable = true;
|
|
|
|
|
|
|
|
ev->timestampPacketContainer->peekNodes()[1]->setProfilingCapable(false);
|
|
|
|
|
|
|
|
ev->calcProfilingData();
|
|
|
|
EXPECT_EQ(static_cast<uint64_t>(globalStart0), ev->getStartTimeStamp());
|
|
|
|
EXPECT_EQ(static_cast<uint64_t>(globalEnd0), ev->getEndTimeStamp());
|
|
|
|
}
|
|
|
|
|
2020-05-29 19:04:11 +08:00
|
|
|
TEST_F(ProfilingTimestampPacketsTest, givenPrintTimestampPacketContentsSetWhenCalcProfilingDataThenTimeStampsArePrinted) {
|
|
|
|
DebugManagerStateRestore restorer;
|
|
|
|
DebugManager.flags.PrintTimestampPacketContents.set(true);
|
|
|
|
testing::internal::CaptureStdout();
|
|
|
|
|
|
|
|
auto &device = reinterpret_cast<MockDevice &>(cmdQ->getDevice());
|
|
|
|
auto &csr = device.getUltCommandStreamReceiver<DEFAULT_TEST_FAMILY_NAME>();
|
|
|
|
csr.multiOsContextCapable = true;
|
|
|
|
|
2021-03-22 23:14:49 +08:00
|
|
|
uint32_t globalStart[16] = {0};
|
|
|
|
uint32_t globalEnd[16] = {0};
|
|
|
|
uint32_t contextStart[16] = {0};
|
|
|
|
uint32_t contextEnd[16] = {0};
|
2020-05-29 19:04:11 +08:00
|
|
|
for (int i = 0; i < 16; i++) {
|
|
|
|
globalStart[i] = 2 * i;
|
|
|
|
globalEnd[i] = 500 * i;
|
|
|
|
contextStart[i] = 7 * i;
|
|
|
|
contextEnd[i] = 94 * i;
|
|
|
|
}
|
|
|
|
addTimestampNodeMultiOsContext(globalStart, globalEnd, contextStart, contextEnd, 16u);
|
|
|
|
|
|
|
|
ev->calcProfilingData();
|
|
|
|
|
|
|
|
std::string output = testing::internal::GetCapturedStdout();
|
|
|
|
std::stringstream expected;
|
2020-09-29 20:35:23 +08:00
|
|
|
|
2022-01-28 19:59:34 +08:00
|
|
|
expected << "Timestamp 0, cmd type: " << ev->getCommandType() << ", ";
|
2020-05-29 19:04:11 +08:00
|
|
|
for (int i = 0; i < 16; i++) {
|
2020-09-29 20:35:23 +08:00
|
|
|
expected << "packet " << i << ": "
|
2020-05-29 19:04:11 +08:00
|
|
|
<< "global start: " << globalStart[i] << ", "
|
|
|
|
<< "global end: " << globalEnd[i] << ", "
|
|
|
|
<< "context start: " << contextStart[i] << ", "
|
2022-01-28 19:59:34 +08:00
|
|
|
<< "context end: " << contextEnd[i] << ", "
|
|
|
|
<< "global delta: " << globalEnd[i] - globalStart[i] << ", "
|
|
|
|
<< "context delta: " << contextEnd[i] - contextStart[i] << std::endl;
|
2020-05-29 19:04:11 +08:00
|
|
|
}
|
|
|
|
EXPECT_EQ(0, output.compare(expected.str().c_str()));
|
|
|
|
}
|
|
|
|
|
2019-01-21 18:44:56 +08:00
|
|
|
TEST_F(ProfilingTimestampPacketsTest, givenTimestampsPacketContainerWithThreeElementsWhenCalculatingProfilingThenTimesAreTakenFromProperPacket) {
|
2020-07-31 16:34:29 +08:00
|
|
|
addTimestampNode(10, 11, 12, 13);
|
|
|
|
addTimestampNode(1, 21, 22, 13);
|
|
|
|
addTimestampNode(5, 31, 2, 13);
|
2019-01-21 18:44:56 +08:00
|
|
|
|
|
|
|
ev->calcProfilingData();
|
|
|
|
|
2020-07-31 16:34:29 +08:00
|
|
|
EXPECT_EQ(2u, ev->getStartTimeStamp());
|
|
|
|
EXPECT_EQ(13u, ev->getEndTimeStamp());
|
2019-01-21 18:44:56 +08:00
|
|
|
EXPECT_EQ(2u, ev->getGlobalStartTimestamp());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(ProfilingTimestampPacketsTest, givenTimestampsPacketContainerWithZeroElementsWhenCalculatingProfilingThenDataIsNotCalculated) {
|
|
|
|
EXPECT_EQ(0u, ev->timestampPacketContainer->peekNodes().size());
|
|
|
|
ev->calcProfilingData();
|
|
|
|
|
|
|
|
EXPECT_FALSE(ev->getDataCalcStatus());
|
|
|
|
}
|
2019-03-26 18:59:46 +08:00
|
|
|
} // namespace NEO
|