numba_mpi.api.requests

Utilities for handling MPI_Requests with respective Wait and Test function wrappers.

  1"""Utilities for handling MPI_Requests with respective Wait and Test function
  2wrappers.
  3"""
  4
  5import ctypes
  6
  7import numba
  8import numpy as np
  9from numba.core import types
 10from numba.core.extending import overload
 11
 12from numba_mpi.common import (
 13    RequestType,
 14    _MpiRequestPtr,
 15    _MpiStatusPtr,
 16    create_status_buffer,
 17    libmpi,
 18)
 19
 20
 21@numba.njit
 22def _allocate_numpy_array_of_request_handles(count=1):
 23    """Helper function for creating numpy array storing pointers to MPI_Request handles."""
 24    return np.empty(count, dtype=RequestType)
 25
 26
 27_MPI_Wait = libmpi.MPI_Wait
 28_MPI_Wait.restype = ctypes.c_int
 29_MPI_Wait.argtypes = [_MpiRequestPtr, _MpiStatusPtr]
 30
 31
 32@numba.njit
 33def wait(request):
 34    """Wrapper for MPI_Wait. Returns integer status code (0 == MPI_SUCCESS).
 35    Status is currently not handled. Requires 'request' parameter to be a
 36    c-style pointer to MPI_Request (such as returned by 'isend'/'irecv').
 37
 38    Uninitialized contents of 'request' (e.g., from numpy.empty()) may
 39    cause invalid pointer dereference and segmentation faults.
 40    """
 41
 42    status_buffer = create_status_buffer()
 43    status = _MPI_Wait(request.ctypes.data, status_buffer.ctypes.data)
 44
 45    return status
 46
 47
 48_MPI_Waitall = libmpi.MPI_Waitall
 49_MPI_Waitall.restype = ctypes.c_int
 50_MPI_Waitall.argtypes = [ctypes.c_int, _MpiRequestPtr, _MpiStatusPtr]
 51
 52
 53@numba.njit
 54def _waitall_array_impl(requests):
 55    """MPI_Waitall implementation for contiguous numpy arrays of MPI_Requests"""
 56
 57    status_buffer = create_status_buffer(requests.size)
 58
 59    status = _MPI_Waitall(
 60        requests.size, requests.ctypes.data, status_buffer.ctypes.data
 61    )
 62
 63    return status
 64
 65
 66def waitall(requests):
 67    """Wrapper for MPI_Waitall. Returns integer status code (0 == MPI_SUCCESS).
 68    Status is currently not handled. Requires 'requests' parameter to be an
 69    array or tuple of MPI_Request objects.
 70
 71    Uninitialized contents of 'requests' (e.g., from numpy.empty()) may
 72    cause invalid pointer dereference and segmentation faults.
 73    """
 74    if isinstance(requests, np.ndarray):
 75        return _waitall_array_impl(requests)
 76
 77    if isinstance(requests, (list, tuple)):
 78        request_buffer = np.hstack(requests)
 79        return _waitall_array_impl(request_buffer)
 80
 81    raise TypeError("Invalid type for array of MPI_Request objects")
 82
 83
 84@overload(waitall)
 85def _waitall_impl(requests):
 86    """List of overloads for MPI_Waitall implementation"""
 87
 88    if isinstance(requests, types.Array):
 89
 90        def impl(requests):
 91            return _waitall_array_impl(requests)
 92
 93    elif isinstance(requests, types.UniTuple):
 94
 95        def impl(requests):
 96            req_buffer = np.hstack(requests)
 97            return _waitall_array_impl(req_buffer)
 98
 99    else:
