-
Notifications
You must be signed in to change notification settings - Fork 15.1k
[SYCL] Add offload wrapping for SYCL kind. #147508
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 1 commit
524da07
e19602e
eee8b0f
0669663
cefdefc
8d80041
262e39a
fee98af
53b5a95
c17682b
ad141aa
20e54a1
ca63663
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -22,6 +22,7 @@ | |
#include "llvm/CodeGen/CommandFlags.h" | ||
#include "llvm/Frontend/Offloading/OffloadWrapper.h" | ||
#include "llvm/Frontend/Offloading/Utility.h" | ||
#include "llvm/Frontend/SYCL/OffloadWrapper.h" | ||
maksimsab marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
#include "llvm/IR/Constants.h" | ||
#include "llvm/IR/DiagnosticPrinter.h" | ||
#include "llvm/IR/Module.h" | ||
|
@@ -711,6 +712,13 @@ wrapDeviceImages(ArrayRef<std::unique_ptr<MemoryBuffer>> Buffers, | |
M, BuffersToWrap.front(), offloading::getOffloadEntryArray(M))) | ||
return std::move(Err); | ||
break; | ||
case OFK_SYCL: { | ||
offloading::sycl::SYCLWrappingOptions WrappingOptions; | ||
if (Error Err = offloading::sycl::wrapSYCLBinaries(M, BuffersToWrap, | ||
WrappingOptions)) | ||
return Err; | ||
maksimsab marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
break; | ||
} | ||
default: | ||
return createStringError(getOffloadKindName(Kind) + | ||
" wrapping is not supported"); | ||
|
@@ -748,6 +756,36 @@ bundleOpenMP(ArrayRef<OffloadingImage> Images) { | |
return std::move(Buffers); | ||
} | ||
|
||
Expected<SmallVector<std::unique_ptr<MemoryBuffer>>> | ||
bundleSYCL(ArrayRef<OffloadingImage> Images) { | ||
SmallVector<std::unique_ptr<MemoryBuffer>> Buffers; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we can just return this back here, right?
|
||
if (DryRun) { | ||
// In dry-run mode there is an empty input which is insufficient for | ||
// the testing. Therefore, we insert a stub value. | ||
OffloadBinary::OffloadingImage Image; | ||
Image.TheOffloadKind = OffloadKind::OFK_SYCL; | ||
Image.Image = MemoryBuffer::getMemBufferCopy(""); | ||
SmallString<0> SerializedImage = OffloadBinary::write(Image); | ||
Buffers.emplace_back(MemoryBuffer::getMemBufferCopy(SerializedImage)); | ||
return Buffers; | ||
} | ||
|
||
for (const OffloadingImage &TheImage : Images) { | ||
SmallVector<OffloadFile> OffloadBinaries; | ||
if (Error E = extractOffloadBinaries(*TheImage.Image, OffloadBinaries)) | ||
return E; | ||
|
||
for (const OffloadFile &File : OffloadBinaries) { | ||
const OffloadBinary &Binary = *File.getBinary(); | ||
SmallString<0> SerializedImage = | ||
OffloadBinary::write(Binary.getOffloadingImage()); | ||
|
||
Buffers.emplace_back(MemoryBuffer::getMemBufferCopy(SerializedImage)); | ||
} | ||
} | ||
|
||
return Buffers; | ||
} | ||
|
||
Expected<SmallVector<std::unique_ptr<MemoryBuffer>>> | ||
bundleCuda(ArrayRef<OffloadingImage> Images, const ArgList &Args) { | ||
SmallVector<std::pair<StringRef, StringRef>, 4> InputFiles; | ||
|
@@ -800,8 +838,9 @@ bundleLinkedOutput(ArrayRef<OffloadingImage> Images, const ArgList &Args, | |
llvm::TimeTraceScope TimeScope("Bundle linked output"); | ||
switch (Kind) { | ||
case OFK_OpenMP: | ||
case OFK_SYCL: | ||
return bundleOpenMP(Images); | ||
case OFK_SYCL: | ||
return bundleSYCL(Images); | ||
case OFK_Cuda: | ||
return bundleCuda(Images, Args); | ||
case OFK_HIP: | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
//===----- OffloadWrapper.h -------------------------------------*- C++ -*-===// | ||
// | ||
// 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 | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_FRONTEND_SYCL_OFFLOAD_WRAPPER_H | ||
#define LLVM_FRONTEND_SYCL_OFFLOAD_WRAPPER_H | ||
|
||
#include "llvm/ADT/ArrayRef.h" | ||
#include "llvm/Object/OffloadBinary.h" | ||
|
||
#include <string> | ||
|
||
namespace llvm { | ||
|
||
class Module; | ||
|
||
namespace offloading { | ||
namespace sycl { | ||
|
||
struct SYCLWrappingOptions { | ||
// target/compiler specific options what are suggested to use to "compile" | ||
// program at runtime. | ||
std::string CompileOptions; | ||
// Target/Compiler specific options that are suggested to use to "link" | ||
// program at runtime. | ||
std::string LinkOptions; | ||
}; | ||
|
||
/// Wraps OffloadBinaries in the given \p Buffers into the module \p M | ||
/// as global symbols and registers the images with the SYCL Runtime. | ||
/// \param Options Settings that allows to turn on optional data and settings. | ||
llvm::Error | ||
wrapSYCLBinaries(llvm::Module &M, llvm::ArrayRef<llvm::ArrayRef<char>> Buffers, | ||
SYCLWrappingOptions Options = SYCLWrappingOptions()); | ||
|
||
} // namespace sycl | ||
} // namespace offloading | ||
} // namespace llvm | ||
|
||
#endif // LLVM_FRONTEND_SYCL_OFFLOAD_WRAPPER_H |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
add_llvm_component_library(LLVMFrontendSYCL | ||
OffloadWrapper.cpp | ||
|
||
ADDITIONAL_HEADER_DIRS | ||
${LLVM_MAIN_INCLUDE_DIR}/llvm/Frontend | ||
${LLVM_MAIN_INCLUDE_DIR}/llvm/Frontend/SYCL | ||
|
||
LINK_COMPONENTS | ||
Core | ||
FrontendOffloading | ||
Object | ||
Support | ||
TransformUtils | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this just copied from OpenMP?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
RUN
lines are copied from OpenMP and adjusted to SYCL case. Output's checks are copied from theclang-linker-wrapper
's output.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess I'm just wondering why everything's called
tgt_bin_desc
and similar.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Initially, we customized old
clang-offload-wrapper
and then we extracted SYCL logic in a separate place. That is how these names stuck with us.