Skip to content

Commit 7c4c814

Browse files
committed
pass custom wrapper to task
1 parent 6a88e15 commit 7c4c814

22 files changed

+366
-359
lines changed

examples/1_resources.cpp

+6-4
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,22 @@
66
*/
77

88
#include <redGrapes/redGrapes.hpp>
9+
#include <redGrapes/resource/fieldresource.hpp>
10+
#include <redGrapes/resource/ioresource.hpp>
911

1012
#include <iostream>
1113

1214
int main(int, char*[])
1315
{
1416
auto rg = redGrapes::init(1);
1517

16-
auto a = rg.createFieldResource<std::vector<int>>();
17-
auto b = rg.createIOResource<int>();
18-
auto c = rg.createIOResource<int>();
18+
auto a = redGrapes::FieldResource<std::vector<int>>();
19+
auto b = redGrapes::IOResource<int>();
20+
auto c = redGrapes::IOResource<int>();
1921

2022
redGrapes::ResourceUser user1(
2123
{a.read(), // complete resource
22-
a.write().area({0}, {10}), // write only indices 0 to 10
24+
a.write({0}, {10}), // write only indices 0 to 10
2325
b.write()},
2426
0,
2527
0);

examples/3_functors_with_resources.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ int main(void)
1717
spdlog::set_level(spdlog::level::trace);
1818
auto rg = redGrapes::init();
1919

20-
auto a = rg.createIOResource<int>();
21-
auto b = rg.createIOResource<int>();
20+
auto a = redGrapes::IOResource<int>();
21+
auto b = redGrapes::IOResource<int>();
2222

2323
for(int i = 0; i < 1; ++i)
2424
{

examples/5_access_demotion.cpp

+21-18
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
#include <redGrapes/redGrapes.hpp>
99
#include <redGrapes/resource/access/io.hpp>
10-
#include <redGrapes/resource/resource.hpp>
1110
#include <redGrapes/resource/ioresource.hpp>
11+
#include <redGrapes/resource/resource.hpp>
1212

1313
#include <chrono>
1414
#include <iostream>
@@ -20,23 +20,26 @@ int main(int, char*[])
2020
{
2121
spdlog::set_level(spdlog::level::trace);
2222
auto rg = rg::init();
23-
auto a = rg.createIOResource<int>();
24-
25-
rg.emplace_task(
26-
[&](auto a)
27-
{
28-
std::cout << "f1 writes A" << std::endl;
29-
std::this_thread::sleep_for(std::chrono::seconds(1));
30-
31-
std::cout << "f1 now only reads A" << std::endl;
32-
rg.update_properties(decltype(rg)::RGTask::TaskProperties::Patch::Builder()
33-
.remove_resources({a})
34-
.add_resources({rg::newAccess(a, rg::access::IOAccess(rg::access::IOAccess::read))}));
35-
std::this_thread::sleep_for(std::chrono::seconds(1));
36-
37-
std::cout << "f1 done" << std::endl;
38-
},
39-
a.write());
23+
auto a = redGrapes::IOResource<int>();
24+
25+
// Access demotion is not implemented
26+
27+
// rg.emplace_task(
28+
// [&](auto a)
29+
// {
30+
// std::cout << "f1 writes A" << std::endl;
31+
// std::this_thread::sleep_for(std::chrono::seconds(1));
32+
33+
// std::cout << "f1 now only reads A" << std::endl;
34+
// rg.update_properties(decltype(rg)::RGTask::TaskProperties::Patch::Builder()
35+
// .remove_resources({a})
36+
// .add_resources({rg::newAccess(a,
37+
// rg::access::IOAccess(rg::access::IOAccess::read))}));
38+
// std::this_thread::sleep_for(std::chrono::seconds(1));
39+
40+
// std::cout << "f1 done" << std::endl;
41+
// },
42+
// a.write());
4043

4144
rg.emplace_task(
4245
[]([[maybe_unused]] auto a)

examples/6_resource_scope.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ namespace rg = redGrapes;
1515
int main()
1616
{
1717
auto rg = rg::init(1);
18-
auto a = rg.createIOResource<int>(); // scope-level=0
18+
auto a = redGrapes::IOResource<int>(); // scope-level=0
1919

2020
rg.emplace_task(
2121
[&]([[maybe_unused]] auto a)
2222
{
2323
std::cout << "scope = " << rg.scope_depth() << std::endl;
24-
auto b = rg.createIOResource<int>(); // scope-level=1
24+
auto b = redGrapes::IOResource<int>(); // scope-level=1
2525

2626
rg.emplace_task(
2727
[&](auto b)

examples/7_event.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_OFF
99

1010
#include <redGrapes/redGrapes.hpp>
11+
#include <redGrapes/resource/ioresource.hpp>
1112

1213
#include <chrono>
1314
#include <iostream>

examples/8_child_destruction.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -17,35 +17,35 @@ int main()
1717
spdlog::set_level(spdlog::level::off);
1818

1919
auto rg = redGrapes::init(1);
20-
auto a = rg.createIOResource<int>(1);
20+
auto a = redGrapes::IOResource<int>(1);
2121

2222
rg.emplace_task(
2323
[&rg]([[maybe_unused]] auto a)
2424
{
2525
std::cout << "scope = " << rg.scope_depth() << " a = " << *a << std::endl;
26-
26+
auto a2 = redGrapes::IOResource(a);
2727
rg.emplace_task(
2828
[&rg](auto a)
2929
{
3030
*a = 2;
3131
std::cout << "scope = " << rg.scope_depth() << " a = " << *a << std::endl;
3232
},
33-
a);
33+
a2.write());
3434
rg.emplace_task(
3535
[&rg](auto a)
3636
{
3737
*a = 3;
3838
std::cout << "scope = " << rg.scope_depth() << " a = " << *a << std::endl;
39-
auto b = redGrapes::IOResource(a.first);
39+
auto a3 = redGrapes::IOResource(a);
4040
rg.emplace_task(
41-
[&rg](auto b)
41+
[&rg](auto a)
4242
{
43-
std::cout << "scope = " << rg.scope_depth() << " a = " << *b << std::endl;
44-
*b = 4;
43+
std::cout << "scope = " << rg.scope_depth() << " a = " << *a << std::endl;
44+
*a = 4;
4545
},
46-
b.write());
46+
a3.write());
4747
},
48-
a);
48+
a2.write());
4949

5050
*a = 4;
5151
std::cout << "scope = " << rg.scope_depth() << " a = " << *a << std::endl;

examples/cholesky.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ void print_matrix(std::vector<redGrapes::IOResource<double*>> A, int nblks, int
2323
{
2424
for(int jb = 0; jb < blocksize; ++jb)
2525
{
26-
std::cout << (*A[ja * nblks + ia].read())[jb * blocksize + ib] << "; ";
26+
std::cout << (*A[ja * nblks + ia].getObject())[jb * blocksize + ib] << "; ";
2727
}
2828
}
2929
std::cout << std::endl;
@@ -84,7 +84,8 @@ int main(int argc, char* argv[])
8484
for(size_t ib = 0; ib < blksz; ++ib)
8585
for(size_t ja = 0; ja < nblks; ++ja)
8686
for(size_t jb = 0; jb < blksz; ++jb)
87-
(*A[ja * nblks + ia].write())[jb * blksz + ib] = Alin[(ia * blksz + ib) + (ja * blksz + jb) * N];
87+
(*A[ja * nblks + ia].getObject())[jb * blksz + ib]
88+
= Alin[(ia * blksz + ib) + (ja * blksz + jb) * N];
8889

8990
print_matrix(A, nblks, blksz);
9091

examples/game_of_life.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,8 @@ int main(int, char*[])
123123
dst[{x + xi, y + yi}]
124124
= next_state((Cell const(*)[size.x + 2]) & (src[{x + xi, y + yi}]));
125125
},
126-
buffers[next].write().area({x, y}, {x + chunk_size.x, y + chunk_size.y}),
127-
buffers[current].read().area({x - 1, y - 1}, {x + chunk_size.x + 2, y + chunk_size.y + 2}));
126+
buffers[next].write({x, y}, {x + chunk_size.x, y + chunk_size.y}),
127+
buffers[current].read({x - 1, y - 1}, {x + chunk_size.x + 2, y + chunk_size.y + 2}));
128128

129129
current = next;
130130
}

examples/mpi.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ int main()
140140

141141
mpi_request_pool->get_status(request);
142142
},
143-
field[current].at({3}).read(),
143+
field[current].read({3}),
144144
mpi_config.read())
145145
.enable_stack_switching();
146146

@@ -158,18 +158,18 @@ int main()
158158
int recv_data_count;
159159
MPI_Get_count(&status, MPI_CHAR, &recv_data_count);
160160
},
161-
field[current].at({0}).write(),
161+
field[current].write({0}),
162162
mpi_config.read())
163163
.enable_stack_switching();
164164

