Skip to content

Commit 4db520a

Browse files
igchorCompute-Runtime-Automation
authored andcommitted
Implement submit_barrier benchmark
for mesuring performance of ext_oneapi_submit_barrier and ext_oneapi_get_last_event. This is in preparation for optimizing in-order queue path (we plan to stop storing last event in the queue). Signed-off-by: Igor Chorazewicz <[email protected]>
1 parent 66f9fa0 commit 4db520a

File tree

3 files changed

+165
-0
lines changed

3 files changed

+165
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright (C) 2022-2025 Intel Corporation
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*
6+
*/
7+
8+
#pragma once
9+
10+
#include "framework/argument/basic_argument.h"
11+
#include "framework/test_case/test_case.h"
12+
13+
struct SubmitBarrierArguments : TestCaseArgumentContainer {
14+
BooleanArgument useHostTasks;
15+
BooleanArgument inOrderQueue;
16+
BooleanArgument useEvents;
17+
BooleanArgument submitBarrier;
18+
BooleanArgument getLastEvent;
19+
20+
SubmitBarrierArguments()
21+
: useHostTasks(*this, "UseHostTasks", "Submit SYCL host task after kernel enqueue"),
22+
inOrderQueue(*this, "Ioq", "Create the queue with the in_order property"),
23+
useEvents(*this, "UseEvents", "Use events when enqueuing kernels. When false, SYCL will use eventless enqueue functions."),
24+
submitBarrier(*this, "SubmitBarrier", "Whether to measure ext_oneapi_submit_barrier time"),
25+
getLastEvent(*this, "GetLastEvent", "Whether to measure ext_oneapi_get_last_event time") {}
26+
};
27+
28+
struct SubmitBarrier : TestCase<SubmitBarrierArguments> {
29+
using TestCase<SubmitBarrierArguments>::TestCase;
30+
31+
std::string getTestCaseName() const override {
32+
return "SubmitBarrier";
33+
}
34+
35+
std::string getHelp() const override {
36+
return "measures time spent in submitting a barrier to a SYCL (or SYCL-like) queue on CPU and getting last event.";
37+
}
38+
};
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright (C) 2022-2025 Intel Corporation
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*
6+
*/
7+
8+
#include "definitions/submit_barrier.h"
9+
10+
#include "framework/test_case/register_test_case.h"
11+
#include "framework/utility/common_gtest_args.h"
12+
13+
#include <gtest/gtest.h>
14+
15+
[[maybe_unused]] static const inline RegisterTestCase<SubmitBarrier> registerTestCase{};
16+
17+
class SubmitBarrierTest : public ::testing::TestWithParam<std::tuple<Api, bool, bool, bool, bool>> {
18+
};
19+
20+
TEST_P(SubmitBarrierTest, Test) {
21+
SubmitBarrierArguments args{};
22+
args.api = std::get<0>(GetParam());
23+
args.inOrderQueue = std::get<1>(GetParam());
24+
args.useEvents = std::get<2>(GetParam());
25+
args.submitBarrier = std::get<3>(GetParam());
26+
args.getLastEvent = std::get<4>(GetParam());
27+
SubmitBarrier test;
28+
test.run(args);
29+
}
30+
31+
INSTANTIATE_TEST_SUITE_P(
32+
SubmitBarrierTest,
33+
SubmitBarrierTest,
34+
::testing::Combine(
35+
::CommonGtestArgs::allApis(),
36+
::testing::Values(false, true), // inOrderQueue
37+
::testing::Values(false, true), // useEvents
38+
::testing::Values(false, true), // submitBarrier
39+
::testing::Values(false, true))); // getLastEvent
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* Copyright (C) 2023-2025 Intel Corporation
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*
6+
*/
7+
8+
#include "framework/test_case/register_test_case.h"
9+
#include "framework/utility/timer.h"
10+
11+
#include "definitions/submit_barrier.h"
12+
13+
#include <sycl/sycl.hpp>
14+
15+
static TestResult run(const SubmitBarrierArguments &arguments, Statistics &statistics) {
16+
MeasurementFields typeSelector(MeasurementUnit::Microseconds, MeasurementType::Cpu);
17+
18+
if (isNoopRun() || (arguments.getLastEvent && !arguments.inOrderQueue)) {
19+
statistics.pushUnitAndType(typeSelector.getUnit(), typeSelector.getType());
20+
return TestResult::Nooped;
21+
}
22+
23+
// Setup
24+
sycl::queue queue{arguments.inOrderQueue ? sycl::property_list{sycl::property::queue::in_order()} : sycl::property_list{}};
25+
26+
Timer timer;
27+
const size_t gws = 1u;
28+
const size_t lws = 1u;
29+
sycl::nd_range<1> range(gws, lws);
30+
31+
// Create kernel
32+
int kernelOperationsCount = 10000;
33+
const auto eat_time = [=]([[maybe_unused]] auto u) {
34+
if (kernelOperationsCount > 4) {
35+
volatile int value = kernelOperationsCount;
36+
while (--value)
37+
;
38+
}
39+
};
40+
41+
// Warmup
42+
for (auto iteration = 0u; iteration < 10; iteration++) {
43+
queue.parallel_for(range, eat_time);
44+
45+
if (arguments.submitBarrier) {
46+
queue.ext_oneapi_submit_barrier();
47+
}
48+
49+
if (arguments.getLastEvent) {
50+
queue.ext_oneapi_get_last_event();
51+
}
52+
}
53+
queue.wait();
54+
55+
// Benchmark
56+
for (auto i = 0u; i < arguments.iterations; i++) {
57+
if (!arguments.useEvents) {
58+
sycl::ext::oneapi::experimental::nd_launch(queue, range, eat_time);
59+
} else {
60+
queue.parallel_for(range, eat_time);
61+
}
62+
63+
if (arguments.useHostTasks) {
64+
queue.submit([&](sycl::handler &cgh) {
65+
cgh.host_task([=]() { eat_time(0); });
66+
});
67+
}
68+
69+
timer.measureStart();
70+
71+
if (arguments.submitBarrier) {
72+
queue.ext_oneapi_submit_barrier();
73+
}
74+
75+
if (arguments.getLastEvent) {
76+
queue.ext_oneapi_get_last_event();
77+
}
78+
79+
timer.measureEnd();
80+
81+
statistics.pushValue(timer.get(), typeSelector.getUnit(), typeSelector.getType());
82+
}
83+
queue.wait();
84+
85+
return TestResult::Success;
86+
}
87+
88+
[[maybe_unused]] static RegisterTestCaseImplementation<SubmitBarrier> registerTestCase(run, Api::SYCL);

0 commit comments

Comments
 (0)