Skip to content

Commit ee4864f

Browse files
authored
Merge pull request #1852 from igchor/program_build_fix
[L0] Use all devices from a context in urProgramBuild
2 parents ea31b3e + 3f4d574 commit ee4864f

File tree

3 files changed

+105
-3
lines changed

3 files changed

+105
-3
lines changed

source/adapters/level_zero/program.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramBuild(
114114
const char *Options ///< [in][optional] pointer to build options
115115
///< null-terminated string.
116116
) {
117-
return urProgramBuildExp(Program, 1, Context->Devices.data(), Options);
117+
return urProgramBuildExp(Program, Context->Devices.size(),
118+
Context->Devices.data(), Options);
118119
}
119120

120121
UR_APIEXPORT ur_result_t UR_APICALL urProgramBuildExp(
@@ -283,8 +284,9 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramLink(
283284
ur_program_handle_t
284285
*Program ///< [out] pointer to handle of program object created.
285286
) {
286-
return urProgramLinkExp(Context, Count, Context->Devices.data(), 1, Programs,
287-
Options, Program);
287+
return urProgramLinkExp(Context, Context->Devices.size(),
288+
Context->Devices.data(), Count, Programs, Options,
289+
Program);
288290
}
289291

290292
UR_APIEXPORT ur_result_t UR_APICALL urProgramLinkExp(

test/conformance/kernel/urKernelCreate.cpp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
55

66
#include <uur/fixtures.h>
7+
#include <uur/raii.h>
78

89
struct urKernelCreateTest : uur::urProgramTest {
910
void SetUp() override {
@@ -51,3 +52,81 @@ TEST_P(urKernelCreateTest, InvalidKernelName) {
5152
ASSERT_EQ_RESULT(UR_RESULT_ERROR_INVALID_KERNEL_NAME,
5253
urKernelCreate(program, invalid_name.data(), &kernel));
5354
}
55+
56+
using urMultiDeviceKernelCreateTest = uur::urMultiDeviceQueueTest;
57+
58+
TEST_F(urMultiDeviceKernelCreateTest, WithProgramBuild) {
59+
constexpr size_t global_offset = 0;
60+
constexpr size_t n_dimensions = 1;
61+
constexpr size_t global_size = 100;
62+
constexpr size_t local_size = 100;
63+
64+
auto kernelName =
65+
uur::KernelsEnvironment::instance->GetEntryPointNames("foo")[0];
66+
67+
std::shared_ptr<std::vector<char>> il_binary;
68+
uur::KernelsEnvironment::instance->LoadSource("foo", il_binary);
69+
70+
auto &devices = uur::KernelsEnvironment::instance->devices;
71+
for (size_t i = 0; i < devices.size(); i++) {
72+
uur::raii::Program program;
73+
uur::raii::Kernel kernel;
74+
75+
const ur_program_properties_t properties = {
76+
UR_STRUCTURE_TYPE_PROGRAM_PROPERTIES, nullptr, 0, nullptr};
77+
ASSERT_SUCCESS(uur::KernelsEnvironment::instance->CreateProgram(
78+
platform, context, devices[i], *il_binary, &properties,
79+
program.ptr()));
80+
81+
ASSERT_SUCCESS(urProgramBuild(context, program.get(), nullptr));
82+
ASSERT_SUCCESS(
83+
urKernelCreate(program.get(), kernelName.data(), kernel.ptr()));
84+
85+
ASSERT_SUCCESS(urEnqueueKernelLaunch(
86+
queues[i], kernel.get(), n_dimensions, &global_offset, &local_size,
87+
&global_size, 0, nullptr, nullptr));
88+
89+
ASSERT_SUCCESS(urQueueFinish(queues[i]));
90+
}
91+
}
92+
93+
TEST_F(urMultiDeviceKernelCreateTest, WithProgramCompileAndLink) {
94+
constexpr size_t global_offset = 0;
95+
constexpr size_t n_dimensions = 1;
96+
constexpr size_t global_size = 100;
97+
constexpr size_t local_size = 100;
98+
99+
auto kernelName =
100+
uur::KernelsEnvironment::instance->GetEntryPointNames("foo")[0];
101+
102+
std::shared_ptr<std::vector<char>> il_binary;
103+
uur::KernelsEnvironment::instance->LoadSource("foo", il_binary);
104+
105+
auto &devices = uur::KernelsEnvironment::instance->devices;
106+
for (size_t i = 0; i < devices.size(); i++) {
107+
uur::raii::Program program;
108+
uur::raii::Kernel kernel;
109+
110+
const ur_program_properties_t properties = {
111+
UR_STRUCTURE_TYPE_PROGRAM_PROPERTIES, nullptr, 0, nullptr};
112+
ASSERT_SUCCESS(uur::KernelsEnvironment::instance->CreateProgram(
113+
platform, context, devices[i], *il_binary, &properties,
114+
program.ptr()));
115+
116+
ASSERT_SUCCESS(urProgramCompile(context, program.get(), nullptr));
117+
118+
uur::raii::Program linked_program;
119+
ASSERT_EQ_RESULT(UR_RESULT_SUCCESS,
120+
urProgramLink(context, 1, program.ptr(), nullptr,
121+
linked_program.ptr()));
122+
123+
ASSERT_SUCCESS(urKernelCreate(linked_program.get(), kernelName.data(),
124+
kernel.ptr()));
125+
126+
ASSERT_SUCCESS(urEnqueueKernelLaunch(
127+
queues[i], kernel.get(), n_dimensions, &global_offset, &local_size,
128+
&global_size, 0, nullptr, nullptr));
129+
130+
ASSERT_SUCCESS(urQueueFinish(queues[i]));
131+
}
132+
}

test/conformance/testing/include/uur/fixtures.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1500,6 +1500,27 @@ struct urGlobalVariableTest : uur::urKernelExecutionTest {
15001500
GlobalVar<int> global_var;
15011501
};
15021502

1503+
struct urMultiDeviceQueueTest : urMultiDeviceContextTest {
1504+
void SetUp() override {
1505+
UUR_RETURN_ON_FATAL_FAILURE(urMultiDeviceContextTest::SetUp());
1506+
queues.reserve(DevicesEnvironment::instance->devices.size());
1507+
for (const auto &device : DevicesEnvironment::instance->devices) {
1508+
ur_queue_handle_t queue = nullptr;
1509+
ASSERT_SUCCESS(urQueueCreate(context, device, 0, &queue));
1510+
queues.push_back(queue);
1511+
}
1512+
}
1513+
1514+
void TearDown() override {
1515+
for (const auto &queue : queues) {
1516+
EXPECT_SUCCESS(urQueueRelease(queue));
1517+
}
1518+
UUR_RETURN_ON_FATAL_FAILURE(urMultiDeviceContextTest::TearDown());
1519+
}
1520+
1521+
std::vector<ur_queue_handle_t> queues;
1522+
};
1523+
15031524
} // namespace uur
15041525

15051526
#endif // UR_CONFORMANCE_INCLUDE_FIXTURES_H_INCLUDED

0 commit comments

Comments
 (0)