100        raise TypeError("Invalid type for array of MPI_Request objects")
101
102    return impl
103
104
105_MPI_Waitany = libmpi.MPI_Waitany
106_MPI_Waitany.restype = ctypes.c_int
107_MPI_Waitany.argtypes = [ctypes.c_int, _MpiRequestPtr, ctypes.c_void_p, _MpiStatusPtr]
108
109
110@numba.njit
111def _waitany_array_impl(requests):
112    """MPI_Waitany implementation for contiguous numpy arrays of MPI_Requests"""
113
114    status_buffer = create_status_buffer()
115    index = np.empty(1, dtype=np.intc)
116
117    status = _MPI_Waitany(
118        requests.size,
119        requests.ctypes.data,
120        index.ctypes.data,
121        status_buffer.ctypes.data,
122    )
123
124    return status, index[0]
125
126
127def waitany(requests):
128    """Wrapper for MPI_Waitany. Returns tuple of integers, first representing
129    status; second - the index of request that was completed. Status is
130    currently not handled. Requires 'requests' parameter to be an array
131    or tuple of MPI_Request objects.
132
133    Uninitialized contents of 'requests' (e.g., from numpy.empty()) may
134    cause invalid pointer dereference and segmentation faults.
135    """
136
137    if isinstance(requests, np.ndarray):
138        return _waitany_array_impl(requests)
139
140    if isinstance(requests, (list, tuple)):
141        request_buffer = np.hstack(requests)
142        return _waitany_array_impl(request_buffer)
143
144    raise TypeError("Invalid type for array of MPI_Request objects")
145
146
147@overload(waitany)
148def _waitany_impl(requests):
149    """List of overloads for MPI_Waitany implementation"""
150
151    if isinstance(requests, types.Array):
152
153        def impl(requests):
154            return _waitany_array_impl(requests)
155
156    elif isinstance(requests, types.UniTuple):
157
158        def impl(requests):
159            req_buffer = np.hstack(requests)
160            return _waitany_array_impl(req_buffer)
161
162    else:
163        raise TypeError("Invalid type for array of MPI_Request objects")
164
165    return impl
166
167
168_MPI_Test = libmpi.MPI_Test
169_MPI_Test.restype = ctypes.c_int
170_MPI_Test.argtypes = [_MpiRequestPtr, ctypes.c_void_p, _MpiStatusPtr]
171
172
173@numba.njit
174def test(request):
175    """Wrapper for MPI_Test. Returns tuple containing both status and boolean
176    flag that indicates whether given request is completed. Status is currently
177    not handled. Requires 'request' parameter to be a c-style pointer to
178    MPI_Request (such as returned by 'isend'/'irecv').
179
180    Uninitialized contents of 'request' (e.g., from numpy.empty()) may
181    cause invalid pointer dereference and segmentation faults.
182    """
183
184    status_buffer = create_status_buffer()
185    flag = np.empty(1, dtype=np.intc)
186
187    status = _MPI_Test(request.ctypes.data, flag.ctypes.data, status_buffer.ctypes.data)
188
189    return status, flag[0] != 0
190
191
192_MPI_Testall = libmpi.MPI_Testall
193_MPI_Testall.restype = ctypes.c_int
194_MPI_Testall.argtypes = [ctypes.c_int, _MpiRequestPtr, ctypes.c_void_p, _MpiStatusPtr]
195
196
197@numba.njit
198def _testall_array_impl(requests):
199    """MPI_Testall implementation for contiguous numpy arrays of MPI_Requests"""
200
201    status_buffer = create_status_buffer(requests.size)
202    flag = np.empty(1, dtype=np.intc)
203    status = _MPI_Testall(
204        requests.size,
205        requests.ctypes.data,
206        flag.ctypes.data,
207        status_buffer.ctypes.data,
208    )
209
210    return status, flag[0] != 0
211
212
213def testall(requests):
214    """Wrapper for MPI_Testall. Returns tuple containing both status and boolean
215    flag that indicates whether given request is completed. Status is currently
216    not handled. Requires 'requests' parameter to be an array or tuple of
217    MPI_Request objects.
218
219    Uninitialized contents of 'requests' (e.g., from numpy.empty()) may
220    cause invalid pointer dereference and segmentation faults.
221    """
222    if isinstance(requests, np.ndarray):
223        return _testall_array_impl(requests)
224
225    if isinstance(requests, (list, tuple)):
226        request_buffer = np.hstack(requests)
227        return _testall_array_impl(request_buffer)
228
229    raise TypeError("Invalid type for array of MPI_Request objects")
230
231
232@overload(testall)
233def _testall_impl(requests):
234    """List of overloads for MPI_Testall implementation"""
235
236    if isinstance(requests, types.Array):
237
238        def impl(requests):
239            return _testall_array_impl(requests)
240
241    elif isinstance(requests, types.UniTuple):
242
243        def impl(requests):
244            req_buffer = np.hstack(requests)
245            return _testall_array_impl(req_buffer)
246
247    else:
248        raise TypeError("Invalid type for array of MPI_Request objects")
249
250    return impl
251
252
253_MPI_Testany = libmpi.MPI_Testany
254_MPI_Testany.restype = ctypes.c_int
255_MPI_Testany.argtypes = [
256    ctypes.c_int,
257    _MpiRequestPtr,
258    ctypes.c_void_p,
259    ctypes.c_void_p,
260    _MpiStatusPtr,
261]
262
263
264@numba.njit
265def _testany_array_impl(requests):
266    """MPI_Testany implementation for contiguous numpy arrays of MPI_Requests"""
267
268    status_buffer = create_status_buffer()
269    flag = np.empty(1, dtype=np.intc)
270    index = np.empty(1, dtype=np.intc)
271    status = _MPI_Testany(
272        requests.size,
273        requests.ctypes.data,
274        index.ctypes.data,
275        flag.ctypes.data,
276        status_buffer.ctypes.data,
277    )
278
279    return status, flag[0] != 0, index[0]
280
281
282def testany(requests):
283    """Wrapper for MPI_Testany. Returns tuple containing status, boolean flag
284    that indicates whether any of requests is completed, and index of request
285    that is guaranteed to be completed. Requires 'requests' parameter to be an
286    array or tuple of MPI_Request objects.
287
288    Uninitialized contents of 'requests' (e.g., from numpy.empty()) may
289    cause invalid pointer dereference and segmentation faults.
290    """
291
292    if isinstance(requests, np.ndarray):
293        return _testany_array_impl(requests)
294
295    if isinstance(requests, (list, tuple)):
296        request_buffer = np.hstack(requests)
297        return _testany_array_impl(request_buffer)
298
299    raise TypeError("Invalid type for array of MPI_Request objects")
300
301
302@overload(testany)
303def _testany_impl(requests):
304    """List of overloads for MPI_Testany implementation"""
305
306    if isinstance(requests, types.Array):
307
308        def impl(requests):
309            return _testany_array_impl(requests)
310
311    elif isinstance(requests, types.UniTuple):
312
313        def impl(requests):
314            req_buffer = np.hstack(requests)
315            return _testany_array_impl(req_buffer)
316
317    else:
318        raise TypeError("Invalid type for array of MPI_Request objects")
319
320    return impl
@numba.njit
def wait(request):
33@numba.njit
34def wait(request):
35    """Wrapper for MPI_Wait. Returns integer status code (0 == MPI_SUCCESS).
36    Status is currently not handled. Requires 'request' parameter to be a
37    c-style pointer to MPI_Request (such as returned by 'isend'/'irecv').
38
39    Uninitialized contents of 'request' (e.g., from numpy.empty()) may
40    cause invalid pointer dereference and segmentation faults.
41    """
42
43    status_buffer = create_status_buffer()
44    status = _MPI_Wait(request.ctypes.data, status_buffer.ctypes.data)
45
46    return status

