|
Packit Service |
c5cf8c |
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
|
|
Packit Service |
c5cf8c |
/*
|
|
Packit Service |
c5cf8c |
* (C) 2006 by Argonne National Laboratory.
|
|
Packit Service |
c5cf8c |
* See COPYRIGHT in top-level directory.
|
|
Packit Service |
c5cf8c |
*
|
|
Packit Service |
c5cf8c |
* Portions of this code were written by Intel Corporation.
|
|
Packit Service |
c5cf8c |
* Copyright (C) 2011-2016 Intel Corporation. Intel provides this material
|
|
Packit Service |
c5cf8c |
* to Argonne National Laboratory subject to Software Grant and Corporate
|
|
Packit Service |
c5cf8c |
* Contributor License Agreement dated February 8, 2012.
|
|
Packit Service |
c5cf8c |
*/
|
|
Packit Service |
c5cf8c |
#ifndef MPIDPOST_H_INCLUDED
|
|
Packit Service |
c5cf8c |
#define MPIDPOST_H_INCLUDED
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
#include "mpir_datatype.h"
|
|
Packit Service |
c5cf8c |
#include "mpidch4.h"
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX void MPID_Request_create_hook(MPIR_Request * req)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
MPIR_FUNC_VERBOSE_STATE_DECL(MPID_STATE_MPID_REQUEST_CREATE_HOOK);
|
|
Packit Service |
c5cf8c |
MPIR_FUNC_VERBOSE_ENTER(MPID_STATE_MPID_REQUEST_CREATE_HOOK);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPIDI_CH4U_REQUEST(req, req) = NULL;
|
|
Packit Service |
c5cf8c |
#ifndef MPIDI_CH4_DIRECT_NETMOD
|
|
Packit Service |
c5cf8c |
MPIDI_CH4I_REQUEST_ANYSOURCE_PARTNER(req) = NULL;
|
|
Packit Service |
c5cf8c |
#endif
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPIR_FUNC_VERBOSE_EXIT(MPID_STATE_MPID_REQUEST_CREATE_HOOK);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX void MPID_Request_free_hook(MPIR_Request * req)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
MPIR_FUNC_VERBOSE_STATE_DECL(MPID_STATE_MPID_REQUEST_FREE_HOOK);
|
|
Packit Service |
c5cf8c |
MPIR_FUNC_VERBOSE_ENTER(MPID_STATE_MPID_REQUEST_FREE_HOOK);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
OPA_incr_int(&MPIDI_CH4_Global.progress_count);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if (req->kind == MPIR_REQUEST_KIND__PREQUEST_RECV &&
|
|
Packit Service |
c5cf8c |
NULL != MPIDI_CH4I_REQUEST_ANYSOURCE_PARTNER(req))
|
|
Packit Service |
c5cf8c |
MPIR_Request_free(MPIDI_CH4I_REQUEST_ANYSOURCE_PARTNER(req));
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPIR_FUNC_VERBOSE_EXIT(MPID_STATE_MPID_REQUEST_FREE_HOOK);
|
|
Packit Service |
c5cf8c |
return;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX void MPID_Request_destroy_hook(MPIR_Request * req)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
MPIR_FUNC_VERBOSE_STATE_DECL(MPID_STATE_MPID_REQUEST_DESTROY_HOOK);
|
|
Packit Service |
c5cf8c |
MPIR_FUNC_VERBOSE_ENTER(MPID_STATE_MPID_REQUEST_DESTROY_HOOK);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPIR_FUNC_VERBOSE_EXIT(MPID_STATE_MPID_REQUEST_DESTROY_HOOK);
|
|
Packit Service |
c5cf8c |
return;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/*
|
|
Packit Service |
c5cf8c |
Device override hooks for asynchronous progress threads
|
|
Packit Service |
c5cf8c |
*/
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX int MPID_Init_async_thread(void)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
return MPIR_Init_async_thread();
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX int MPID_Finalize_async_thread(void)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
return MPIR_Finalize_async_thread();
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX int MPID_Test(MPIR_Request * request_ptr, int *flag, MPI_Status * status)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
return MPIR_Test_impl(request_ptr, flag, status);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX int MPID_Testall(int count, MPIR_Request * request_ptrs[],
|
|
Packit Service |
c5cf8c |
int *flag, MPI_Status array_of_statuses[],
|
|
Packit Service |
c5cf8c |
int requests_property)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
return MPIR_Testall_impl(count, request_ptrs, flag, array_of_statuses, requests_property);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX int MPID_Testany(int count, MPIR_Request * request_ptrs[],
|
|
Packit Service |
c5cf8c |
int *indx, int *flag, MPI_Status * status)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
return MPIR_Testany_impl(count, request_ptrs, indx, flag, status);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX int MPID_Testsome(int incount, MPIR_Request * request_ptrs[],
|
|
Packit Service |
c5cf8c |
int *outcount, int array_of_indices[],
|
|
Packit Service |
c5cf8c |
MPI_Status array_of_statuses[])
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
return MPIR_Testsome_impl(incount, request_ptrs, outcount, array_of_indices, array_of_statuses);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
#ifdef MPICH_THREAD_USE_MDTA
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX int MPID_Waitall(int count, MPIR_Request * request_ptrs[],
|
|
Packit Service |
c5cf8c |
MPI_Status array_of_statuses[], int request_properties)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
const int single_threaded = !MPIR_ThreadInfo.isThreaded;
|
|
Packit Service |
c5cf8c |
int mpi_errno = MPI_SUCCESS;
|
|
Packit Service |
c5cf8c |
int i;
|
|
Packit Service |
c5cf8c |
MPIR_Thread_sync_t *sync = NULL;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if (likely(single_threaded))
|
|
Packit Service |
c5cf8c |
return MPIR_Waitall_impl(count, request_ptrs, array_of_statuses, request_properties);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPIR_Thread_sync_alloc(&sync, count);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* Fix up number of pending requests and attach the sync. */
|
|
Packit Service |
c5cf8c |
for (i = 0; i < count; i++) {
|
|
Packit Service |
c5cf8c |
if (request_ptrs[i] == NULL || MPIR_Request_is_complete(request_ptrs[i])) {
|
|
Packit Service |
c5cf8c |
MPIR_Thread_sync_signal(sync, 0);
|
|
Packit Service |
c5cf8c |
} else {
|
|
Packit Service |
c5cf8c |
MPIR_Request_attach_sync(request_ptrs[i], sync);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* Wait on the synchronization object. */
|
|
Packit Service |
c5cf8c |
MPIR_Thread_sync_wait(sync);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* Either being signaled, or become a server, so we poll from now. */
|
|
Packit Service |
c5cf8c |
mpi_errno = MPIR_Waitall_impl(count, request_ptrs, array_of_statuses, request_properties);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPIR_Thread_sync_free(sync);
|
|
Packit Service |
c5cf8c |
if (mpi_errno)
|
|
Packit Service |
c5cf8c |
MPIR_ERR_POP(mpi_errno);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_exit:
|
|
Packit Service |
c5cf8c |
return mpi_errno;
|
|
Packit Service |
c5cf8c |
fn_fail:
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX int MPID_Wait(MPIR_Request * request_ptr, MPI_Status * status)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
const int single_threaded = !MPIR_ThreadInfo.isThreaded;
|
|
Packit Service |
c5cf8c |
int mpi_errno = MPI_SUCCESS;
|
|
Packit Service |
c5cf8c |
MPIR_Thread_sync_t *sync = NULL;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if (likely(single_threaded))
|
|
Packit Service |
c5cf8c |
return MPIR_Wait_impl(request_ptr, status);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if (request_ptr == NULL || MPIR_Request_is_complete(request_ptr))
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* The request cannot be completed immediately, wait on a sync. */
|
|
Packit Service |
c5cf8c |
MPIR_Thread_sync_alloc(&sync, 1);
|
|
Packit Service |
c5cf8c |
MPIR_Request_attach_sync(request_ptr, sync);
|
|
Packit Service |
c5cf8c |
MPIR_Thread_sync_wait(sync);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* Either being signaled, or become a server, so we poll from now. */
|
|
Packit Service |
c5cf8c |
mpi_errno = MPIR_Wait_impl(request_ptr, status);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPIR_Thread_sync_free(sync);
|
|
Packit Service |
c5cf8c |
if (mpi_errno)
|
|
Packit Service |
c5cf8c |
MPIR_ERR_POP(mpi_errno);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_exit:
|
|
Packit Service |
c5cf8c |
return mpi_errno;
|
|
Packit Service |
c5cf8c |
fn_fail:
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
#else
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX int MPID_Waitall(int count, MPIR_Request * request_ptrs[],
|
|
Packit Service |
c5cf8c |
MPI_Status array_of_statuses[], int request_properties)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
return MPIR_Waitall_impl(count, request_ptrs, array_of_statuses, request_properties);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX int MPID_Wait(MPIR_Request * request_ptr, MPI_Status * status)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
return MPIR_Wait_impl(request_ptr, status);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
#endif /* MPICH_THREAD_USE_MDTA */
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX int MPID_Waitany(int count, MPIR_Request * request_ptrs[],
|
|
Packit Service |
c5cf8c |
int *indx, MPI_Status * status)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
return MPIR_Waitany_impl(count, request_ptrs, indx, status);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPL_STATIC_INLINE_PREFIX int MPID_Waitsome(int incount, MPIR_Request * request_ptrs[],
|
|
Packit Service |
c5cf8c |
int *outcount, int array_of_indices[],
|
|
Packit Service |
c5cf8c |
MPI_Status array_of_statuses[])
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
return MPIR_Waitsome_impl(incount, request_ptrs, outcount, array_of_indices, array_of_statuses);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
#endif /* MPIDPOST_H_INCLUDED */
|