165165
/*
166166
* Compute iteration
167167
*/
168-
for(size_t i = 1; i < field[current]->size(); ++i)
168+
for(size_t i = 1; i < field[current].getObject()->size(); ++i)
169169
rg.emplace_task(
170170
[i](auto dst, auto src) { dst[{i}] = src[{i - 1}]; },
171-
field[next].at({i}).write(),
172-
field[current].at({i - 1}).read());
171+
field[next].write({i}),
172+
field[current].read({i - 1}));
173173

174174
/*
175175
* Write Output

redGrapes/redGrapes.hpp

+4-27
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
#include "redGrapes/SchedulerDescription.hpp"
1111
#include "redGrapes/TaskFreeCtx.hpp"
1212
#include "redGrapes/globalSpace.hpp"
13-
#include "redGrapes/resource/fieldresource.hpp"
14-
#include "redGrapes/resource/ioresource.hpp"
1513
#include "redGrapes/scheduler/event.hpp"
1614
#include "redGrapes/scheduler/pool_scheduler.hpp"
1715
#include "redGrapes/task/task.hpp"
@@ -139,7 +137,10 @@ namespace redGrapes
139137

140138
SPDLOG_TRACE("emplace task to worker {}", worker_id);
141139

142-
using Impl = typename std::invoke_result_t<BindArgs<Callable, Args...>, Callable, Args...>;
140+
using Impl = typename std::invoke_result_t<
141+
BindArgs<Callable, decltype(forward_arg(std::declval<Args>()))...>,
142+
Callable,
143+
decltype(forward_arg(std::declval<Args>()))...>;
143144
// this is not set to nullptr. But it goes out of scope. Memory is managed by allocate
144145
FunTask<Impl, RGTask>* task;
145146
memory::Allocator alloc(worker_id);
@@ -177,30 +178,6 @@ namespace redGrapes
177178
return getScheduler<DefaultTag>();
178179
}
179180

180-
template<typename Container>
181-
auto createFieldResource(Container* c) -> FieldResource<Container>
182-
{
183-
return FieldResource<Container>(c);
184-
}
185-
186-
template<typename Container, typename... Args>
187-
auto createFieldResource(Args&&... args) -> FieldResource<Container>
188-
{
189-
return FieldResource<Container>(std::forward<Args>(args)...);
190-
}
191-
192-
template<typename T>
193-
auto createIOResource(std::shared_ptr<T> const& o) -> IOResource<T>
194-
{
195-
return IOResource<T>(o);
196-
}
197-
198-
template<typename T, typename... Args>
199-
auto createIOResource(Args&&... args) -> IOResource<T>
200-
{
201-
return IOResource<T>(std::forward<Args>(args)...);
202-
}
203-
204181
template<typename AccessPolicy>
205182
auto createResource() -> Resource<AccessPolicy>
206183
{

redGrapes/resource/access/field.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@
1111

1212
#pragma once
1313

14-
#include "redGrapes/resource/access/area.hpp"
1514
#include "redGrapes/resource/access/combine.hpp"
1615
#include "redGrapes/resource/access/io.hpp"
16+
#include "redGrapes/resource/access/range.hpp"
1717

1818
namespace redGrapes
1919
{
2020
namespace access
2121
{
2222

2323
template<size_t dimension_t>
24-
using FieldAccess = CombineAccess<IOAccess, ArrayAccess<AreaAccess, dimension_t, And_t>, And_t>;
24+
using FieldAccess = CombineAccess<IOAccess, ArrayAccess<RangeAccess, dimension_t, And_t>, And_t>;
2525

2626
} // namespace access
2727

redGrapes/resource/access/area.hpp renamed to redGrapes/resource/access/range.hpp

+10-10
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@ namespace redGrapes
2020
{
2121
namespace access
2222
{
23-
24-
struct AreaAccess : std::array<size_t, 2>
23+
// Must be in increasing order
24+
struct RangeAccess : std::array<size_t, 2>
2525
{
26-
AreaAccess()
26+
RangeAccess()
2727
{
2828
(*this)[0] = std::numeric_limits<size_t>::min();
2929
(*this)[1] = std::numeric_limits<size_t>::max();
3030
}
3131

32-
AreaAccess(std::array<size_t, 2> a) : std::array<size_t, 2>(a)
32+
RangeAccess(std::array<size_t, 2> a) : std::array<size_t, 2>(a)
3333
{
3434
}
3535

@@ -39,17 +39,17 @@ namespace redGrapes
3939
&& (*this)[1] == std::numeric_limits<size_t>::max();
4040
}
4141

42-
static bool is_serial(AreaAccess const& a, AreaAccess const& b)
42+
static bool is_serial(RangeAccess const& a, RangeAccess const& b)
4343
{
44-
return (a[1] > b[0]) && (a[0] < b[1]);
44+
return !((a[1] <= b[0]) || (a[0] >= b[1]));
4545
}
4646

47-
bool is_superset_of(AreaAccess const& a) const
47+
bool is_superset_of(RangeAccess const& a) const
4848
{
4949
return (((*this)[0] <= a[0]) && ((*this)[1] >= a[1]));
5050
}
5151

52-
bool operator==(AreaAccess const& other) const
52+
bool operator==(RangeAccess const& other) const
5353
{
5454
return (*this)[0] == other[0] && (*this)[1] == other[1];
5555
}
@@ -62,15 +62,15 @@ namespace redGrapes
6262
} // namespace redGrapes
6363

6464
template<>
65-
struct fmt::formatter<redGrapes::access::AreaAccess>
65+
struct fmt::formatter<redGrapes::access::RangeAccess>
6666
{
6767
constexpr auto parse(format_parse_context& ctx)
6868
{
6969
return ctx.begin();
7070
}
7171

7272
template<typename FormatContext>
73-
auto format(redGrapes::access::AreaAccess const& acc, FormatContext& ctx) const
73+
auto format(redGrapes::access::RangeAccess const& acc, FormatContext& ctx)
7474
{
7575
return fmt::format_to(ctx.out(), "{{ \"area\" : {{ \"begin\" : {}, \"end\" : {} }} }}", acc[0], acc[1]);
7676
}

0 commit comments

Comments
 (0)