Wrapper for MPI_Wait. Returns integer status code (0 == MPI_SUCCESS). Status is currently not handled. Requires 'request' parameter to be a c-style pointer to MPI_Request (such as returned by 'isend'/'irecv').

Uninitialized contents of 'request' (e.g., from numpy.empty()) may cause invalid pointer dereference and segmentation faults.

def waitall(requests):
67def waitall(requests):
68    """Wrapper for MPI_Waitall. Returns integer status code (0 == MPI_SUCCESS).
69    Status is currently not handled. Requires 'requests' parameter to be an
70    array or tuple of MPI_Request objects.
71
72    Uninitialized contents of 'requests' (e.g., from numpy.empty()) may
73    cause invalid pointer dereference and segmentation faults.
74    """
75    if isinstance(requests, np.ndarray):
76        return _waitall_array_impl(requests)
77
78    if isinstance(requests, (list, tuple)):
79        request_buffer = np.hstack(requests)
80        return _waitall_array_impl(request_buffer)
81
82    raise TypeError("Invalid type for array of MPI_Request objects")

Wrapper for MPI_Waitall. Returns integer status code (0 == MPI_SUCCESS). Status is currently not handled. Requires 'requests' parameter to be an array or tuple of MPI_Request objects.

Uninitialized contents of 'requests' (e.g., from numpy.empty()) may cause invalid pointer dereference and segmentation faults.

