Skip to content

Commit 3f4d574

Browse files
committed
[L0] Fix urProgramLink
Similarly as in urProgramBuild, all devices from the context should be used. Also, parameters to urProgramLinkExpr were passed in wrong order (number of program handles and number of devices were switched).
1 parent 3bda2c9 commit 3f4d574

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

source/adapters/level_zero/program.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,8 +284,9 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramLink(
284284
ur_program_handle_t
285285
*Program ///< [out] pointer to handle of program object created.
286286
) {
287-
return urProgramLinkExp(Context, Count, Context->Devices.data(), 1, Programs,
288-
Options, Program);
287+
return urProgramLinkExp(Context, Context->Devices.size(),
288+
Context->Devices.data(), Count, Programs, Options,
289+
Program);
289290
}
290291

291292
UR_APIEXPORT ur_result_t UR_APICALL urProgramLinkExp(

test/conformance/kernel/urKernelCreate.cpp

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ TEST_P(urKernelCreateTest, InvalidKernelName) {
5555

5656
using urMultiDeviceKernelCreateTest = uur::urMultiDeviceQueueTest;
5757

58-
TEST_F(urMultiDeviceKernelCreateTest, Success) {
58+
TEST_F(urMultiDeviceKernelCreateTest, WithProgramBuild) {
5959
constexpr size_t global_offset = 0;
6060
constexpr size_t n_dimensions = 1;
6161
constexpr size_t global_size = 100;
@@ -89,3 +89,44 @@ TEST_F(urMultiDeviceKernelCreateTest, Success) {
8989
ASSERT_SUCCESS(urQueueFinish(queues[i]));
9090
}
9191
}
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+
}

0 commit comments

Comments
 (0)