Skip to content

Commit d45415d

Browse files
committed
Add get_address, get_size, and attempt to design a copy-API.
Signed-off-by: Julian Oppermann <[email protected]>
1 parent e4ef41c commit d45415d

File tree

6 files changed

+230
-47
lines changed

6 files changed

+230
-47
lines changed

sycl/include/sycl/kernel_bundle.hpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,30 @@ class __SYCL_EXPORT kernel_bundle_plain {
206206
return ext_oneapi_has_device_global(detail::string_view{name}, dev);
207207
}
208208

209+
void *ext_oneapi_get_device_global_address(const std::string &name,
210+
const device &dev) {
211+
return ext_oneapi_get_device_global_address(detail::string_view{name}, dev);
212+
}
213+
214+
size_t ext_oneapi_get_device_global_size(const std::string &name,
215+
const device &dev) {
216+
return ext_oneapi_get_device_global_size(detail::string_view{name}, dev);
217+
}
218+
219+
template <typename T>
220+
event ext_oneapi_copy_to_device_global(const std::string &dest, const T &src,
221+
const queue &queue) {
222+
return ext_oneapi_copy_to_device_global(detail::string_view{dest}, &src,
223+
sizeof(T), queue);
224+
}
225+
226+
template <typename T>
227+
event ext_oneapi_copy_from_device_global(T &dest, const std::string &src,
228+
const queue &queue) {
229+
return ext_oneapi_copy_from_device_global(&dest, detail::string_view{src},
230+
sizeof(T), queue);
231+
}
232+
209233
protected:
210234
// \returns a kernel object which represents the kernel identified by
211235
// kernel_id passed
@@ -237,6 +261,16 @@ class __SYCL_EXPORT kernel_bundle_plain {
237261

238262
bool ext_oneapi_has_device_global(detail::string_view name,
239263
const device &dev);
264+
void *ext_oneapi_get_device_global_address(detail::string_view name,
265+
const device &dev);
266+
size_t ext_oneapi_get_device_global_size(detail::string_view name,
267+
const device &dev);
268+
event ext_oneapi_copy_to_device_global(detail::string_view dest,
269+
const void *src, size_t num_bytes,
270+
const queue &queue);
271+
event ext_oneapi_copy_from_device_global(void *dest, detail::string_view src,
272+
size_t num_bytes,
273+
const queue &queue);
240274
};
241275

242276
} // namespace detail

sycl/source/detail/kernel_bundle_impl.hpp

Lines changed: 77 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,8 @@ class kernel_bundle_impl {
674674
KernelNames, Language);
675675
}
676676

