Skip to content

Commit c10baa8

Browse files
rebleCompute-Runtime-Automation
authored andcommitted
Adding UR submit graph test
Signed-off-by: Pablo Reble <[email protected]>
1 parent cef1d17 commit c10baa8

File tree

1 file changed

+128
-0
lines changed

1 file changed

+128
-0
lines changed
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
/*
2+
* Copyright (C) 2024-2025 Intel Corporation
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*
6+
*/
7+
8+
#include "framework/test_case/register_test_case.h"
9+
#include "framework/ur/error.h"
10+
#include "framework/ur/ur.h"
11+
#include "framework/utility/file_helper.h"
12+
#include "framework/utility/timer.h"
13+
14+
#include "definitions/submit_graph.h"
15+
16+
#include <iostream>
17+
#include <ur_api.h>
18+
19+
static constexpr size_t n_dimensions = 3;
20+
static constexpr size_t global_size[] = {1, 1, 1};
21+
static constexpr size_t local_size[] = {1, 1, 1};
22+
static constexpr size_t global_offset = 0;
23+
24+
static TestResult run([[maybe_unused]] const SubmitGraphArguments &arguments, Statistics &statistics) {
25+
26+
MeasurementFields typeSelector(MeasurementUnit::Microseconds, MeasurementType::Cpu);
27+
28+
if (isNoopRun()) {
29+
statistics.pushUnitAndType(typeSelector.getUnit(), typeSelector.getType());
30+
return TestResult::Nooped;
31+
}
32+
33+
UrState ur;
34+
35+
// check if the device supports command buffers
36+
ur_bool_t command_buffer_support = false;
37+
EXPECT_UR_RESULT_SUCCESS(urDeviceGetInfo(
38+
ur.device, UR_DEVICE_INFO_COMMAND_BUFFER_SUPPORT_EXP,
39+
sizeof(command_buffer_support), &command_buffer_support, nullptr));
40+
if (!command_buffer_support) {
41+
return TestResult::DeviceNotCapable;
42+
}
43+
44+
Timer timer;
45+
46+
// Create kernel
47+
auto spirvModule = FileHelper::loadBinaryFile("api_overhead_benchmark_eat_time.spv");
48+
if (spirvModule.size() == 0)
49+
return TestResult::KernelNotFound;
50+
51+
ur_program_handle_t program;
52+
EXPECT_UR_RESULT_SUCCESS(urProgramCreateWithIL(ur.context, spirvModule.data(),
53+
spirvModule.size(), nullptr, &program));
54+
55+
EXPECT_UR_RESULT_SUCCESS(urProgramBuild(ur.context, program, nullptr));
56+
57+
const char *kernelName = "eat_time";
58+
59+
ur_kernel_handle_t kernel;
60+
EXPECT_UR_RESULT_SUCCESS(urKernelCreate(program, kernelName, &kernel));
61+
62+
ur_queue_handle_t queue;
63+
ur_queue_properties_t queueProperties = {};
64+
65+
auto inOrder = arguments.inOrderQueue;
66+
if (!inOrder) {
67+
queueProperties.flags = UR_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE;
68+
}
69+
70+
EXPECT_UR_RESULT_SUCCESS(urQueueCreate(ur.context, ur.device,
71+
&queueProperties, &queue));
72+
73+
ur_exp_command_buffer_handle_t cmdBuffer = nullptr;
74+
75+
// Finalize the graph
76+
ur_exp_command_buffer_desc_t cmdBufferDesc = {
77+
UR_STRUCTURE_TYPE_EXP_COMMAND_BUFFER_DESC,
78+
nullptr, // pNext
79+
false, // isUpdatable
80+
inOrder, // isInOrder
81+
false // enableProfiling
82+
};
83+
84+
EXPECT_UR_RESULT_SUCCESS(urCommandBufferCreateExp(
85+
ur.context, ur.device, &cmdBufferDesc, &cmdBuffer));
86+
for (auto i = 0u; i < arguments.numKernels; i++) {
87+
EXPECT_UR_RESULT_SUCCESS(urCommandBufferAppendKernelLaunchExp(
88+
cmdBuffer, kernel, n_dimensions, &global_offset, global_size,
89+
nullptr, 0, nullptr, 0, nullptr, 0, nullptr,
90+
nullptr, nullptr, nullptr));
91+
}
92+
93+
EXPECT_UR_RESULT_SUCCESS(urCommandBufferFinalizeExp(
94+
cmdBuffer));
95+
96+
// Warmup
97+
EXPECT_UR_RESULT_SUCCESS(
98+
urEnqueueCommandBufferExp(queue, cmdBuffer, 0, nullptr, nullptr));
99+
EXPECT_UR_RESULT_SUCCESS(urQueueFinish(queue));
100+
101+
// Benchmark
102+
for (auto i = 0u; i < arguments.iterations; i++) {
103+
timer.measureStart();
104+
105+
EXPECT_UR_RESULT_SUCCESS(
106+
urEnqueueCommandBufferExp(queue, cmdBuffer, 0, nullptr, nullptr));
107+
108+
if (!arguments.measureCompletionTime) {
109+
timer.measureEnd();
110+
}
111+
112+
EXPECT_UR_RESULT_SUCCESS(urQueueFinish(queue));
113+
114+
if (arguments.measureCompletionTime) {
115+
timer.measureEnd();
116+
}
117+
statistics.pushValue(timer.get(), typeSelector.getUnit(), typeSelector.getType());
118+
}
119+
120+
EXPECT_UR_RESULT_SUCCESS(urCommandBufferReleaseExp(cmdBuffer));
121+
EXPECT_UR_RESULT_SUCCESS(urQueueRelease(queue));
122+
EXPECT_UR_RESULT_SUCCESS(urKernelRelease(kernel));
123+
EXPECT_UR_RESULT_SUCCESS(urProgramRelease(program));
124+
125+
return TestResult::Success;
126+
}
127+
128+
[[maybe_unused]] static RegisterTestCaseImplementation<SubmitGraph> registerTestCase(run, Api::UR);

0 commit comments

Comments
 (0)