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

📄 rmgr_base_context.c

📁 MPI stands for the Message Passing Interface. Written by the MPI Forum (a large committee comprising
💻 C
字号:
/* * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana *                         University Research and Technology *                         Corporation.  All rights reserved. * Copyright (c) 2004-2005 The University of Tennessee and The University *                         of Tennessee Research Foundation.  All rights *                         reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, *                         University of Stuttgart.  All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. *                         All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ */#include "orte_config.h"#include "orte/orte_constants.h"#include <errno.h>#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#include <string.h>#include "opal/util/trace.h"#include "orte/mca/gpr/gpr.h"#include "orte/mca/ns/ns.h"#include "orte/mca/errmgr/errmgr.h"#include "orte/mca/rmgr/base/rmgr_private.h"/* *  Create the job segment and initialize the application context. */int orte_rmgr_base_put_app_context(    orte_jobid_t jobid,    orte_app_context_t** app_context,    orte_std_cntr_t num_context){    orte_gpr_value_t *value;    orte_std_cntr_t i;    orte_std_cntr_t job_slots;    int rc;    char *segment;    OPAL_TRACE(2);    rc = orte_rmgr_base_get_job_slots(jobid, &job_slots);    if(ORTE_SUCCESS != rc) {        return rc;    }    /* put context info on the job segment of the registry */    if(ORTE_SUCCESS != (rc = orte_schema.get_job_segment_name(&segment, jobid))) {        return rc;    }        if (ORTE_SUCCESS != (rc = orte_gpr.create_value(&value, ORTE_GPR_OVERWRITE,                                                    segment, num_context, 1))) {        ORTE_ERROR_LOG(rc);        free(segment);        return rc;    }    free(segment); /* don't need this any more */    value->tokens[0] = strdup(ORTE_JOB_GLOBALS);    for(i=0; i<num_context; i++) {        orte_app_context_t* app = app_context[i];        app->idx = i;        if (ORTE_SUCCESS != (rc = orte_gpr.create_keyval(&(value->keyvals[i]),                                                         ORTE_JOB_APP_CONTEXT_KEY,                                                         ORTE_APP_CONTEXT,                                                         app))) {            ORTE_ERROR_LOG(rc);            goto cleanup;        }        job_slots += app->num_procs;    }    rc = orte_gpr.put(1, &value);    if(ORTE_SUCCESS != rc) {        goto cleanup;    }    rc = orte_rmgr_base_set_job_slots(jobid, job_slots); /* JJH C/N napping breaks here */cleanup:    OBJ_RELEASE(value);    return rc;}/* * Comparison function for sorting context by index. */static int orte_rmgr_base_cmp_app_context(    orte_app_context_t** app1,    orte_app_context_t** app2){    OPAL_TRACE(3);    if ((*app1)->idx < (*app2)->idx) {        return -1;    } else if((*app1)->idx > (*app2)->idx) {        return 1;    }    return 0;}/* *  Retreive the application context */int orte_rmgr_base_get_app_context(    orte_jobid_t jobid,    orte_app_context_t*** app_context,    orte_std_cntr_t* num_context){    char *segment;    char *tokens[2];    char *keys[2];    orte_gpr_value_t** values = NULL;    orte_std_cntr_t i, num_values = 0, index = 0;    int rc;    OPAL_TRACE(2);    /* get the job segment name */    if(ORTE_SUCCESS != (rc = orte_schema.get_job_segment_name(&segment, jobid)))        return rc;    tokens[0] = ORTE_JOB_GLOBALS;    tokens[1] = NULL;    keys[0] = ORTE_JOB_APP_CONTEXT_KEY;    keys[1] = NULL;    rc = orte_gpr.get(        ORTE_GPR_TOKENS_OR,        segment,        tokens,        keys,        &num_values,        &values        );    if (rc != ORTE_SUCCESS) {        goto cleanup;    }    *num_context = 0;    for(i=0; i<num_values; i++) {        *num_context += values[i]->cnt;    }    if (0 == *num_context) {        *app_context = NULL;        return ORTE_SUCCESS;    }    *app_context = (orte_app_context_t**)malloc(*num_context * sizeof(orte_app_context_t*));    for(i=0; i<num_values; i++) {        orte_gpr_value_t* value = values[i];        orte_gpr_keyval_t** keyvals = value->keyvals;        orte_std_cntr_t k;        for(k=0; k < value->cnt; k++) {            if (ORTE_SUCCESS != (rc = orte_dss.get((void**)&((*app_context)[index++]), keyvals[k]->value, ORTE_APP_CONTEXT))) {                ORTE_ERROR_LOG(rc);                goto cleanup;            }            keyvals[k]->value->data = NULL;  /* protect the data storage from later release */        }    }    qsort(*app_context, *num_context, sizeof(orte_app_context_t*),        (int (*)(const void*,const void*))orte_rmgr_base_cmp_app_context);cleanup:    for(i=0; i<num_values; i++) {        OBJ_RELEASE(values[i]);    }    if(NULL != values)        free(values);    free(segment);    return rc;}/* * Query for the total number of process slots requested for the job. */int orte_rmgr_base_get_job_slots(orte_jobid_t jobid, orte_std_cntr_t* proc_slots){    char *segment;    char *tokens[2];    char *keys[2];    orte_gpr_value_t** values = NULL;    orte_std_cntr_t i, num_values = 0, *ps;    int rc;    OPAL_TRACE(2);    /* query the job segment on the registry */    if(ORTE_SUCCESS != (rc = orte_schema.get_job_segment_name(&segment, jobid)))        return rc;    tokens[0] = ORTE_JOB_GLOBALS;    tokens[1] = NULL;    keys[0] = ORTE_JOB_SLOTS_KEY;    keys[1] = NULL;    rc = orte_gpr.get(        ORTE_GPR_KEYS_OR|ORTE_GPR_TOKENS_OR,        segment,        tokens,        keys,        &num_values,        &values        );    if(rc != ORTE_SUCCESS) {        free(segment);        return rc;    }    free(segment); /* don't need this any more */        if(0 == num_values) {        *proc_slots = 0;        return ORTE_SUCCESS;    }    if(1 != num_values || values[0]->cnt != 1) {        return ORTE_ERR_NOT_FOUND;    }    if (ORTE_SUCCESS != (rc = orte_dss.get((void**)&ps, values[0]->keyvals[0]->value, ORTE_STD_CNTR))) {        ORTE_ERROR_LOG(rc);        return rc;    }    *proc_slots = *ps;    for(i=0; i<num_values; i++)        OBJ_RELEASE(values[i]);    if (NULL != values) free(values);        return ORTE_SUCCESS;}/* * Set the total number of process slots requested for the job. */int orte_rmgr_base_set_job_slots(orte_jobid_t jobid, orte_std_cntr_t proc_slots){    orte_gpr_value_t *value;    char *segment;    int rc;    OPAL_TRACE(2);    /* put context info on the job segment of the registry */    if(ORTE_SUCCESS != (rc = orte_schema.get_job_segment_name(&segment, jobid))) {        ORTE_ERROR_LOG(rc);        return rc;    }    if (ORTE_SUCCESS != (rc = orte_gpr.create_value(&value, ORTE_GPR_OVERWRITE,                                                    segment, 1, 1))) {        ORTE_ERROR_LOG(rc);        free(segment);        return rc;    }    free(segment);    value->tokens[0] = strdup(ORTE_JOB_GLOBALS);    if (ORTE_SUCCESS != (rc = orte_gpr.create_keyval(&(value->keyvals[0]),                                                     ORTE_JOB_SLOTS_KEY,                                                     ORTE_STD_CNTR,                                                     &proc_slots))) {        ORTE_ERROR_LOG(rc);        goto cleanup;    }            if (ORTE_SUCCESS != (rc = orte_gpr.put(1, &value))) {        ORTE_ERROR_LOG(rc);    }    cleanup:    OBJ_RELEASE(value);    return rc;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -