-
Notifications
You must be signed in to change notification settings - Fork 184
/
Copy pathtransfer.cpp
138 lines (111 loc) · 4.2 KB
/
transfer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <catch2/catch.hpp>
#include <stdexec/execution.hpp>
#include "exec/inline_scheduler.hpp"
#include "nvexec/stream_context.cuh"
#include "common.cuh"
namespace ex = stdexec;
using nvexec::is_on_gpu;
namespace {
TEST_CASE(
"nvexec transfer to stream context returns a sender",
"[cuda][stream][adaptors][transfer]") {
nvexec::stream_context stream_ctx{};
exec::inline_scheduler cpu{};
nvexec::stream_scheduler gpu = stream_ctx.get_scheduler();
auto snd = ex::schedule(cpu) | ex::continues_on(gpu);
STATIC_REQUIRE(ex::sender<decltype(snd)>);
(void) snd;
}
TEST_CASE(
"nvexec transfer from stream context returns a sender",
"[cuda][stream][adaptors][transfer]") {
nvexec::stream_context stream_ctx{};
exec::inline_scheduler cpu{};
nvexec::stream_scheduler gpu = stream_ctx.get_scheduler();
auto snd = ex::schedule(gpu) | ex::continues_on(cpu);
STATIC_REQUIRE(ex::sender<decltype(snd)>);
(void) snd;
}
TEST_CASE("nvexec transfer changes context to GPU", "[cuda][stream][adaptors][transfer]") {
nvexec::stream_context stream_ctx{};
exec::inline_scheduler cpu{};
nvexec::stream_scheduler gpu = stream_ctx.get_scheduler();
auto snd = ex::schedule(cpu) //
| ex::then([=] {
if (!is_on_gpu()) {
return 1;
}
return 0;
})
| ex::continues_on(gpu) //
| ex::then([=](int val) -> int {
if (is_on_gpu() && val == 1) {
return 2;
}
return 0;
});
const auto [result] = stdexec::sync_wait(std::move(snd)).value();
REQUIRE(result == 2);
}
TEST_CASE("nvexec transfer changes context from GPU", "[cuda][stream][adaptors][transfer]") {
nvexec::stream_context stream_ctx{};
exec::inline_scheduler cpu{};
nvexec::stream_scheduler gpu = stream_ctx.get_scheduler();
auto snd = ex::schedule(gpu) //
| ex::then([=] {
if (is_on_gpu()) {
return 1;
}
return 0;
})
| ex::continues_on(cpu) //
| ex::then([=](int val) -> int {
if (!is_on_gpu() && val == 1) {
return 2;
}
return 0;
});
const auto [result] = stdexec::sync_wait(std::move(snd)).value();
REQUIRE(result == 2);
}
TEST_CASE("nvexec transfer_just changes context to GPU", "[cuda][stream][adaptors][transfer]") {
nvexec::stream_context stream_ctx{};
nvexec::stream_scheduler gpu = stream_ctx.get_scheduler();
auto snd = ex::transfer_just(gpu, 42) //
| ex::then([=](auto i) {
if (is_on_gpu() && i == 42) {
return true;
}
return false;
});
const auto [result] = stdexec::sync_wait(std::move(snd)).value();
REQUIRE(result == true);
}
TEST_CASE("nvexec transfer_just supports move-only types", "[cuda][stream][adaptors][transfer]") {
nvexec::stream_context stream_ctx{};
nvexec::stream_scheduler gpu = stream_ctx.get_scheduler();
auto snd = ex::transfer_just(gpu, move_only_t{42}) //
| ex::then([=](move_only_t&& val) noexcept {
if (is_on_gpu() && val.contains(42)) {
return true;
}
return false;
});
const auto [result] = stdexec::sync_wait(std::move(snd)).value();
REQUIRE(result == true);
}
TEST_CASE("nvexec transfer supports move-only types", "[cuda][stream][adaptors][transfer]") {
nvexec::stream_context stream_ctx{};
exec::inline_scheduler cpu{};
nvexec::stream_scheduler gpu = stream_ctx.get_scheduler();
auto snd = ex::schedule(gpu) | ex::then([] { return move_only_t{42}; }) | ex::continues_on(cpu)
| ex::then([=](move_only_t val) noexcept {
if (!is_on_gpu() && val.contains(42)) {
return true;
}
return false;
});
const auto [result] = stdexec::sync_wait(std::move(snd)).value();
REQUIRE(result == true);
}
} // namespace