677+
// Utility methods for kernel_compiler functionality
678+
private:
677679
std::string adjust_kernel_name(const std::string &Name,
678680
syclex::source_language Lang) {
679681
// Once name demangling support is in, we won't need this.
@@ -685,6 +687,35 @@ class kernel_bundle_impl {
685687
return isMangled ? Name : "__sycl_kernel_" + Name;
686688
}
687689

690+
std::string mangle_device_global_name(const std::string &Name) {
691+
// TODO: Support device globals declared in namespaces.
692+
return "_Z" + std::to_string(Name.length()) + Name;
693+
}
694+
695+
const DeviceGlobalMapEntry *get_device_global_entry(const std::string &Name,
696+
const device &Dev) {
697+
if (Language != syclex::source_language::sycl_jit || Prefix.empty()) {
698+
throw sycl::exception(make_error_code(errc::invalid),
699+
"Querying device globals by name is only available "
700+
"in kernel_bundles successfully built from "
701+
"kernel_bundle<bundle_state:ext_oneapi_source> "
702+
"with 'sycl_jit' source language.");
703+
}
704+
705+
if (!ext_oneapi_has_device_global(Name, Dev)) {
706+
throw sycl::exception(make_error_code(errc::invalid),
707+
"device global '" + Name +
708+
"' not found in kernel_bundle");
709+
}
710+
711+
std::vector<DeviceGlobalMapEntry *> Entries =
712+
ProgramManager::getInstance().getDeviceGlobalEntries(
713+
{Prefix + mangle_device_global_name(Name)});
714+
assert(Entries.size() == 1);
715+
return Entries.front();
716+
}
717+
718+
public:
688719
bool ext_oneapi_has_kernel(const std::string &Name) {
689720
auto it = std::find(KernelNames.begin(), KernelNames.end(),
690721
adjust_kernel_name(Name, Language));
@@ -746,18 +777,58 @@ class kernel_bundle_impl {
746777
return detail::createSyclObjFromImpl<kernel>(KernelImpl);
747778
}
748779

749-
std::string mangle_device_global_name(const std::string &Name) {
750-
// TODO: Support device globals declared in namespaces.
751-
return "_Z" + std::to_string(Name.length()) + Name;
752-
}
753-
754780
bool ext_oneapi_has_device_global(const std::string &Name,
755-
[[maybe_unused]] const device &Dev) {
781+
const device &Dev) {
782+
if (!std::any_of(
783+
MDevices.begin(), MDevices.end(),
784+
[&Dev](const device &DevCand) { return Dev == DevCand; })) {
785+
// TODO: device_image::has_kernel(id, device) checks the device if the
786+
// given device is a sub-device.
787+
return false;
788+
}
789+
756790
std::string MangledName = mangle_device_global_name(Name);
757791
return std::find(DeviceGlobalNames.begin(), DeviceGlobalNames.end(),
758792
MangledName) != DeviceGlobalNames.end();
759793
}
760794

795+
void *ext_oneapi_get_device_global_address(const std::string &Name,
796+
const device &Dev) {
797+
return const_cast<void *>(
798+
get_device_global_entry(Name, Dev)->MDeviceGlobalPtr);
799+
}
800+
801+
size_t ext_oneapi_get_device_global_size(const std::string &Name,
802+
const device &Dev) {
803+
return get_device_global_entry(Name, Dev)->MDeviceGlobalTSize;
804+
}
805+
806+
event ext_oneapi_copy_to_device_global(const std::string &Dest,
807+
const void *Src, size_t NumBytes,
808+
const queue &Queue) {
809+
const auto *Entry = get_device_global_entry(Dest, Queue.get_device());
810+
if (NumBytes != Entry->MDeviceGlobalTSize) {
811+
throw sycl::exception(make_error_code(errc::invalid),
812+
"Incompatible type size for device global '" +
813+
Dest + "'");
814+
}
815+
return syclex::detail::SYCL_JIT_memcpy_to_device_global(
816+
Entry, Src, NumBytes, /*Offset=*/0, Queue, /*DepEvents=*/{});
817+
}
818+
819+
event ext_oneapi_copy_from_device_global(void *Dest, const std::string &Src,
820+
size_t NumBytes,
821+
const queue &Queue) {
822+
const auto *Entry = get_device_global_entry(Src, Queue.get_device());
823+
if (NumBytes != Entry->MDeviceGlobalTSize) {
824+
throw sycl::exception(make_error_code(errc::invalid),
825+
"Incompatible type size for device global '" + Src +
826+
"'");
827+
}
828+
return syclex::detail::SYCL_JIT_memcpy_from_device_global(
829+
Dest, Entry, NumBytes, /*Offset=*/0, Queue, /*DepEvents=*/{});
830+
}
831+
761832
bool empty() const noexcept { return MDeviceImages.empty(); }
762833

763834
backend get_backend() const noexcept {

sycl/source/detail/kernel_compiler/kernel_compiler_sycl.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,8 @@ bool SYCL_Compilation_Available() {
288288
#if SYCL_EXT_JIT_ENABLE
289289
#include "../jit_compiler.hpp"
290290
#include <atomic>
291+
#include <detail/device_global_map_entry.hpp>
292+
#include <detail/queue_impl.hpp>
291293
#endif
292294

293295
namespace sycl {
@@ -323,6 +325,41 @@ std::pair<sycl_device_binaries, std::string> SYCL_JIT_to_SPIRV(
323325
#endif
324326
}
325327

328+
event SYCL_JIT_memcpy_to_device_global(
329+
[[maybe_unused]] const DeviceGlobalMapEntry *Dest,
330+
[[maybe_unused]] const void *Src, [[maybe_unused]] size_t NumBytes,
331+
[[maybe_unused]] size_t Offset, [[maybe_unused]] const queue &Queue,
332+
[[maybe_unused]] const std::vector<event> &DepEvents) {
333+
#if SYCL_EXT_JIT_ENABLE
334+
const std::shared_ptr<queue_impl> &QueueImplPtr = getSyclObjImpl(Queue);
335+
return QueueImplPtr->memcpyToDeviceGlobal(
336+
QueueImplPtr, const_cast<void *>(Dest->MDeviceGlobalPtr), Src,
337+
Dest->MIsDeviceImageScopeDecorated, NumBytes, Offset, DepEvents,
338+
/*CallerNeedsEvent=*/true);
339+
#else
340+
throw sycl::exception(sycl::errc::invalid,
341+
"runtime-compiled device global support not available");
342+
#endif
343+
}
344+
345+
event SYCL_JIT_memcpy_from_device_global(
346+
[[maybe_unused]] void *Dest,
347+
[[maybe_unused]] const DeviceGlobalMapEntry *Src,
348+
[[maybe_unused]] size_t NumBytes, [[maybe_unused]] size_t Offset,
349+
[[maybe_unused]] const queue &Queue,
350+
[[maybe_unused]] const std::vector<event> &DepEvents) {
351+
#if SYCL_EXT_JIT_ENABLE
352+
const std::shared_ptr<queue_impl> &QueueImplPtr = getSyclObjImpl(Queue);
353+
return QueueImplPtr->memcpyFromDeviceGlobal(
354+
QueueImplPtr, Dest, const_cast<void *>(Src->MDeviceGlobalPtr),
355+
Src->MIsDeviceImageScopeDecorated, NumBytes, Offset, DepEvents,
356+
/*CallerNeedsEvent=*/true);
357+
#else
358+
throw sycl::exception(sycl::errc::invalid,
359+
"runtime-compiled device global support not available");
360+
#endif
361+
}
362+
326363
} // namespace detail
327364
} // namespace ext::oneapi::experimental
328365
} // namespace _V1

sycl/source/detail/kernel_compiler/kernel_compiler_sycl.hpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <sycl/detail/defines_elementary.hpp>
1212
#include <sycl/detail/export.hpp> // __SYCL_EXPORT
1313
#include <sycl/device.hpp>
14+
#include <sycl/queue.hpp>
1415

1516
#include <detail/compiler.hpp> // sycl_device_binaries
1617

@@ -20,6 +21,11 @@
2021

2122
namespace sycl {
2223
inline namespace _V1 {
24+
25+
namespace detail {
26+
struct DeviceGlobalMapEntry;
27+
} // namespace detail
28+
2329
namespace ext::oneapi::experimental {
2430
namespace detail {
2531

@@ -42,6 +48,17 @@ SYCL_JIT_to_SPIRV(const std::string &Source, include_pairs_t IncludePairs,
4248

4349
bool SYCL_JIT_Compilation_Available();
4450

51+
event SYCL_JIT_memcpy_to_device_global(const DeviceGlobalMapEntry *Dest,
52+
const void *Src, size_t NumBytes,
53+
size_t Offset, const queue &Queue,
54+
const std::vector<event> &DepEvents);
55+
56+
event SYCL_JIT_memcpy_from_device_global(void *Dest,
57+
const DeviceGlobalMapEntry *Src,
58+
size_t NumBytes, size_t Offset,
59+
const queue &Queue,
60+
const std::vector<event> &DepEvents);
61+
4562
} // namespace detail
4663
} // namespace ext::oneapi::experimental
4764

sycl/source/kernel_bundle.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,30 @@ bool kernel_bundle_plain::ext_oneapi_has_device_global(detail::string_view name,
129129
return impl->ext_oneapi_has_device_global(name.data(), dev);
130130
}
131131

132+
void *kernel_bundle_plain::ext_oneapi_get_device_global_address(
133+
detail::string_view name, const device &dev) {
134+
return impl->ext_oneapi_get_device_global_address(name.data(), dev);
135+
}
136+
137+
size_t
138+
kernel_bundle_plain::ext_oneapi_get_device_global_size(detail::string_view name,
139+
const device &dev) {
140+
return impl->ext_oneapi_get_device_global_size(name.data(), dev);
141+
}
142+
143+
event kernel_bundle_plain::ext_oneapi_copy_to_device_global(
144+
detail::string_view dest, const void *src, size_t num_bytes,
145+
const queue &queue) {
146+
return impl->ext_oneapi_copy_to_device_global(dest.data(), src, num_bytes,
147+
queue);
148+
}
149+
150+
event kernel_bundle_plain::ext_oneapi_copy_from_device_global(
151+
void *dest, detail::string_view src, size_t num_bytes, const queue &queue) {
152+
return impl->ext_oneapi_copy_from_device_global(dest, src.data(), num_bytes,
153+
queue);
154+
}
155+
132156
//////////////////////////////////
133157
///// sycl::detail free functions
134158
//////////////////////////////////

0 commit comments

Comments
 (0)