Skip to content

Commit 1ee85ba

Browse files
committed
Passing link and compile options done
1 parent 9bcca3a commit 1ee85ba

File tree

2 files changed

+145
-44
lines changed

2 files changed

+145
-44
lines changed

sycl/source/detail/program_manager/program_manager.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1621,13 +1621,11 @@ ProgramManager::compile(const device_image_plain &DeviceImage,
16211621

16221622
const RTDeviceBinaryImage *ImgPtr = InputImpl->get_bin_image_ref();
16231623
const RTDeviceBinaryImage &Img = *ImgPtr;
1624-
16251624
const char* compileOptions = Img.getCompileOptions();
1626-
16271625
RT::PiResult Error = Plugin.call_nocheck<PiApiKind::piProgramCompile>(
16281626
ObjectImpl->get_program_ref(), /*num devices=*/Devs.size(),
16291627
PIDevices.data(),
1630-
/*options=*/compileOptions, // make it done
1628+
compileOptions,
16311629
/*num_input_headers=*/0, /*input_headers=*/nullptr,
16321630
/*header_include_names=*/nullptr,
16331631
/*pfn_notify=*/nullptr, /*user_data*/ nullptr);
@@ -1666,13 +1664,13 @@ ProgramManager::link(const std::vector<device_image_plain> &DeviceImages,
16661664
}
16671665
std::string linkOptionsStr;
16681666
for (auto str : linkOptions) {
1669-
if (str && (linkOptionsStr.find(str) == std::string::npos)) {
1670-
linkOptionsStr += static_cast<std::string>(str) + " ";
1667+
if (str != nullptr) {
1668+
linkOptionsStr += std::string(str) + " ";
16711669
}
16721670
}
1671+
linkOptionsStr.pop_back();
16731672
const context &Context = getSyclObjImpl(DeviceImages[0])->get_context();
16741673
const ContextImplPtr ContextImpl = getSyclObjImpl(Context);
1675-
16761674
const detail::plugin &Plugin = ContextImpl->getPlugin();
16771675

16781676
RT::PiProgram LinkedProg = nullptr;
Lines changed: 141 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
#include <CL/sycl.hpp>
32

43
#include <helpers/CommonRedefinitions.hpp>
@@ -10,7 +9,7 @@
109
std::string current_link_options, current_compile_options;
1110

1211
class EAMTestKernel;
13-
const char EAMTestKernelName[] = "EAMTestKernel";
12+
const char EAMTestKernelName[] = "LinkCompileTestKernel";
1413
constexpr unsigned EAMTestKernelNumArgs = 4;
1514

1615
__SYCL_INLINE_NAMESPACE(cl) {
@@ -33,7 +32,8 @@ template <> struct KernelInfo<EAMTestKernel> {
3332
} // __SYCL_INLINE_NAMESPACE(cl)
3433

3534
template <typename T>
36-
static sycl::unittest::PiImage generateEAMTestKernelImage(std::string _cmplOptions = "", std::string _lnkOptions = "") {
35+
static sycl::unittest::PiImage
36+
generateEAMTestKernelImage(std::string _cmplOptions, std::string _lnkOptions) {
3737
using namespace sycl::unittest;
3838

3939
std::vector<unsigned char> KernelEAM{0b00000101};
@@ -51,62 +51,165 @@ static sycl::unittest::PiImage generateEAMTestKernelImage(std::string _cmplOptio
5151

5252
PiImage Img{PI_DEVICE_BINARY_TYPE_SPIRV, // Format
5353
__SYCL_PI_DEVICE_BINARY_TARGET_SPIRV64, // DeviceTargetSpec
54-
_cmplOptions, // Compile options
55-
_lnkOptions, // Link options
54+
_cmplOptions, // Compile options
55+
_lnkOptions, // Link options
5656
std::move(Bin),
5757
std::move(Entries),
5858
std::move(PropSet)};
59-
6059
return Img;
6160
}
6261

63-
6462
inline pi_result redefinedProgramLink(pi_context, pi_uint32, const pi_device *,
65-
const char * _linkOpts, pi_uint32,
63+
const char *_linkOpts, pi_uint32,
6664
const pi_program *,
6765
void (*)(pi_program, void *), void *,
6866
pi_program *) {
6967
assert(_linkOpts != nullptr);
7068
current_link_options = std::string(_linkOpts);
71-
std::cout << "Passed link options --> " << _linkOpts << std::endl;
69+
std::cout << "Passed link options --> '" << _linkOpts << "'" << std::endl;
7270
return PI_SUCCESS;
7371
}
7472

7573
inline pi_result redefinedProgramCompile(pi_program, pi_uint32,
76-
const pi_device *, const char * _compileOpts,
77-
pi_uint32, const pi_program *,
78-
const char **,
74+
const pi_device *,
75+
const char *_compileOpts, pi_uint32,
76+
const pi_program *, const char **,
7977
void (*)(pi_program, void *), void *) {
8078
assert(_compileOpts != nullptr);
8179
current_compile_options = std::string(_compileOpts);
82-
std::cout << "Passed compile options --> " << _compileOpts << std::endl;
80+
std::cout << "Passed compile options --> '" << _compileOpts << "'"
81+
<< std::endl;
8382
return PI_SUCCESS;
8483
}
8584

8685
TEST(Link_Compile_Options, compile_link_Options_Test_empty) {
87-
sycl::platform Plt{sycl::default_selector()};
88-
sycl::unittest::PiMock Mock{Plt};
89-
setupDefaultMockAPIs(Mock);
90-
Mock.redefine<sycl::detail::PiApiKind::piProgramCompile>(redefinedProgramCompile);
91-
Mock.redefine<sycl::detail::PiApiKind::piProgramLink>(redefinedProgramLink);
92-
93-
const sycl::device Dev = Plt.get_devices()[0];
94-
95-
current_link_options.clear();
96-
current_compile_options.clear();
97-
std::string expected_compile_options = "";
98-
std::string expected_link_options = "";
99-
static sycl::unittest::PiImage DevImage = generateEAMTestKernelImage<EAMTestKernel>(expected_compile_options, expected_link_options);
100-
auto KernelID = sycl::get_kernel_id<EAMTestKernel>();
101-
102-
sycl::queue Queue{Dev};
103-
104-
const sycl::context Ctx = Queue.get_context();
105-
sycl::kernel_bundle KernelBundle =
106-
sycl::get_kernel_bundle<sycl::bundle_state::input>(Ctx, {Dev}, {KernelID});
107-
108-
auto BundleObj = sycl::compile(KernelBundle);
109-
sycl::link(BundleObj);
110-
EXPECT_EQ(expected_link_options, current_link_options);
111-
EXPECT_EQ(expected_compile_options + " ", current_compile_options);
86+
sycl::platform Plt{sycl::default_selector()};
87+
sycl::unittest::PiMock Mock{Plt};
88+
setupDefaultMockAPIs(Mock);
89+
Mock.redefine<sycl::detail::PiApiKind::piProgramCompile>(
90+
redefinedProgramCompile);
91+
Mock.redefine<sycl::detail::PiApiKind::piProgramLink>(redefinedProgramLink);
92+
93+
const sycl::device Dev = Plt.get_devices()[0];
94+
95+
current_link_options.clear();
96+
current_compile_options.clear();
97+
std::string expected_compile_options = "";
98+
std::string expected_link_options = "";
99+
static sycl::unittest::PiImage DevImage =
100+
generateEAMTestKernelImage<EAMTestKernel>(expected_compile_options,
101+
expected_link_options);
102+
static sycl::unittest::PiImageArray<1> DevImageArray{&DevImage};
103+
auto KernelID = sycl::get_kernel_id<EAMTestKernel>();
104+
105+
sycl::queue Queue{Dev};
106+
107+
const sycl::context Ctx = Queue.get_context();
108+
sycl::kernel_bundle KernelBundle =
109+
sycl::get_kernel_bundle<sycl::bundle_state::input>(Ctx, {Dev},
110+
{KernelID});
111+
112+
auto BundleObj = sycl::compile(KernelBundle);
113+
sycl::link(BundleObj);
114+
EXPECT_EQ(expected_link_options, current_link_options);
115+
EXPECT_EQ(expected_compile_options, current_compile_options);
116+
}
117+
118+
TEST(Link_Compile_Options, one_link_option_Test) {
119+
sycl::platform Plt{sycl::default_selector()};
120+
sycl::unittest::PiMock Mock{Plt};
121+
setupDefaultMockAPIs(Mock);
122+
Mock.redefine<sycl::detail::PiApiKind::piProgramCompile>(
123+
redefinedProgramCompile);
124+
Mock.redefine<sycl::detail::PiApiKind::piProgramLink>(redefinedProgramLink);
125+
126+
const sycl::device Dev = Plt.get_devices()[0];
127+
128+
current_link_options.clear();
129+
current_compile_options.clear();
130+
std::string expected_compile_options = "";
131+
std::string expected_link_options = "-cl-denorms-are-zero";
132+
static sycl::unittest::PiImage DevImage =
133+
generateEAMTestKernelImage<EAMTestKernel>(expected_compile_options,
134+
expected_link_options);
135+
static sycl::unittest::PiImageArray<1> DevImageArray{&DevImage};
136+
auto KernelID = sycl::get_kernel_id<EAMTestKernel>();
137+
138+
sycl::queue Queue{Dev};
139+
140+
const sycl::context Ctx = Queue.get_context();
141+
sycl::kernel_bundle KernelBundle =
142+
sycl::get_kernel_bundle<sycl::bundle_state::input>(Ctx, {Dev},
143+
{KernelID});
144+
145+
auto BundleObj = sycl::compile(KernelBundle);
146+
sycl::link(BundleObj);
147+
EXPECT_EQ(expected_link_options, current_link_options);
148+
EXPECT_EQ(expected_compile_options, current_compile_options);
149+
}
150+
151+
TEST(Link_Compile_Options, one_compile_option_Test) {
152+
sycl::platform Plt{sycl::default_selector()};
153+
sycl::unittest::PiMock Mock{Plt};
154+
setupDefaultMockAPIs(Mock);
155+
Mock.redefine<sycl::detail::PiApiKind::piProgramCompile>(
156+
redefinedProgramCompile);
157+
Mock.redefine<sycl::detail::PiApiKind::piProgramLink>(redefinedProgramLink);
158+
159+
const sycl::device Dev = Plt.get_devices()[0];
160+
161+
current_link_options.clear();
162+
current_compile_options.clear();
163+
std::string expected_compile_options = "-cl-single-precision-constant";
164+
std::string expected_link_options = "";
165+
static sycl::unittest::PiImage DevImage =
166+
generateEAMTestKernelImage<EAMTestKernel>(expected_compile_options,
167+
expected_link_options);
168+
static sycl::unittest::PiImageArray<1> DevImageArray{&DevImage};
169+
auto KernelID = sycl::get_kernel_id<EAMTestKernel>();
170+
171+
sycl::queue Queue{Dev};
172+
173+
const sycl::context Ctx = Queue.get_context();
174+
sycl::kernel_bundle KernelBundle =
175+
sycl::get_kernel_bundle<sycl::bundle_state::input>(Ctx, {Dev},
176+
{KernelID});
177+
178+
auto BundleObj = sycl::compile(KernelBundle);
179+
sycl::link(BundleObj);
180+
EXPECT_EQ(expected_link_options, current_link_options);
181+
EXPECT_EQ(expected_compile_options, current_compile_options);
182+
}
183+
184+
TEST(Link_Compile_Options, one_link_and_compile_option_Test) {
185+
sycl::platform Plt{sycl::default_selector()};
186+
sycl::unittest::PiMock Mock{Plt};
187+
setupDefaultMockAPIs(Mock);
188+
Mock.redefine<sycl::detail::PiApiKind::piProgramCompile>(
189+
redefinedProgramCompile);
190+
Mock.redefine<sycl::detail::PiApiKind::piProgramLink>(redefinedProgramLink);
191+
192+
const sycl::device Dev = Plt.get_devices()[0];
193+
194+
current_link_options.clear();
195+
current_compile_options.clear();
196+
std::string expected_compile_options = "-cl-single-precision-constant";
197+
std::string expected_link_options = "-cl-finite-math-only";
198+
static sycl::unittest::PiImage DevImage =
199+
generateEAMTestKernelImage<EAMTestKernel>(expected_compile_options,
200+
expected_link_options);
201+
static sycl::unittest::PiImageArray<1> DevImageArray{&DevImage};
202+
auto KernelID = sycl::get_kernel_id<EAMTestKernel>();
203+
204+
sycl::queue Queue{Dev};
205+
206+
const sycl::context Ctx = Queue.get_context();
207+
sycl::kernel_bundle KernelBundle =
208+
sycl::get_kernel_bundle<sycl::bundle_state::input>(Ctx, {Dev},
209+
{KernelID});
210+
211+
auto BundleObj = sycl::compile(KernelBundle);
212+
sycl::link(BundleObj);
213+
EXPECT_EQ(expected_link_options, current_link_options);
214+
EXPECT_EQ(expected_compile_options, current_compile_options);
112215
}

0 commit comments

Comments
 (0)