⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 req_wait.c

📁 MPI stands for the Message Passing Interface. Written by the MPI Forum (a large committee comprising
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -