Skip to content

Commit 1c93bfe

Browse files
HabKaffeeromanovvladsteffenlarsen
authored
[SYCL] Pass driver options to JIT compiler and linker (#5476)
This patch implements passing compiler and link options to sycl::compile() and sycl::link() respectively. Co-authored-by: Romanov Vlad <[email protected]> Co-authored-by: Steffen Larsen <[email protected]>
1 parent 87f60f6 commit 1c93bfe

File tree

4 files changed

+324
-19
lines changed

4 files changed

+324
-19
lines changed

sycl/source/detail/program_manager/program_manager.cpp

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -365,37 +365,52 @@ RT::PiProgram ProgramManager::createPIProgram(const RTDeviceBinaryImage &Img,
365365

366366
return Res;
367367
}
368-
static void applyOptionsFromImage(std::string &CompileOpts,
369-
std::string &LinkOpts,
370-
const RTDeviceBinaryImage &Img) {
368+
369+
static void appendLinkOptionsFromImage(std::string &LinkOpts,
370+
const RTDeviceBinaryImage &Img) {
371+
static const char *LinkOptsEnv = SYCLConfig<SYCL_PROGRAM_LINK_OPTIONS>::get();
372+
// Update only if link options are not overwritten by environment variable
373+
if (!LinkOptsEnv) {
374+
const char *TemporaryStr = Img.getLinkOptions();
375+
if (TemporaryStr != nullptr) {
376+
if (!LinkOpts.empty())
377+
LinkOpts += " ";
378+
LinkOpts += std::string(TemporaryStr);
379+
}
380+
}
381+
}
382+
383+
static void appendCompileOptionsFromImage(std::string &CompileOpts,
384+
const RTDeviceBinaryImage &Img) {
371385
// Build options are overridden if environment variables are present.
372386
// Environment variables are not changed during program lifecycle so it
373387
// is reasonable to use static here to read them only once.
374388
static const char *CompileOptsEnv =
375389
SYCLConfig<SYCL_PROGRAM_COMPILE_OPTIONS>::get();
376-
static const char *LinkOptsEnv = SYCLConfig<SYCL_PROGRAM_LINK_OPTIONS>::get();
390+
pi_device_binary_property isEsimdImage = Img.getProperty("isEsimdImage");
377391
// Update only if compile options are not overwritten by environment
378392
// variable
379393
if (!CompileOptsEnv) {
380394
if (!CompileOpts.empty())
381395
CompileOpts += " ";
382-
CompileOpts += Img.getCompileOptions();
396+
const char *TemporaryStr = Img.getCompileOptions();
397+
if (TemporaryStr != nullptr)
398+
CompileOpts += std::string(TemporaryStr);
383399
}
384-
385400
// The -vc-codegen option is always preserved for ESIMD kernels, regardless
386401
// of the contents SYCL_PROGRAM_COMPILE_OPTIONS environment variable.
387-
pi_device_binary_property isEsimdImage = Img.getProperty("isEsimdImage");
388402
if (isEsimdImage && pi::DeviceBinaryProperty(isEsimdImage).asUint32()) {
389403
if (!CompileOpts.empty())
390404
CompileOpts += " ";
391405
CompileOpts += "-vc-codegen";
392406
}
407+
}
393408

394-
// Update only if link options are not overwritten by environment variable
395-
if (!LinkOptsEnv)
396-
if (!LinkOpts.empty())
397-
LinkOpts += " ";
398-
LinkOpts += Img.getLinkOptions();
409+
static void applyOptionsFromImage(std::string &CompileOpts,
410+
std::string &LinkOpts,
411+
const RTDeviceBinaryImage &Img) {
412+
appendCompileOptionsFromImage(CompileOpts, Img);
413+
appendLinkOptionsFromImage(LinkOpts, Img);
399414
}
400415

401416
static void applyOptionsFromEnvironment(std::string &CompileOpts,
@@ -1000,9 +1015,12 @@ ProgramManager::ProgramPtr ProgramManager::build(
10001015

10011016
const detail::plugin &Plugin = Context->getPlugin();
10021017
if (LinkPrograms.empty() && !ForceLink) {
1018+
const std::string &Options = LinkOptions.empty()
1019+
? CompileOptions
1020+
: (CompileOptions + " " + LinkOptions);
10031021
RT::PiResult Error = Plugin.call_nocheck<PiApiKind::piProgramBuild>(
1004-
Program.get(), /*num devices =*/1, &Device, CompileOptions.c_str(),
1005-
nullptr, nullptr);
1022+
Program.get(), /*num devices =*/1, &Device, Options.c_str(), nullptr,
1023+
nullptr);
10061024
if (Error != PI_SUCCESS)
10071025
throw compile_program_error(getProgramBuildLog(Program.get(), Context),
10081026
Error);
@@ -1674,10 +1692,12 @@ ProgramManager::compile(const device_image_plain &DeviceImage,
16741692
// TODO: Set spec constatns here.
16751693

16761694
// TODO: Handle zero sized Device list.
1695+
std::string CompileOptions;
1696+
appendCompileOptionsFromImage(CompileOptions,
1697+
*(InputImpl->get_bin_image_ref()));
16771698
RT::PiResult Error = Plugin.call_nocheck<PiApiKind::piProgramCompile>(
16781699
ObjectImpl->get_program_ref(), /*num devices=*/Devs.size(),
1679-
PIDevices.data(),
1680-
/*options=*/nullptr,
1700+
PIDevices.data(), CompileOptions.c_str(),
16811701
/*num_input_headers=*/0, /*input_headers=*/nullptr,
16821702
/*header_include_names=*/nullptr,
16831703
/*pfn_notify=*/nullptr, /*user_data*/ nullptr);
@@ -1706,15 +1726,21 @@ ProgramManager::link(const std::vector<device_image_plain> &DeviceImages,
17061726
for (const device &Dev : Devs)
17071727
PIDevices.push_back(getSyclObjImpl(Dev)->getHandleRef());
17081728

1729+
std::string LinkOptionsStr;
1730+
for (const device_image_plain &DeviceImage : DeviceImages) {
1731+
const std::shared_ptr<device_image_impl> &InputImpl =
1732+
getSyclObjImpl(DeviceImage);
1733+
appendLinkOptionsFromImage(LinkOptionsStr,
1734+
*(InputImpl->get_bin_image_ref()));
1735+
}
17091736
const context &Context = getSyclObjImpl(DeviceImages[0])->get_context();
17101737
const ContextImplPtr ContextImpl = getSyclObjImpl(Context);
1711-
17121738
const detail::plugin &Plugin = ContextImpl->getPlugin();
17131739

17141740
RT::PiProgram LinkedProg = nullptr;
17151741
RT::PiResult Error = Plugin.call_nocheck<PiApiKind::piProgramLink>(
17161742
ContextImpl->getHandleRef(), PIDevices.size(), PIDevices.data(),
1717-
/*options=*/nullptr, PIPrograms.size(), PIPrograms.data(),
1743+
/*options=*/LinkOptionsStr.c_str(), PIPrograms.size(), PIPrograms.data(),
17181744
/*pfn_notify=*/nullptr,
17191745
/*user_data=*/nullptr, &LinkedProg);
17201746

sycl/unittests/misc/KernelBuildOptions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ TEST(KernelBuildOptions, KernelBundleBasic) {
243243
sycl::kernel_bundle KernelBundle =
244244
sycl::get_kernel_bundle<sycl::bundle_state::input>(Ctx, {Dev});
245245
auto ExecBundle = sycl::build(KernelBundle);
246-
EXPECT_EQ(BuildOpts, "-compile-img -vc-codegen");
246+
EXPECT_EQ(BuildOpts, "-compile-img -vc-codegen -link-img");
247247

248248
auto ObjBundle = sycl::compile(KernelBundle, KernelBundle.get_devices());
249249
// TODO: uncomment when image options are passed to BE

sycl/unittests/program_manager/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ add_sycl_unittest(ProgramManagerTests OBJECT
55
EliminatedArgMask.cpp
66
itt_annotations.cpp
77
SubDevices.cpp
8+
passing_link_and_compile_options.cpp
89
)
910

0 commit comments

Comments
 (0)