btl_mx_component.c

来自「MPI stands for the Message Passing Inter」· C语言 代码 · 共 468 行 · 第 1/2 页

C
468
字号
/* * 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 (c) 2007      Los Alamos National Security, LLC.  All rights *                         reserved.  * $COPYRIGHT$ *  * Additional copyrights may follow *  * $HEADER$ */#include "ompi_config.h"#include "ompi/constants.h"#include "opal/event/event.h"#include "opal/util/if.h"#include "opal/util/argv.h"#include "opal/util/output.h"#include "ompi/mca/pml/pml.h"#include "ompi/mca/btl/btl.h"#include "opal/mca/base/mca_base_param.h"#include "ompi/mca/pml/base/pml_base_module_exchange.h"#include "orte/mca/errmgr/errmgr.h"#include "ompi/mca/mpool/base/base.h" #include "ompi/mca/common/mx/common_mx.h"#include "btl_mx.h"#include "btl_mx_frag.h"#include "btl_mx_endpoint.h" #include "ompi/mca/btl/base/base.h" #include "ompi/mca/btl/base/btl_base_error.h"mca_btl_mx_component_t mca_btl_mx_component = {    {        /* First, the mca_base_component_t struct containing meta information           about the component itself */        {            /* Indicate that we are a pml v1.0.0 component (which also implies a               specific MCA version) */            MCA_BTL_BASE_VERSION_1_0_1,            "mx", /* MCA component name */            OMPI_MAJOR_VERSION,  /* MCA component major version */            OMPI_MINOR_VERSION,  /* MCA component minor version */            OMPI_RELEASE_VERSION,  /* MCA component release version */            mca_btl_mx_component_open,  /* component open */            mca_btl_mx_component_close  /* component close */        },        /* Next the MCA v1.0.0 component meta data */        {            /* Whether the component is checkpointable or not */            false        },        mca_btl_mx_component_init,          mca_btl_mx_component_progress,    }};/* *  Called by MCA framework to open the component, registers *  component parameters. */int mca_btl_mx_component_open(void){    int tmp;    /* initialize state */    mca_btl_mx_component.mx_num_btls = 0;    mca_btl_mx_component.mx_btls = NULL;        /* initialize objects */     OBJ_CONSTRUCT(&mca_btl_mx_component.mx_procs, opal_list_t);    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "max_btls",                            "Maximum number of accepted Myrinet cards",                            false, false, 1, &mca_btl_mx_component.mx_max_btls );    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "timeout",                            "Timeout for connections",                            false, false, 10000, &mca_btl_mx_component.mx_timeout );    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "retries",                            "Number of retries for each new connection before considering the peer as unreacheable",                            false, false, 20, &mca_btl_mx_component.mx_connection_retries );    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "filter",                            "Unique ID for the application (used to connect to the peers)",                            false, false, 0xdeadbeef, &mca_btl_mx_component.mx_filter );    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "shared_mem",                            "Enable the MX support for shared memory",                            false, true, 0, &mca_btl_mx_component.mx_support_sharedmem );    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "free_list_num",                            "Number of allocated default request",                            false, false, 8, &mca_btl_mx_component.mx_free_list_num );    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "free_list_inc",                            "Number of request we allocate each time we miss some",                            false, false, 32, &mca_btl_mx_component.mx_free_list_inc );    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "free_list_max",                            "Maximum number of request this device is allowed to allocate",                            false, false, 128, &mca_btl_mx_component.mx_free_list_max );    /* The ompi_free_list has a problem if the (max - num) is not     * divisible by the increament. So make sure it is ...     */    if( (mca_btl_mx_component.mx_free_list_max - mca_btl_mx_component.mx_free_list_num) %        mca_btl_mx_component.mx_free_list_inc ) {        int overhead = (mca_btl_mx_component.mx_free_list_max - mca_btl_mx_component.mx_free_list_num) %            mca_btl_mx_component.mx_free_list_inc;        mca_btl_mx_component.mx_free_list_max -= overhead;    }    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "max_posted_recv",                            "Number of received posted in advance. Increasing this number for communication bound application can lead to visible improvement in performances",                            false, false, 16, &mca_btl_mx_component.mx_max_posted_recv );    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "exclusivity",                            "Priority compared with the others devices (used only when several devices are available",                            false, false, 50, (int*) &mca_btl_mx_module.super.btl_exclusivity );    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "first_frag_size",                            "Size of the first fragment for the rendez-vous protocol over MX",                            true, true, 16*1024 - 20, &tmp);    mca_btl_mx_module.super.btl_eager_limit = tmp;    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "min_send_size",                            "Minimum send fragment size ...",                            false, false, 32*1024 - 40, &tmp);    mca_btl_mx_module.super.btl_min_send_size = tmp;    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "max_send_size",                            "Maximum send fragment size withour RDMA ...",                            false, false, 128*1024, &tmp);    mca_btl_mx_module.super.btl_max_send_size = tmp;    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "min_rdma_size",                            "Minimum size of fragment for the RDMA protocol",                            false, false, 1024*1024, &tmp);    mca_btl_mx_module.super.btl_min_rdma_size = tmp;    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "max_rdma_size",                            "Maximum size of fragment for the RDMA protocol",                            false, false, 1024*1024, &tmp);    mca_btl_mx_module.super.btl_max_rdma_size = tmp;    mca_base_param_reg_int( (mca_base_component_t*)&mca_btl_mx_component, "flags",                            "Flags to activate/deactivate the RDMA",                            true, false, MCA_BTL_FLAGS_PUT, (int*)&mca_btl_mx_module.super.btl_flags );    return OMPI_SUCCESS;}/* * component cleanup - sanity checking of queue lengths */int mca_btl_mx_component_close(void){    if( NULL == mca_btl_mx_component.mx_btls )        return OMPI_SUCCESS;        if(OMPI_SUCCESS != ompi_common_mx_finalize()) {         return OMPI_ERROR;    }    /* release resources */    OBJ_DESTRUCT(&mca_btl_mx_component.mx_send_eager_frags);    OBJ_DESTRUCT(&mca_btl_mx_component.mx_send_user_frags);    OBJ_DESTRUCT(&mca_btl_mx_component.mx_recv_frags);    OBJ_DESTRUCT(&mca_btl_mx_component.mx_procs);    OBJ_DESTRUCT(&mca_btl_mx_component.mx_pending_acks);    OBJ_DESTRUCT(&mca_btl_mx_component.mx_lock);    return OMPI_SUCCESS;}/* * Create and intialize an MX PTL module, where each module * represents a specific NIC. */static mca_btl_mx_module_t* mca_btl_mx_create(uint64_t addr){    mca_btl_mx_module_t* mx_btl;    mx_return_t status;    uint32_t nic_id;    status = mx_nic_id_to_board_number( addr, &nic_id );    if( MX_SUCCESS != status ) {        return NULL;    }    mx_btl = malloc(sizeof(mca_btl_mx_module_t));    if( NULL == mx_btl ) return NULL;    /* copy over default settings */    memcpy( mx_btl, &mca_btl_mx_module, sizeof(mca_btl_mx_module_t) );    mx_btl->super.btl_flags = MCA_BTL_FLAGS_SEND_INPLACE; /* | MCA_BTL_FLAGS_PUT;*/    OBJ_CONSTRUCT( &mx_btl->mx_peers, opal_list_t );    OBJ_CONSTRUCT( &mx_btl->mx_lock, opal_mutex_t );    /* open local endpoint */    status = mx_open_endpoint( nic_id, MX_ANY_ENDPOINT,                               mca_btl_mx_component.mx_filter,                               NULL, 0, &mx_btl->mx_endpoint);    if(status != MX_SUCCESS) {        opal_output(0, "mca_btl_mx_init: mx_open_endpoint() failed with status=%d\n", status);        mx_btl->mx_endpoint = NULL;        mca_btl_mx_finalize( &mx_btl->super );        return NULL;    }    /* query the endpoint address */    if((status = mx_get_endpoint_addr( mx_btl->mx_endpoint,                                       &mx_btl->mx_endpoint_addr)) != MX_SUCCESS) {        opal_output(0, "mca_btl_mx_init: mx_get_endpoint_addr() failed with status=%d\n", status);        mca_btl_mx_finalize( &mx_btl->super );        return NULL;    }    return mx_btl;}/* *  MX component initialization: *  - check if MX can be initialized. *  - and construct all static objects. */mca_btl_base_module_t** mca_btl_mx_component_init(int *num_btl_modules, 

⌨️ 快捷键说明

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