Skip to content

Commit aec6ae5

Browse files
committed
Added binding of dash::Array.local
1 parent 4bc0415 commit aec6ae5

File tree

4 files changed

+134
-49
lines changed

4 files changed

+134
-49
lines changed

bindings/src/Init.cc

+95-8
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,28 @@ namespace {
6969
static void bind_type_array(
7070
py::module & mod,
7171
std::string const & suffix) {
72-
using dash_array_t = dash::Array<T>;
73-
using pydash_array_t = py::class_<
74-
dash_array_t,
75-
std::shared_ptr<dash_array_t> >;
76-
using iterator_t = typename dash_array_t::iterator;
72+
using dash_array_t = dash::Array<T>;
73+
using dash_larray_t = typename dash_array_t::local_type;
74+
75+
using pydash_array_t = py::class_<
76+
dash_array_t,
77+
std::shared_ptr<dash_array_t> >;
78+
79+
using pydash_larray_t = py::class_<
80+
dash_larray_t,
81+
std::shared_ptr<dash_larray_t> >;
82+
83+
using iterator_t = typename dash_array_t::iterator;
84+
using literator_t = typename dash_larray_t::iterator;
7785

7886
typedef typename dash_array_t::index_type index_t;
7987
typedef typename dash_array_t::size_type extent_t;
8088
typedef typename dash_array_t::pattern_type pattern_t;
8189

90+
// ===================================================================
91+
// dash::Array
92+
// -------------------------------------------------------------------
93+
8294
pydash_array_t py_array(mod, ("Array" + suffix).c_str());
8395

8496
py_array.def(py::init<int>());
@@ -169,6 +181,81 @@ namespace {
169181
: dash::distance(arr.begin(), it_min);
170182
}
171183
);
184+
185+
// ===================================================================
186+
// dash::Array::local_type
187+
// -------------------------------------------------------------------
188+
189+
pydash_larray_t py_larray(mod, ("LArray" + suffix).c_str());
190+
191+
// py_larray.def(py::init<int>());
192+
193+
// Usage:
194+
// larray[<local index>] = <new value>
195+
py_larray.def("__setitem__",
196+
[](dash_larray_t & larr, index_t lidx, const T & val) {
197+
if (lidx >= larr.size()) {
198+
throw std::out_of_range("pydash.Array.local: index out of bounds");
199+
}
200+
larr[lidx] = val;
201+
}
202+
);
203+
204+
// Usage:
205+
// val = larray[<local index>]
206+
py_larray.def("__getitem__",
207+
[](dash_larray_t & larr, index_t lidx) -> T {
208+
if (lidx >= larr.size()) {
209+
throw std::out_of_range("pydash.Array.local: index out of bounds");
210+
}
211+
return larr[lidx];
212+
},
213+
// ref + keepalive
214+
py::return_value_policy::reference_internal
215+
);
216+
217+
py_larray.def("__iter__",
218+
[](dash_larray_t & larr) {
219+
return py::make_iterator<
220+
py::return_value_policy::reference_internal,
221+
literator_t, literator_t, T &
222+
>(larr.begin(), larr.end());
223+
},
224+
// Essential: keep list alive while iterator exists
225+
py::keep_alive<0, 1>()
226+
);
227+
228+
// Usage:
229+
// larray.size() -> int
230+
py_larray.def("size",
231+
(index_t (dash_larray_t::*)(void))
232+
(&dash_larray_t::size)
233+
);
234+
235+
// Usage:
236+
// larray.set(<local index>, <new value>)
237+
py_larray.def("set",
238+
[](dash_larray_t & larr, long idx, const T & val) {
239+
larr[idx] = val;
240+
}
241+
);
242+
// Usage:
243+
// larray.get(<local index>) -> T
244+
py_larray.def("get",
245+
[](dash_larray_t & larr, long idx) {
246+
return static_cast<T>(larr[idx]);
247+
}
248+
);
249+
250+
// ===================================================================
251+
// dash::Array.local
252+
// -------------------------------------------------------------------
253+
254+
// Usage:
255+
// array.local -> LArray
256+
py_array.def_readwrite("local",
257+
(&dash_array_t::local)
258+
);
172259
}
173260

174261
}
@@ -203,9 +290,9 @@ PYBIND11_PLUGIN(pydash) {
203290
(bool (*)(void)) &(dash::is_initialized),
204291
"Check whether DASH has been initialized.");
205292

206-
m.def("is_multithreaded",
207-
(bool (*)(void)) &(dash::is_multithreaded),
208-
"Check whether DASH supports multi-threaded access.");
293+
// m.def("is_multithreaded",
294+
// (bool (*)(void)) &(dash::is_multithreaded),
295+
// "Check whether DASH supports multi-threaded access.");
209296

210297
m.def("myid",
211298
&(dash::myid),

test/test_array_local.py

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import pydash
2+
import time
3+
4+
pydash.initialize(0, "")
5+
6+
myid = pydash.myid().id()
7+
nunits = pydash.nunits()
8+
9+
# Collectively instantiate array:
10+
array = pydash.ArrayInt(3 * nunits)
11+
12+
# Initialize array:
13+
for l in range(0,array.local.size()):
14+
array.local[l] = 100 * (1 + myid) + l
15+
16+
pydash.barrier()
17+
18+
for u in range(0,nunits):
19+
if u == myid:
20+
for lelem in array.local:
21+
print("unit {} Array.local[]: {}".format(myid, lelem))
22+
pydash.barrier()
23+
24+
time.sleep(1)
25+
pydash.barrier()
26+
27+
if myid == 0:
28+
for gi in range(0,array.size()):
29+
print("Array[{}]: {}".format(gi, array[gi]))
30+
31+
pydash.barrier()
32+
33+
pydash.finalize()

test/test_conditional_execution.py

-32
This file was deleted.

test/test_logval.py

+6-9
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,26 @@
77
nunits = pydash.nunits()
88

99
# Collectively instantiate array:
10-
array = pydash.ArrayLV(3)
10+
array = pydash.ArrayLV(nunits)
1111

1212
if myid == 0:
13-
print(myid)
1413
#time.sleep(20)
15-
array[0] = pydash.LV(myid, "first")
14+
array[0] = pydash.LV(myid, 'A')
1615

1716
if myid == 1:
18-
print(myid)
1917
#time.sleep(10)
20-
array[1] = pydash.LV(myid, "second")
18+
array[1] = pydash.LV(myid, 'B')
2119

2220
if myid == 2:
23-
print(myid)
2421
#time.sleep(0)
25-
array[2] = pydash.LV(myid, "third")
22+
array[2] = pydash.LV(myid, 'C')
2623

2724
pydash.barrier()
2825

2926
if myid == 0:
3027
for i in array:
31-
print(i.name)
32-
print(i)
28+
print("Array element global reference: {} value: {}"
29+
.format(i, i.get().name()))
3330

3431
pydash.finalize()
3532

0 commit comments

Comments
 (0)