1
1
#include " runtime/stream.h"
2
+ #include " runtime/mem_manager.hh"
2
3
3
4
namespace refactor ::runtime {
5
+ using mem_manager::ForeignBlob;
4
6
5
7
void emptyRoutine (runtime::Resources &, void const **, void **) {}
6
8
@@ -15,23 +17,62 @@ namespace refactor::runtime {
15
17
bool Address::isOffset () const noexcept {
16
18
return std::holds_alternative<size_t >(value);
17
19
}
18
-
19
- size_t Address::getOffset () const {
20
+ auto Address::blob () const noexcept -> mem_manager::SharedForeignBlob const & {
21
+ return std::get<mem_manager::SharedForeignBlob>(value);
22
+ }
23
+ auto Address::offset () const noexcept -> size_t {
20
24
return std::get<size_t >(value);
21
25
}
22
26
23
27
Stream::Stream (Resources resources,
24
- mem_manager::SharedForeignBlob stack,
28
+ size_t stack,
29
+ std::vector<size_t > outputs,
25
30
graph_topo::GraphTopo topology,
26
31
std::vector<_N> routines,
27
32
std::vector<_E> offsets)
28
33
: _resources(std::move(resources)),
29
- _stack (std::move(stack)),
34
+ _stack (ForeignBlob::share(_resources.fetch<MemManager>()->manager, stack)),
35
+ _outputsSize(std::move(outputs)),
30
36
_internal(_G{
31
37
std::move (topology),
32
38
std::move (routines),
33
39
std::move (offsets),
34
- }) {}
40
+ }) {
41
+ }
42
+
43
+ void Stream::setInput (uint_lv1 i, void const *data, size_t size) {
44
+ auto globalInputs = _internal.topology .globalInputs ();
45
+ ASSERT (i < globalInputs.size (), " input index out of range" );
46
+
47
+ auto allocator = _resources.fetch <MemManager>()->manager ;
48
+ auto blob = ForeignBlob::share (std::move (allocator), size);
49
+ blob->copyIn (data, size);
50
+ _internal.edges [globalInputs[i]].value = {std::move (blob)};
51
+ }
52
+ void Stream::setInput (uint_lv1 i, mem_manager::SharedForeignBlob blob) {
53
+ auto globalInputs = _internal.topology .globalInputs ();
54
+ ASSERT (i < globalInputs.size (), " input index out of range" );
55
+
56
+ _internal.edges [globalInputs[i]].value = {std::move (blob)};
57
+ }
58
+
59
+ std::vector<uint_lv1> Stream::prepare () {
60
+ auto globalInputs = _internal.topology .globalInputs ();
61
+ std::vector<uint_lv1> unknownInputs;
62
+ for (auto i : range0_ (globalInputs.size ())) {
63
+ if (!_internal.edges [globalInputs[i]].blob ()) {
64
+ unknownInputs.push_back (i);
65
+ }
66
+ }
67
+ if (unknownInputs.empty ()) {
68
+ auto allocator = _resources.fetch <MemManager>()->manager ;
69
+ auto outputs = _internal.topology .globalOutputs ();
70
+ for (auto i : range0_ (outputs.size ())) {
71
+ _internal.edges [outputs[i]].value = {ForeignBlob::share (allocator, _outputsSize[i])};
72
+ }
73
+ }
74
+ return unknownInputs;
75
+ }
35
76
36
77
void Stream::run () {
37
78
auto map = [this ](auto i) { return _internal.edges [i](*_stack); };
0 commit comments