Skip to content

Commit 32527cc

Browse files
fix: CTS bugs in Sysman Device module (#69)
* fix: CTS bugs in Sysman Device module Related-To: VLCLJ-2272 Signed-off-by: Vishnu Khanth <[email protected]> * fix: CTS bugs in Sysman Device module Related-To: VLCLJ-2272 Signed-off-by: Vishnu Khanth <[email protected]> * fix: CTS bugs in Sysman Device module Related-To: VLCLJ-2272 Signed-off-by: Vishnu Khanth <[email protected]> * fix: CTS bugs in Sysman Device module Related-To: VLCLJ-2272 Signed-off-by: Vishnu Khanth <[email protected]> * fix: CTS bugs in Sysman Device module Related-To: VLCLJ-2272 Signed-off-by: Vishnu Khanth <[email protected]> * fix: CTS bugs in Sysman Device module Related-To: VLCLJ-2272 Signed-off-by: Vishnu Khanth <[email protected]> * fix: CTS bugs in Sysman Device module Related-To: VLCLJ-2272 Signed-off-by: Vishnu Khanth <[email protected]> * fix: CTS bugs in Sysman Device module Related-To: VLCLJ-2272 Signed-off-by: Vishnu Khanth <[email protected]> * fix: CTS bugs in Sysman Device module Related-To: VLCLJ-2272 Signed-off-by: Vishnu Khanth <[email protected]> * fix: CTS bugs in Sysman Device module Related-To: VLCLJ-2272 Signed-off-by: Vishnu Khanth <[email protected]> --------- Signed-off-by: Vishnu Khanth <[email protected]>
1 parent 27885ef commit 32527cc

File tree

1 file changed

+90
-47
lines changed

1 file changed

+90
-47
lines changed

conformance_tests/sysman/test_sysman_device/src/test_sysman_device.cpp

Lines changed: 90 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include <boost/process.hpp>
1616
#include <boost/filesystem.hpp>
17+
#include <thread>
1718

1819
namespace bp = boost::process;
1920
namespace fs = boost::filesystem;
@@ -24,11 +25,9 @@ namespace lzt = level_zero_tests;
2425

2526
namespace {
2627

27-
struct workload_thread_parameters {
28-
ze_device_handle_t device;
29-
std::mutex device_mutex;
30-
std::condition_variable condition;
31-
bool get_process_state_flag;
28+
struct device_handles_t {
29+
ze_device_handle_t core_handle;
30+
zes_device_handle_t sysman_handle;
3231
};
3332

3433
uint32_t get_prop_length(char prop[ZES_STRING_PROPERTY_SIZE]) {
@@ -538,7 +537,33 @@ ze_device_handle_t get_core_device_by_uuid(uint8_t *uuid) {
538537
}
539538
#endif // USE_ZESINIT
540539

541-
void compute_workload(workload_thread_parameters *t_params) {
540+
bool is_compute_engine_used(int pid, zes_device_handle_t device) {
541+
uint32_t count = 0;
542+
auto processes = lzt::get_processes_state(device, count);
543+
544+
for (const auto &process : processes) {
545+
if (process.processId == pid &&
546+
process.engines == ZES_ENGINE_TYPE_FLAG_COMPUTE) {
547+
return true;
548+
}
549+
}
550+
return false;
551+
}
552+
553+
bool validate_engine_type(ze_event_handle_t event,
554+
zes_device_handle_t sysman_device) {
555+
bool is_compute_engine = false;
556+
int process_id = getpid();
557+
558+
do {
559+
is_compute_engine = is_compute_engine_used(process_id, sysman_device);
560+
} while (zeEventQueryStatus(event) != ZE_RESULT_SUCCESS &&
561+
!is_compute_engine);
562+
563+
return is_compute_engine;
564+
}
565+
566+
bool compute_workload_and_validate(device_handles_t device) {
542567

543568
int m, k, n;
544569
m = k = n = 512;
@@ -547,15 +572,17 @@ void compute_workload(workload_thread_parameters *t_params) {
547572
std::vector<float> b(k * n, 1);
548573
std::vector<float> c(m * n, 0);
549574

550-
ze_device_handle_t device = t_params->device;
551-
void *a_buffer = lzt::allocate_device_memory(
552-
m * k * sizeof(float), 1, 0, device, lzt::get_default_context());
553-
void *b_buffer = lzt::allocate_device_memory(
554-
k * n * sizeof(float), 1, 0, device, lzt::get_default_context());
555-
void *c_buffer = lzt::allocate_device_memory(
556-
m * n * sizeof(float), 1, 0, device, lzt::get_default_context());
575+
void *a_buffer = lzt::allocate_device_memory(m * k * sizeof(float), 1, 0,
576+
device.core_handle,
577+
lzt::get_default_context());
578+
void *b_buffer = lzt::allocate_device_memory(k * n * sizeof(float), 1, 0,
579+
device.core_handle,
580+
lzt::get_default_context());
581+
void *c_buffer = lzt::allocate_device_memory(m * n * sizeof(float), 1, 0,
582+
device.core_handle,
583+
lzt::get_default_context());
557584
ze_module_handle_t module =
558-
lzt::create_module(device, "sysman_matrix_multiplication.spv",
585+
lzt::create_module(device.core_handle, "sysman_matrix_multiplication.spv",
559586
ZE_MODULE_FORMAT_IL_SPIRV, nullptr, nullptr);
560587
ze_kernel_handle_t function =
561588
lzt::create_function(module, "sysman_matrix_multiplication");
@@ -566,7 +593,8 @@ void compute_workload(workload_thread_parameters *t_params) {
566593
lzt::set_argument_value(function, 3, sizeof(k), &k);
567594
lzt::set_argument_value(function, 4, sizeof(n), &n);
568595
lzt::set_argument_value(function, 5, sizeof(c_buffer), &c_buffer);
569-
ze_command_list_handle_t cmd_list = lzt::create_command_list(device);
596+
ze_command_list_handle_t cmd_list =
597+
lzt::create_command_list(device.core_handle);
570598
lzt::append_memory_copy(cmd_list, a_buffer, a.data(), lzt::size_in_bytes(a),
571599
nullptr);
572600
lzt::append_barrier(cmd_list, nullptr, 0, nullptr);
@@ -581,26 +609,57 @@ void compute_workload(workload_thread_parameters *t_params) {
581609
tg.groupCountY = group_count_y;
582610
tg.groupCountZ = 1;
583611

584-
zeCommandListAppendLaunchKernel(cmd_list, function, &tg, nullptr, 0, nullptr);
612+
// events creation
613+
ze_event_pool_handle_t event_pool = lzt::create_event_pool(
614+
lzt::get_default_context(), 2, ZE_EVENT_POOL_FLAG_HOST_VISIBLE);
615+
616+
ze_event_handle_t start_event, end_event;
617+
ze_event_desc_t event_desc = {ZE_STRUCTURE_TYPE_EVENT_DESC, nullptr, 0,
618+
ZE_EVENT_SCOPE_FLAG_DEVICE,
619+
ZE_EVENT_SCOPE_FLAG_HOST};
620+
621+
start_event = lzt::create_event(event_pool, event_desc);
622+
event_desc.index = 1;
623+
end_event = lzt::create_event(event_pool, event_desc);
624+
625+
lzt::append_signal_event(cmd_list, start_event);
626+
627+
for (int i = 0; i < 20; ++i) {
628+
lzt::append_launch_function(cmd_list, function, &tg, nullptr, 0, nullptr);
629+
}
630+
631+
lzt::append_signal_event(cmd_list, end_event);
632+
585633
lzt::append_barrier(cmd_list, nullptr, 0, nullptr);
586634
lzt::close_command_list(cmd_list);
587-
ze_command_queue_handle_t cmd_q = lzt::create_command_queue(device);
635+
ze_command_queue_handle_t cmd_q =
636+
lzt::create_command_queue(device.core_handle);
588637

589-
uint32_t number_iterations = 100;
590-
while (number_iterations--) {
591-
lzt::execute_command_lists(cmd_q, 1, &cmd_list, nullptr);
592-
lzt::synchronize(cmd_q, UINT64_MAX);
593-
t_params->get_process_state_flag = true;
594-
t_params->condition.notify_one();
595-
}
638+
lzt::execute_command_lists(cmd_q, 1, &cmd_list, nullptr);
639+
640+
lzt::event_host_synchronize(start_event,
641+
std::numeric_limits<uint64_t>::max());
642+
643+
// validating engine type between two events
644+
auto is_compute_engine =
645+
validate_engine_type(end_event, device.sysman_handle);
646+
647+
lzt::event_host_synchronize(end_event, std::numeric_limits<uint64_t>::max());
648+
649+
lzt::synchronize(cmd_q, UINT64_MAX);
596650

651+
lzt::destroy_event(start_event);
652+
lzt::destroy_event(end_event);
653+
lzt::destroy_event_pool(event_pool);
597654
lzt::destroy_command_queue(cmd_q);
598655
lzt::destroy_command_list(cmd_list);
599656
lzt::destroy_function(function);
600657
lzt::free_memory(a_buffer);
601658
lzt::free_memory(b_buffer);
602659
lzt::free_memory(c_buffer);
603660
lzt::destroy_module(module);
661+
662+
return is_compute_engine;
604663
}
605664

606665
TEST_F(
@@ -659,37 +718,21 @@ TEST_F(
659718

660719
for (auto device : devices) {
661720

662-
workload_thread_parameters t_params;
663-
t_params.get_process_state_flag = false;
664-
721+
device_handles_t device_handle{};
665722
#ifdef USE_ZESINIT
666723
auto sysman_device_properties = lzt::get_sysman_device_properties(device);
667724
ze_device_handle_t core_device =
668725
get_core_device_by_uuid(sysman_device_properties.core.uuid.id);
669726
EXPECT_NE(core_device, nullptr);
670-
t_params.device = core_device;
671-
std::thread thread(compute_workload, &t_params);
727+
device_handle.core_handle = core_device;
728+
device_handle.sysman_handle = device;
672729
#else // USE_ZESINIT
673-
t_params.device = device;
674-
std::thread thread(compute_workload, &t_params);
730+
device_handle.core_handle = device;
731+
device_handle.sysman_handle = device;
675732
#endif // USE_ZESINIT
676733

677-
uint32_t count = 0;
678-
std::unique_lock<std::mutex> locker(t_params.device_mutex);
679-
t_params.condition.wait(locker,
680-
[&] { return t_params.get_process_state_flag; });
681-
682-
uint32_t engine_type = 0;
683-
while (engine_type != ZES_ENGINE_TYPE_FLAG_COMPUTE) {
684-
auto processes = lzt::get_processes_state(device, count);
685-
for (auto process : processes) {
686-
engine_type = process.engines;
687-
}
688-
processes.clear();
689-
}
690-
691-
thread.join();
692-
EXPECT_EQ(engine_type, ZES_ENGINE_TYPE_FLAG_COMPUTE);
734+
bool is_success = compute_workload_and_validate(device_handle);
735+
EXPECT_TRUE(is_success);
693736
}
694737
}
695738

0 commit comments

Comments
 (0)