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 + -
显示快捷键?