implemented waitall
This commit was SVN r916.
Этот коммит содержится в:
родитель
96f263403a
Коммит
c8ee802625
@ -59,11 +59,53 @@ int mca_pml_teg_wait(
|
||||
}
|
||||
|
||||
|
||||
int mca_pml_teg_waitall(
|
||||
int mca_pml_teg_wait_all(
|
||||
int count,
|
||||
lam_request_t** request,
|
||||
lam_status_public_t* status)
|
||||
lam_request_t** requests,
|
||||
lam_status_public_t* statuses)
|
||||
{
|
||||
int completed, i;
|
||||
|
||||
/*
|
||||
* acquire lock and test for completion - if all requests are not completed
|
||||
* pend on condition variable until a request completes
|
||||
*/
|
||||
lam_mutex_lock(&mca_pml_teg.teg_request_lock);
|
||||
mca_pml_teg.teg_request_waiting++;
|
||||
do {
|
||||
completed = 0;
|
||||
for(i=0; i<count; i++) {
|
||||
mca_pml_base_request_t* pml_request = (mca_pml_base_request_t*)requests[i];
|
||||
if(pml_request == NULL || pml_request->req_mpi_done == true) {
|
||||
completed++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if(completed != count)
|
||||
lam_condition_wait(&mca_pml_teg.teg_request_cond, &mca_pml_teg.teg_request_lock);
|
||||
} while (completed != count);
|
||||
mca_pml_teg.teg_request_waiting--;
|
||||
lam_mutex_unlock(&mca_pml_teg.teg_request_lock);
|
||||
|
||||
/*
|
||||
* fill out completion status and free request if required
|
||||
*/
|
||||
for(i=0; i<count; i++) {
|
||||
mca_pml_base_request_t* pml_request = (mca_pml_base_request_t*)requests[i];
|
||||
if (NULL == pml_request) {
|
||||
if(NULL != statuses)
|
||||
statuses[i] = mca_pml_teg.teg_null.req_status;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (NULL != statuses) {
|
||||
statuses[i] = pml_request->req_status;
|
||||
}
|
||||
if (false == pml_request->req_persistent) {
|
||||
/* return request to pool */
|
||||
mca_pml_teg_free(&requests[i]);
|
||||
}
|
||||
}
|
||||
return LAM_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -5,13 +5,29 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include "mpi.h"
|
||||
#include "runtime/runtime.h"
|
||||
#include "mpi/c/bindings.h"
|
||||
#include "mca/pml/pml.h"
|
||||
|
||||
#if LAM_HAVE_WEAK_SYMBOLS && LAM_PROFILING_DEFINES
|
||||
#pragma weak MPI_Waitall = PMPI_Waitall
|
||||
#endif
|
||||
|
||||
int MPI_Waitall(int count, MPI_Request *array_of_requests,
|
||||
MPI_Status *array_of_statuses) {
|
||||
return MPI_SUCCESS;
|
||||
|
||||
int MPI_Waitall(int count, MPI_Request *requests, MPI_Status *statuses)
|
||||
{
|
||||
int index;
|
||||
if ( MPI_PARAM_CHECK ) {
|
||||
int rc = MPI_SUCCESS;
|
||||
if (lam_mpi_finalized) {
|
||||
rc = MPI_ERR_INTERN;
|
||||
} else if (requests == NULL) {
|
||||
rc = MPI_ERR_REQUEST;
|
||||
}
|
||||
if (rc != MPI_SUCCESS) {
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
return mca_pml.pml_wait_all(count, requests, statuses);
|
||||
}
|
||||
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user