📄 req_wait.c
字号:
for( completed = i = 0; i < count; i++ ) { request = *rptr++; if (request->req_complete == true) { completed++; } }#endif /* OMPI_HAVE_THREAD_SUPPORT */ while( completed != count ) { /* check number of pending requests */ size_t start = ompi_request_completed; size_t pending = count - completed; /* * wait until at least pending requests complete */ while (pending > ompi_request_completed - start) { opal_condition_wait(&ompi_request_cond, &ompi_request_lock); } /* * confirm that all pending operations have completed. */ rptr = requests; for( completed = i = 0; i < count; i++ ) { request = *rptr++; if (request->req_complete == true) { completed++; } } } ompi_request_waiting--; OPAL_THREAD_UNLOCK(&ompi_request_lock); } rptr = requests; if (MPI_STATUSES_IGNORE != statuses) { /* fill out status and free request if required */ for( i = 0; i < count; i++, rptr++ ) { request = *rptr; assert( true == request->req_complete ); if (OMPI_REQUEST_GEN == request->req_type) { ompi_grequest_invoke_query(request, &request->req_status); } if( request->req_state == OMPI_REQUEST_INACTIVE ) { statuses[i] = ompi_status_empty; } else { statuses[i] = request->req_status; } if( request->req_persistent ) { request->req_state = OMPI_REQUEST_INACTIVE; } else { /* Only free the request if there is no error on it */ if (MPI_SUCCESS == request->req_status.MPI_ERROR) { /* If there's an error while freeing the request, assume that the request is still there. Otherwise, Bad Things will happen later! */ int tmp = ompi_request_free(rptr); if (OMPI_SUCCESS != tmp) { mpi_error = tmp; } } } if( statuses[i].MPI_ERROR != OMPI_SUCCESS) { mpi_error = MPI_ERR_IN_STATUS; } } } else { /* free request if required */ for( i = 0; i < count; i++, rptr++ ) { int rc; request = *rptr; assert( true == request->req_complete ); /* Per note above, we have to call gen request query_fn even if STATUSES_IGNORE was provided */ if (OMPI_REQUEST_GEN == request->req_type) { rc = ompi_grequest_invoke_query(request, &request->req_status); } if( request->req_state == OMPI_REQUEST_INACTIVE ) { rc = ompi_status_empty.MPI_ERROR; } else { rc = request->req_status.MPI_ERROR; } if( request->req_persistent ) { request->req_state = OMPI_REQUEST_INACTIVE; } else if (MPI_SUCCESS == rc) { /* Only free the request if there is no error on it */ int tmp = ompi_request_free(rptr); if (OMPI_SUCCESS != tmp) { mpi_error = tmp; } } if( rc != OMPI_SUCCESS) { mpi_error = rc; } } } return mpi_error;}int ompi_request_wait_some( size_t count, ompi_request_t ** requests, int * outcount, int * indices, ompi_status_public_t * statuses){#if OMPI_ENABLE_PROGRESS_THREADS int c;#endif size_t i, num_requests_null_inactive=0, num_requests_done=0; int rc = MPI_SUCCESS; ompi_request_t **rptr=NULL; ompi_request_t *request=NULL; *outcount = 0; for (i = 0; i < count; i++){ indices[i] = 0; }#if OMPI_ENABLE_PROGRESS_THREADS /* poll for completion */ OPAL_THREAD_ADD32(&opal_progress_thread_count,1); for (c = 0; c < opal_progress_spin_count; c++) { rptr = requests; num_requests_null_inactive = 0; num_requests_done = 0; for (i = 0; i < count; i++, rptr++) { request = *rptr; /* * Check for null or completed persistent request. * For MPI_REQUEST_NULL, the req_state is always OMPI_REQUEST_INACTIVE */ if (request->req_state == OMPI_REQUEST_INACTIVE ) { num_requests_null_inactive++; continue; } if (true == request->req_complete) { indices[i] = 1; num_requests_done++; } } if (num_requests_null_inactive == count || num_requests_done > 0) { OPAL_THREAD_ADD32(&opal_progress_thread_count,-1); goto finished; } opal_progress(); } OPAL_THREAD_ADD32(&opal_progress_thread_count,-1);#endif /* * We only get here when outcount still is 0. * give up and sleep until completion */ OPAL_THREAD_LOCK(&ompi_request_lock); ompi_request_waiting++; do { rptr = requests; num_requests_null_inactive = 0; num_requests_done = 0; for (i = 0; i < count; i++, rptr++) { request = *rptr; /* * Check for null or completed persistent request. * For MPI_REQUEST_NULL, the req_state is always OMPI_REQUEST_INACTIVE. */ if( request->req_state == OMPI_REQUEST_INACTIVE ) { num_requests_null_inactive++; continue; } if (request->req_complete == true) { indices[i] = 1; num_requests_done++; } } if (num_requests_null_inactive == count || num_requests_done > 0) break; opal_condition_wait(&ompi_request_cond, &ompi_request_lock); } while (1); ompi_request_waiting--; OPAL_THREAD_UNLOCK(&ompi_request_lock);#if OMPI_ENABLE_PROGRESS_THREADSfinished:#endif /* OMPI_ENABLE_PROGRESS_THREADS */ if(num_requests_null_inactive == count) { *outcount = MPI_UNDEFINED; } else { /* * Compress the index array. */ for (i = 0, num_requests_done = 0; i < count; i++) { if (0 != indices[i]) { indices[num_requests_done++] = i; } } *outcount = num_requests_done; for (i = 0; i < num_requests_done; i++) { request = requests[indices[i]]; assert( true == request->req_complete ); /* return status */ /* Per note above, we have to call gen request query_fn even if STATUS_IGNORE was provided */ if (OMPI_REQUEST_GEN == request->req_type) { ompi_grequest_invoke_query(request, &request->req_status); } if (MPI_STATUSES_IGNORE != statuses) { statuses[i] = request->req_status; } if (MPI_SUCCESS != request->req_status.MPI_ERROR) { rc = MPI_ERR_IN_STATUS; } if( request->req_persistent ) { request->req_state = OMPI_REQUEST_INACTIVE; } else { /* Only free the request if there was no error */ if (MPI_SUCCESS == request->req_status.MPI_ERROR) { int tmp; tmp = ompi_request_free(&(requests[indices[i]])); if (OMPI_SUCCESS != tmp) { return tmp; } } } } } return rc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -