Skip to content

Commit dc08aab

Browse files
Add C++ multidimensional launch bindings
1 parent 446563e commit dc08aab

4 files changed

Lines changed: 88 additions & 5 deletions

File tree

oneapi-rs-sys/include/queue.hpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
namespace sycl_shims {
1717
struct EventPtr;
18+
struct Range2;
19+
struct Range3;
1820
} // namespace sycl_shims
1921

2022
namespace sycl_shims::queue {
@@ -28,5 +30,16 @@ std::unique_ptr<Event> memset(std::unique_ptr<Queue> &, std::uint8_t *ptr,
2830
rust::Vec<EventPtr>);
2931
std::unique_ptr<Event> barrier(std::unique_ptr<Queue> &, rust::Vec<EventPtr>);
3032
void wait(std::unique_ptr<Queue> &);
31-
std::unique_ptr<Event> launch(std::unique_ptr<Queue> &, Kernel const &, rust::Slice<rust::slice<std::uint8_t const> const> args);
33+
34+
std::unique_ptr<Event>
35+
launch_1d(std::unique_ptr<Queue> &, unsigned long global_size, unsigned long local_size,
36+
Kernel const &, rust::Slice<rust::slice<std::uint8_t const> const> args);
37+
38+
std::unique_ptr<Event>
39+
launch_2d(std::unique_ptr<Queue> &, Range2 global_size, Range2 local_size,
40+
Kernel const &, rust::Slice<rust::slice<std::uint8_t const> const> args);
41+
42+
std::unique_ptr<Event>
43+
launch_3d(std::unique_ptr<Queue> &, Range3 global_size, Range3 local_size,
44+
Kernel const &, rust::Slice<rust::slice<std::uint8_t const> const> args);
3245
} // namespace sycl_shims::queue

oneapi-rs-sys/src/queue-sys.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ pub mod ffi {
1212
extern "C++" {
1313
include!("oneapi-rs-sys/src/types-sys.rs.h");
1414
type EventPtr = crate::types::ffi::EventPtr;
15+
type Range2 = crate::types::ffi::Range2;
16+
type Range3 = crate::types::ffi::Range3;
1517
}
1618

1719
unsafe extern "C++" {
@@ -33,15 +35,40 @@ pub mod ffi {
3335
fn new_queue_from_device(device: &Device) -> UniquePtr<Queue>;
3436
fn get_context(queue: &Queue) -> UniquePtr<Context>;
3537
fn clone(queue: &Queue) -> UniquePtr<Queue>;
38+
3639
unsafe fn memset(
3740
queue: &mut UniquePtr<Queue>,
3841
ptr: *mut u8,
3942
value: i32,
4043
num_bytes: usize,
4144
dep_events: Vec<EventPtr>,
4245
) -> UniquePtr<Event>;
46+
4347
fn barrier(queue: &mut UniquePtr<Queue>, dep_events: Vec<EventPtr>) -> UniquePtr<Event>;
4448
fn wait(queue: &mut UniquePtr<Queue>);
45-
unsafe fn launch(queue: &mut UniquePtr<Queue>, kernel: &Kernel, args: &[&[u8]]) -> UniquePtr<Event>;
49+
50+
unsafe fn launch_1d(
51+
queue: &mut UniquePtr<Queue>,
52+
global_size: u64,
53+
local_size: u64,
54+
kernel: &Kernel,
55+
args: &[&[u8]],
56+
) -> UniquePtr<Event>;
57+
58+
unsafe fn launch_2d(
59+
queue: &mut UniquePtr<Queue>,
60+
global_size: Range2,
61+
local_size: Range2,
62+
kernel: &Kernel,
63+
args: &[&[u8]],
64+
) -> UniquePtr<Event>;
65+
66+
unsafe fn launch_3d(
67+
queue: &mut UniquePtr<Queue>,
68+
global_size: Range3,
69+
local_size: Range3,
70+
kernel: &Kernel,
71+
args: &[&[u8]],
72+
) -> UniquePtr<Event>;
4673
}
4774
}

oneapi-rs-sys/src/queue.cpp

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,44 @@ std::unique_ptr<Event> barrier(std::unique_ptr<Queue> &queue,
5555

5656
void wait(std::unique_ptr<Queue> &queue) { queue->wait(); }
5757

58-
std::unique_ptr<Event> launch(std::unique_ptr<Queue> &queue, Kernel const &kernel, rust::Slice<rust::slice<std::uint8_t const> const> args) {
58+
template <int Dimensions>
59+
std::unique_ptr<Event>
60+
launch(std::unique_ptr<Queue> &queue, sycl::nd_range<Dimensions> nd_range,
61+
Kernel const &kernel,
62+
rust::Slice<rust::slice<std::uint8_t const> const> args) {
5963
return std::make_unique<Event>(queue->submit([&](sycl::handler &cgh) {
6064
for (std::size_t i = 0; i < args.size(); ++i)
6165
cgh.set_arg(i, syclexp::raw_kernel_arg(args[i].data(), args[i].size()));
62-
63-
cgh.parallel_for(sycl::nd_range{{1024}, {16}}, kernel);
66+
67+
cgh.parallel_for(nd_range, kernel);
6468
}));
6569
}
70+
71+
std::unique_ptr<Event>
72+
launch_1d(std::unique_ptr<Queue> &queue, unsigned long global_size,
73+
unsigned long local_size, Kernel const &kernel,
74+
rust::Slice<rust::slice<std::uint8_t const> const> args) {
75+
return launch(queue, sycl::nd_range<1>{{global_size}, {local_size}}, kernel,
76+
args);
77+
}
78+
79+
std::unique_ptr<Event>
80+
launch_2d(std::unique_ptr<Queue> &queue, Range2 global_size, Range2 local_size,
81+
Kernel const &kernel,
82+
rust::Slice<rust::slice<std::uint8_t const> const> args) {
83+
return launch(queue,
84+
sycl::nd_range<2>{{global_size.x, global_size.y},
85+
{local_size.x, local_size.y}},
86+
kernel, args);
87+
}
88+
89+
std::unique_ptr<Event>
90+
launch_3d(std::unique_ptr<Queue> &queue, Range3 global_size, Range3 local_size,
91+
Kernel const &kernel,
92+
rust::Slice<rust::slice<std::uint8_t const> const> args) {
93+
return launch(queue,
94+
sycl::nd_range<3>{{global_size.x, global_size.y, global_size.z},
95+
{local_size.x, local_size.y, local_size.z}},
96+
kernel, args);
97+
}
6698
} // namespace sycl_shims::queue

oneapi-rs-sys/src/types-sys.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,17 @@ pub mod ffi {
7777
Complete,
7878
Unknown,
7979
}
80+
81+
struct Range2 {
82+
x: u64,
83+
y: u64,
84+
}
85+
86+
struct Range3 {
87+
x: u64,
88+
y: u64,
89+
z: u64,
90+
}
8091

8192
impl UniquePtr<Device> {}
8293
impl UniquePtr<Platform> {}

0 commit comments

Comments
 (0)