def waitany(requests):
128def waitany(requests):
129    """Wrapper for MPI_Waitany. Returns tuple of integers, first representing
130    status; second - the index of request that was completed. Status is
131    currently not handled. Requires 'requests' parameter to be an array
132    or tuple of MPI_Request objects.
133
134    Uninitialized contents of 'requests' (e.g., from numpy.empty()) may
135    cause invalid pointer dereference and segmentation faults.
136    """
137
138    if isinstance(requests, np.ndarray):
139        return _waitany_array_impl(requests)
140
141    if isinstance(requests, (list, tuple)):
142        request_buffer = np.hstack(requests)
143        return _waitany_array_impl(request_buffer)
144
145    raise TypeError("Invalid type for array of MPI_Request objects")

Wrapper for MPI_Waitany. Returns tuple of integers, first representing status; second - the index of request that was completed. Status is currently not handled. Requires 'requests' parameter to be an array or tuple of MPI_Request objects.

Uninitialized contents of 'requests' (e.g., from numpy.empty()) may cause invalid pointer dereference and segmentation faults.

@numba.njit
def test(request):
174@numba.njit
175def test(request):
176    """Wrapper for MPI_Test. Returns tuple containing both status and boolean
177    flag that indicates whether given request is completed. Status is currently
178    not handled. Requires 'request' parameter to be a c-style pointer to
179    MPI_Request (such as returned by 'isend'/'irecv').
180
181    Uninitialized contents of 'request' (e.g., from numpy.empty()) may
182    cause invalid pointer dereference and segmentation faults.
183    """
184
185    status_buffer = create_status_buffer()
186    flag = np.empty(1, dtype=np.intc)
187
188    status = _MPI_Test(request.ctypes.data, flag.ctypes.data, status_buffer.ctypes.data)
189
190    return status, flag[0] != 0

Wrapper for MPI_Test. Returns tuple containing both status and boolean flag that indicates whether given request is completed. Status is currently not handled. Requires 'request' parameter to be a c-style pointer to MPI_Request (such as returned by 'isend'/'irecv').

Uninitialized contents of 'request' (e.g., from numpy.empty()) may cause invalid pointer dereference and segmentation faults.

def testall(requests):
214def testall(requests):
215    """Wrapper for MPI_Testall. Returns tuple containing both status and boolean
216    flag that indicates whether given request is completed. Status is currently
217    not handled. Requires 'requests' parameter to be an array or tuple of
218    MPI_Request objects.
219
220    Uninitialized contents of 'requests' (e.g., from numpy.empty()) may
221    cause invalid pointer dereference and segmentation faults.
222    """
223    if isinstance(requests, np.ndarray):
224        return _testall_array_impl(requests)
225
226    if isinstance(requests, (list, tuple)):
227        request_buffer = np.hstack(requests)
228        return _testall_array_impl(request_buffer)
229
230    raise TypeError("Invalid type for array of MPI_Request objects")

Wrapper for MPI_Testall. Returns tuple containing both status and boolean flag that indicates whether given request is completed. Status is currently not handled. Requires 'requests' parameter to be an array or tuple of MPI_Request objects.

Uninitialized contents of 'requests' (e.g., from numpy.empty()) may cause invalid pointer dereference and segmentation faults.

def testany(requests):
283def testany(requests):
284    """Wrapper for MPI_Testany. Returns tuple containing status, boolean flag
285    that indicates whether any of requests is completed, and index of request
286    that is guaranteed to be completed. Requires 'requests' parameter to be an
287    array or tuple of MPI_Request objects.
288
289    Uninitialized contents of 'requests' (e.g., from numpy.empty()) may
290    cause invalid pointer dereference and segmentation faults.
291    """
292
293    if isinstance(requests, np.ndarray):
294        return _testany_array_impl(requests)
295
296    if isinstance(requests, (list, tuple)):
297        request_buffer = np.hstack(requests)
298        return _testany_array_impl(request_buffer)
299
300    raise TypeError("Invalid type for array of MPI_Request objects")

Wrapper for MPI_Testany. Returns tuple containing status, boolean flag that indicates whether any of requests is completed, and index of request that is guaranteed to be completed. Requires 'requests' parameter to be an array or tuple of MPI_Request objects.

Uninitialized contents of 'requests' (e.g., from numpy.empty()) may cause invalid pointer dereference and segmentation faults.