Skip to content
This repository has been archived by the owner on Mar 28, 2023. It is now read-only.

[SYCL] Tests for Level Zero linker flags #713

Merged
merged 4 commits into from
Jan 14, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions SYCL/DeprecatedFeatures/get-options.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
// RUN: %CPU_RUN_PLACEHOLDER %t.out
// RUN: %GPU_RUN_PLACEHOLDER %t.out
// RUN: %ACC_RUN_PLACEHOLDER %t.out
// XFAIL: cuda || hip
// XFAIL: ze_debug-1,ze_debug4
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bso-intel: I saw that you recently added the XFAIL for "ze_debug". I assume it makes sense to remove this now because this test is now unsupported on Level Zero. Agree?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I am okay to remove those XFAIL lines as long as Sergey agrees with // UNSUPPORTED: level_zero

//
// This test passes OpenCL specific compiler and linker swiches to the backend,
// so it is unsupported on any other backend.
// UNSUPPORTED: cuda || hip || level_zero

#include <CL/sycl.hpp>

Expand Down
44 changes: 44 additions & 0 deletions SYCL/DeprecatedFeatures/level-zero-link-flags.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// RUN: %clangxx -fsycl -D__SYCL_INTERNAL_API %s -o %t.out
// RUN: %GPU_RUN_PLACEHOLDER %t.out
// REQUIRES: level_zero
//
//==--- level-zero-link-flags.cpp - Error handling for link flags --==//
//
// The Level Zero backend does not accept any online linker options.
// This test validates that an error is raised if you attempt to pass any.
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===--------------------------------------------------------------===//

#include <CL/sycl.hpp>

class MyKernel;

void test() {
sycl::queue Queue;
sycl::context Context = Queue.get_context();

sycl::program Program(Context);
Program.compile_with_kernel_type<MyKernel>();

try {
Program.link("-foo");
assert(false && "Expected error linking program");
} catch (const sycl::exception &e) {
assert((e.code() == sycl::errc::build) && "Wrong error code");
} catch (...) {
assert(false && "Expected sycl::exception");
}

Queue.submit([&](sycl::handler &CGH) { CGH.single_task<MyKernel>([=] {}); })
.wait();
}

int main() {
test();

return 0;
}
5 changes: 4 additions & 1 deletion SYCL/DeprecatedFeatures/program_link.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@
//
// Hits an assertion on AMD with multiple GPUs available, fails trace on Nvidia.
// XFAIL: hip_amd || hip_nvidia
// XFAIL: ze_debug-1,ze_debug4
//
// Unsupported on Level Zero because the test passes OpenCL specific compiler
// and linker switches.
// UNSUPPORTED: level_zero

#include <CL/sycl.hpp>
#include <iostream>
Expand Down
54 changes: 54 additions & 0 deletions SYCL/KernelAndProgram/level-zero-link-flags.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// RUN: %clangxx -fsycl %s -o %t.out
// RUN: %GPU_RUN_PLACEHOLDER SYCL_PROGRAM_LINK_OPTIONS=-foo %t.out
// REQUIRES: level_zero
//
// This test is disabled because the runtime does not currently pass linker
// flags from SYCL_PROGRAM_LINK_OPTIONS when the program calls "sycl::link()".
// This seems like a bug since the runtime passes linker flags from that
// environment variable in other cases when it links device code.
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@smaslov-intel: Do you agree that the behavior I describe above is a bug? If so, I'll create a bug report.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure, the SYCL_PROGRAM_LINK_OPTIONS doc says "String of valid OpenCL link options", so it sounds like OpenCL specific. Also, given that Level-Zero doesn't support any linking options, why would we have an option to pass any?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The handling for SYCL_PROGRAM_LINK_OPTIONS is done in the generic part of the DPC++ runtime. Currently, it only uses this envvar when a module is compiled in order to submit it to a device. In that case, the runtime passes the SYCL_PROGRAM_LINK_OPTIONS to piProgramLink regardless of the backend. Therefore, I think the intent of this envvar is that it can be used to pass options to the linker for any backend, not just for OpenCL.

The handling for sycl::link() is also in the generic part of the library. For some reason, that code does not use options from SYCL_PROGRAM_LINK_OPTIONS for any backend.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am OK making SYCL_PROGRAM_LINK_OPTIONS to be backend-agnostic (need to fix doc then).

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I created a bug report, which also captures the doc issue.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I got feedback that I should pass the linker options via -Xsycl-target-linker instead of using SYCL_PROGRAM_LINK_OPTIONS . I modified the test to use that option, but it still fails. Therefore, this test is still disabled. I entered a new bug report to capture this issue.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@smaslov-intel said:

Why is the test still disabled?

I assume you are asking about the "level-zero-link-flags.cpp" test? If so, my comment above is the answer.

//
// XFAIL: level_zero
//
//==--- level-zero-link-flags.cpp - Error handling for link flags --==//
//
// The Level Zero backend does not accept any online linker options.
// This test validates that an error is raised if you attempt to pass any.
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===--------------------------------------------------------------===//

#include <sycl/sycl.hpp>

class MyKernel;

void test() {
sycl::queue Queue;
sycl::context Context = Queue.get_context();

auto BundleInput =
sycl::get_kernel_bundle<MyKernel, sycl::bundle_state::input>(Context);
auto BundleObject = sycl::compile(BundleInput);

try {
sycl::link(BundleObject);
assert(false && "Expected error linking kernel bundle");
} catch (const sycl::exception &e) {
std::string Msg(e.what());
assert((e.code() == sycl::errc::build) && "Wrong error code");
assert(Msg.find("-foo") != std::string::npos);
} catch (...) {
assert(false && "Expected sycl::exception");
}

Queue.submit([&](sycl::handler &CGH) { CGH.single_task<MyKernel>([=] {}); })
.wait();
}

int main() {
test();

return 0;
}