71 this->reverseData = data;
72 this->deleteDataFunc =
func;
109 inline void AMPI_Wait_b(HandleBase* handle, AdjointInterface* adjointInterface);
110 inline void AMPI_Wait_d(HandleBase* handle, AdjointInterface* adjointInterface);
168 if(
nullptr != request->
start
176 if(
nullptr != request->
func
177 && (
nullptr == request->
start
184 if(
nullptr == request->
start) {
193 MPI_Request* converted =
new MPI_Request[count];
195 for(
int i = 0; i < count; ++i) {
196 converted[i] = array[i].
request;
202#if MEDI_MPI_VERSION_1_0 <= MEDI_MPI_TARGET
208 int rStatus = MPI_Wait(&request->
request, status);
216#if MEDI_MPI_VERSION_1_0 <= MEDI_MPI_TARGET
223 int rStatus = MPI_Test(&request->
request, flag, status);
233#if MEDI_MPI_VERSION_1_0 <= MEDI_MPI_TARGET
243 return MPI_Start(&request->
request);
247#if MEDI_MPI_VERSION_1_0 <= MEDI_MPI_TARGET
249 MPI_Request* array =
convertToMPI(array_of_requests, count);
251 for(
int i = 0; i < count; ++i) {
257 int rStatus = MPI_Startall(count, array);
265#if MEDI_MPI_VERSION_1_0 <= MEDI_MPI_TARGET
271 if(
nullptr != request->
end &&
false == request->
isActive) {
274 MEDI_EXCEPTION(
"Freeing a handle that is not finish with wait, waitall, etc..");
277 int rStatus = MPI_Request_free(&request->
request);
284#if MEDI_MPI_VERSION_1_0 <= MEDI_MPI_TARGET
286 MPI_Request* array =
convertToMPI(array_of_requests, count);
288 int rStatus = MPI_Waitany(count, array, index, status);
290 if(MPI_UNDEFINED != *index) {
300#if MEDI_MPI_VERSION_1_0 <= MEDI_MPI_TARGET
302 MPI_Request* array =
convertToMPI(array_of_requests, count);
304 int rStatus = MPI_Testany(count, array, index, flag, status);
307 if(MPI_UNDEFINED != *index) {
318#if MEDI_MPI_VERSION_1_0 <= MEDI_MPI_TARGET
320 MPI_Request* array =
convertToMPI(array_of_requests, count);
322 int rStatus = MPI_Waitall(count, array, array_of_statuses);
324 for(
int i = 0; i < count; ++i) {
336#if MEDI_MPI_VERSION_1_0 <= MEDI_MPI_TARGET
338 MPI_Request* array =
convertToMPI(array_of_requests, count);
340 int rStatus = MPI_Testall(count, array, flag, array_of_statuses);
343 for(
int i = 0; i < count; ++i) {
356#if MEDI_MPI_VERSION_1_0 <= MEDI_MPI_TARGET
358 MPI_Request* array =
convertToMPI(array_of_requests, incount);
360 int rStatus = MPI_Waitsome(incount, array, outcount, array_of_indices, array_of_statuses);
362 for(
int i = 0; i < *outcount; ++i) {
363 int index = array_of_indices[i];
375#if MEDI_MPI_VERSION_1_0 <= MEDI_MPI_TARGET
377 MPI_Request* array =
convertToMPI(array_of_requests, incount);
379 int rStatus = MPI_Testsome(incount, array, outcount, array_of_indices, array_of_statuses);
381 for(
int i = 0; i < *outcount; ++i) {
382 int index = array_of_indices[i];
394#if MEDI_MPI_VERSION_3_0 <= MEDI_MPI_TARGET
397 int rStatus = MPI_Ibarrier(comm, &request->
request);
398 request->
func =
nullptr;
#define AMPI_Status
Definition ampiDefinitions.h:772
#define AMPI_Comm
Definition ampiDefinitions.h:778
Definition adjointInterface.hpp:40
#define MEDI_EXCEPTION(...)
Generates an exception.
Definition exceptions.hpp:44
Global namespace for MeDiPack - Message Differentiation Package.
Definition adjointInterface.hpp:37
@ Wait
Definition typeDefinitions.h:42
@ Async
Definition typeDefinitions.h:41
void(* DeleteReverseData)(void *data)
Definition async.hpp:41
int AMPI_Testsome(int incount, AMPI_Request *array_of_requests, int *outcount, int *array_of_indices, MPI_Status *array_of_statuses)
Definition async.hpp:376
MPI_Request * convertToMPI(AMPI_Request *array, int count)
Definition async.hpp:192
bool operator!=(const AMPI_Request &a, const AMPI_Request &b)
Definition async.hpp:86
void AMPI_Wait_iterOut(HandleBase *handle, CallbackFunc func, void *userData)
void performReverseAction(AMPI_Request *request)
Definition async.hpp:175
int AMPI_Testany(int count, AMPI_Request *array_of_requests, int *index, int *flag, MPI_Status *status)
Definition async.hpp:301
int AMPI_Startall(int count, AMPI_Request *array_of_requests)
Definition async.hpp:248
int AMPI_Waitall(int count, AMPI_Request *array_of_requests, MPI_Status *array_of_statuses)
Definition async.hpp:319
void(* ForwardFunction)(HandleBase *h, AdjointInterface *a)
Definition typeDefinitions.h:49
void AMPI_Wait_iterIn(HandleBase *handle, CallbackFunc func, void *userData)
Definition async.hpp:161
int AMPI_Start(AMPI_Request *request)
Definition async.hpp:234
void(*)(void *id, void *userData) CallbackFunc
Definition typeDefinitions.h:45
int AMPI_Test(AMPI_Request *request, int *flag, MPI_Status *status)
Definition async.hpp:217
void(* IterateIdsFunction)(HandleBase *h, CallbackFunc func, void *userData)
Definition typeDefinitions.h:51
int AMPI_Request_free(AMPI_Request *request)
Definition async.hpp:266
const AMPI_Request AMPI_REQUEST_NULL
Definition async.cpp:35
int AMPI_Waitany(int count, AMPI_Request *array_of_requests, int *index, MPI_Status *status)
Definition async.hpp:285
void AMPI_Wait_b(HandleBase *handle, AdjointInterface *adjointInterface)
Definition async.hpp:143
int AMPI_Wait(AMPI_Request *request, MPI_Status *status)
Definition async.hpp:203
int(* ContinueFunction)(HandleBase *h)
Definition typeDefinitions.h:52
int AMPI_Waitsome(int incount, AMPI_Request *array_of_requests, int *outcount, int *array_of_indices, MPI_Status *array_of_statuses)
Definition async.hpp:357
int AMPI_Ibarrier(MPI_Comm comm, AMPI_Request *request)
Definition async.hpp:395
int AMPI_Testall(int count, AMPI_Request *array_of_requests, int *flag, MPI_Status *array_of_statuses)
Definition async.hpp:337
bool operator==(const AMPI_Request &a, const AMPI_Request &b)
Definition async.hpp:82
void(* ReverseFunction)(HandleBase *h, AdjointInterface *a)
Definition typeDefinitions.h:48
void AMPI_Wait_d(HandleBase *handle, AdjointInterface *adjointInterface)
Definition async.hpp:149
void performStartAction(AMPI_Request *request)
Definition async.hpp:167
void AMPI_Wait_iter_empty(HandleBase *handle, CallbackFunc func, void *userData)
Definition async.hpp:155
AsyncHandle * handle
Definition async.hpp:47
DeleteReverseData deleteDataFunc
Definition async.hpp:58
AMPI_Request()
Definition async.hpp:60
void deleteReverseData()
Definition async.hpp:75
void * reverseData
Definition async.hpp:57
ContinueFunction start
Definition async.hpp:52
ContinueFunction end
Definition async.hpp:53
MPI_Request request
Definition async.hpp:46
ContinueFunction func
Definition async.hpp:48
void setReverseData(void *data, DeleteReverseData func)
Definition async.hpp:70
bool isActive
Definition async.hpp:54
AMPI_Request requestReverse
Definition async.hpp:95
AsyncAdjointHandle()
Definition async.hpp:97
struct WaitHandle * waitHandle
Definition async.hpp:94
AsyncAdjointHandle * toolHandle
Definition async.hpp:103
AsyncHandle()
Definition async.hpp:105
Definition typeDefinitions.h:57
IterateIdsFunction funcIterateOutputIds
Definition typeDefinitions.h:67
ManualDeleteType deleteType
Definition typeDefinitions.h:65
IterateIdsFunction funcIterateInputIds
Definition typeDefinitions.h:66
ReverseFunction funcReverse
Definition typeDefinitions.h:62
HandleBase()
Definition typeDefinitions.h:69
ForwardFunction funcForward
Definition typeDefinitions.h:63
AsyncAdjointHandle * adjointHandle
Definition async.hpp:117
ForwardFunction finishFuncForward
Definition async.hpp:116
WaitHandle(ReverseFunction finishFuncReverse, ForwardFunction finishFuncForward, AsyncAdjointHandle *handle)
Definition async.hpp:121
IterateIdsFunction original_funcIterateInputIds
Definition async.hpp:119
ReverseFunction finishFuncReverse
Definition async.hpp:115