static int component_query(struct ompi_win_t *win, void **base, size_t size, int disp_unit, struct ompi_communicator_t *comm, struct ompi_info_t *info, int flavor) { int ret; if (MPI_WIN_FLAVOR_SHARED == flavor) return -1; ret = PtlGetUid(mca_osc_portals4_component.matching_ni_h, &mca_osc_portals4_component.uid); if (PTL_OK != ret) { opal_output_verbose(1, ompi_osc_base_framework.framework_output, "%s:%d: PtlGetUid failed: %d\n", __FILE__, __LINE__, ret); return OMPI_ERROR; } return 20; }
/* /!\ Called for each processes /!\ */ static int portals4_init_query(bool enable_progress_threads, bool enable_mpi_threads) { int ret; ptl_md_t md; ptl_me_t me; /* Initialize Portals and create a physical, matching interface */ ret = PtlInit(); if (PTL_OK != ret) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: PtlInit failed: %d\n", __FILE__, __LINE__, ret); return OMPI_ERROR; } ret = PtlNIInit(PTL_IFACE_DEFAULT, PTL_NI_PHYSICAL | PTL_NI_MATCHING, PTL_PID_ANY, NULL, &mca_coll_portals4_component.ni_limits, &mca_coll_portals4_component.ni_h); if (PTL_OK != ret) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: PtlNIInit failed: %d\n", __FILE__, __LINE__, ret); return OMPI_ERROR; } ret = PtlGetId(mca_coll_portals4_component.ni_h, &mca_coll_portals4_component.id); if (PTL_OK != ret) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: PtlGetid failed: %d\n", __FILE__, __LINE__, ret); return OMPI_ERROR; } /* FIX ME: Need to make sure our ID matches with the MTL... */ ret = PtlGetUid(mca_coll_portals4_component.ni_h, &mca_coll_portals4_component.uid); if (PTL_OK != ret) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: PtlGetUid failed: %d\n", __FILE__, __LINE__, ret); return OMPI_ERROR; } ret = PtlEQAlloc(mca_coll_portals4_component.ni_h, MCA_COLL_PORTALS4_EQ_SIZE, &mca_coll_portals4_component.eq_h); if (PTL_OK != ret) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: PtlEQAlloc failed: %d\n", __FILE__, __LINE__, ret); return OMPI_ERROR; } ret = PtlPTAlloc(mca_coll_portals4_component.ni_h, 0, mca_coll_portals4_component.eq_h, REQ_COLL_TABLE_ID, &mca_coll_portals4_component.pt_idx); if (PTL_OK != ret) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: PtlPTAlloc failed: %d\n", __FILE__, __LINE__, ret); return OMPI_ERROR; } if (mca_coll_portals4_component.pt_idx != REQ_COLL_TABLE_ID) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: PtlPTAlloc return wrong pt_idx: %d\n", __FILE__, __LINE__, mca_coll_portals4_component.finish_pt_idx); return OMPI_ERROR; } ret = PtlPTAlloc(mca_coll_portals4_component.ni_h, 0, mca_coll_portals4_component.eq_h, REQ_COLL_FINISH_TABLE_ID, &mca_coll_portals4_component.finish_pt_idx); if (PTL_OK != ret) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: PtlPTAlloc failed: %d\n", __FILE__, __LINE__, ret); return OMPI_ERROR; } if (mca_coll_portals4_component.finish_pt_idx != REQ_COLL_FINISH_TABLE_ID) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: PtlPTAlloc return wrong pt_idx: %d\n", __FILE__, __LINE__, mca_coll_portals4_component.finish_pt_idx); return OMPI_ERROR; } /* Bind MD/MDs across all memory. We prefer (for obvious reasons) to have a single MD across all of memory */ memset(&md, 0, sizeof(ptl_md_t)); md.start = 0; md.length = 0; md.options = 0; md.eq_handle = PTL_EQ_NONE; md.ct_handle = PTL_CT_NONE; ret = PtlMDBind(mca_coll_portals4_component.ni_h, &md, &mca_coll_portals4_component.zero_md_h); if (PTL_OK != ret) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: PtlMDBind failed: %d\n", __FILE__, __LINE__, ret); return OMPI_ERROR; } md.start = 0; md.length = PTL_SIZE_MAX; md.options = 0; md.eq_handle = PTL_EQ_NONE; md.ct_handle = PTL_CT_NONE; ret = PtlMDBind(mca_coll_portals4_component.ni_h, &md, &mca_coll_portals4_component.data_md_h); if (PTL_OK != ret) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: PtlMDBind failed: %d\n", __FILE__, __LINE__, ret); return OMPI_ERROR; } OPAL_OUTPUT_VERBOSE((90, ompi_coll_base_framework.framework_output, "PtlMDBind start=%p length=%x\n", md.start, md.length)); /* setup finish ack ME */ me.start = NULL; me.length = 0; me.ct_handle = PTL_CT_NONE; me.min_free = 0; me.uid = mca_coll_portals4_component.uid; me.options = PTL_ME_OP_PUT | PTL_ME_EVENT_LINK_DISABLE | PTL_ME_EVENT_UNLINK_DISABLE; me.match_id.phys.nid = PTL_NID_ANY; me.match_id.phys.pid = PTL_PID_ANY; me.match_bits = 0; me.ignore_bits = 0; ret = PtlMEAppend(mca_coll_portals4_component.ni_h, mca_coll_portals4_component.finish_pt_idx, &me, PTL_PRIORITY_LIST, NULL, &mca_coll_portals4_component.finish_me_h); if (PTL_OK != ret) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: PtlMEAppend of barrier unexpected failed: %d\n", __FILE__, __LINE__, ret); return OMPI_ERROR; } /* This ME is used for RTR exchange only */ me.start = NULL; me.length = 0; me.ct_handle = PTL_CT_NONE; me.min_free = 0; me.uid = mca_coll_portals4_component.uid; me.options = PTL_ME_OP_PUT | PTL_ME_EVENT_SUCCESS_DISABLE | PTL_ME_EVENT_OVER_DISABLE | PTL_ME_EVENT_LINK_DISABLE | PTL_ME_EVENT_UNLINK_DISABLE; me.match_id.phys.nid = PTL_NID_ANY; me.match_id.phys.pid = PTL_PID_ANY; /* Note : the RTR bit must be set to match this ME, * this allows to discriminate the RTR from data flow * (especially for the Barrier operations) */ COLL_PORTALS4_SET_BITS(me.match_bits, 0, 0, 1, 0, 0, 0); me.ignore_bits = ~COLL_PORTALS4_RTR_MASK; ret = PtlMEAppend(mca_coll_portals4_component.ni_h, mca_coll_portals4_component.pt_idx, &me, PTL_OVERFLOW_LIST, NULL, &mca_coll_portals4_component.unex_me_h); if (PTL_OK != ret) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: PtlMEAppend of barrier unexpected failed: %d\n", __FILE__, __LINE__, ret); return OMPI_ERROR; } /* activate progress callback */ ret = opal_progress_register(portals4_progress); if (OMPI_SUCCESS != ret) { opal_output_verbose(1, ompi_coll_base_framework.framework_output, "%s:%d: opal_progress_register failed: %d\n", __FILE__, __LINE__, ret); return OMPI_ERROR; } return OMPI_SUCCESS; }
int shmem_transport_startup(void) { int ret, i; ptl_process_t *desired = NULL; ptl_md_t md; ptl_le_t le; ptl_uid_t uid = PTL_UID_ANY; ptl_process_t my_id; #ifdef USE_ON_NODE_COMMS int num_on_node = 0; #endif #ifdef ENABLE_REMOTE_VIRTUAL_ADDRESSING /* Make sure the heap and data bases are actually symmetric */ { int peer; uint64_t bases[2]; peer = (shmem_internal_my_pe + 1) % shmem_internal_num_pes; ret = shmem_runtime_get(peer, "portals4-bases", bases, sizeof(uint64_t) * 2); if (0 != ret) { fprintf(stderr, "[%03d] ERROR: runtime_put failed: %d\n", shmem_internal_my_pe, ret); return ret; } if ((uintptr_t) shmem_internal_heap_base != bases[0]) { fprintf(stderr, "[%03d] ERROR: heap base address does not match with rank %03d and virtual addressing is enabled\n", shmem_internal_my_pe, peer); return -1; } if ((uintptr_t) shmem_internal_data_base != bases[1]) { fprintf(stderr, "[%03d] ERROR: data base address does not match with rank %03d and virtual addressing is enabled\n", shmem_internal_my_pe, peer); return -1; } } #endif desired = malloc(sizeof(ptl_process_t) * shmem_internal_num_pes); if (NULL == desired) { ret = 1; goto cleanup; } ret = PtlGetPhysId(shmem_transport_portals4_ni_h, &my_id); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlGetPhysId failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } for (i = 0 ; i < shmem_internal_num_pes; ++i) { ret = shmem_runtime_get(i, "portals4-procid", &desired[i], sizeof(ptl_process_t)); if (0 != ret) { fprintf(stderr, "[%03d] ERROR: runtime_get failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } #ifdef USE_ON_NODE_COMMS /* update the connectivity map... */ if (desired[i].phys.nid == my_id.phys.nid) { SHMEM_SET_RANK_SAME_NODE(i, num_on_node++); if (num_on_node > 255) { fprintf(stderr, "[%03d] ERROR: Too many local ranks.\n", shmem_internal_my_pe); goto cleanup; } } #endif } ret = PtlSetMap(shmem_transport_portals4_ni_h, shmem_internal_num_pes, desired); if (PTL_OK != ret && PTL_IGNORED != ret) { fprintf(stderr, "[%03d] ERROR: PtlSetMap failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } ret = PtlGetUid(shmem_transport_portals4_ni_h, &uid); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlGetUid failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } shmem_transport_portals4_max_volatile_size = ni_limits.max_volatile_size; shmem_transport_portals4_max_atomic_size = ni_limits.max_atomic_size; shmem_transport_portals4_max_fetch_atomic_size = ni_limits.max_fetch_atomic_size; shmem_transport_portals4_max_msg_size = ni_limits.max_msg_size; if (shmem_transport_portals4_max_volatile_size < sizeof(long double complex)) { fprintf(stderr, "[%03d] ERROR: Max volatile size found to be %lu, too small to continue\n", shmem_internal_my_pe, (unsigned long) shmem_transport_portals4_max_volatile_size); goto cleanup; } if (shmem_transport_portals4_max_atomic_size < sizeof(long double complex)) { fprintf(stderr, "[%03d] ERROR: Max atomic size found to be %lu, too small to continue\n", shmem_internal_my_pe, (unsigned long) shmem_transport_portals4_max_atomic_size); goto cleanup; } if (shmem_transport_portals4_max_fetch_atomic_size < sizeof(long double complex)) { fprintf(stderr, "[%03d] ERROR: Max fetch atomic size found to be %lu, too small to continue\n", shmem_internal_my_pe, (unsigned long) shmem_transport_portals4_max_fetch_atomic_size); goto cleanup; } /* create portal table entries */ ret = PtlEQAlloc(shmem_transport_portals4_ni_h, shmem_transport_portals4_event_slots, &shmem_transport_portals4_eq_h); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlEQAlloc failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } #ifdef ENABLE_REMOTE_VIRTUAL_ADDRESSING ret = PtlPTAlloc(shmem_transport_portals4_ni_h, 0, shmem_transport_portals4_eq_h, shmem_transport_portals4_pt, &all_pt); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlPTAlloc of table entry failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } #else ret = PtlPTAlloc(shmem_transport_portals4_ni_h, 0, shmem_transport_portals4_eq_h, shmem_transport_portals4_data_pt, &data_pt); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlPTAlloc of data table failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } ret = PtlPTAlloc(shmem_transport_portals4_ni_h, 0, shmem_transport_portals4_eq_h, shmem_transport_portals4_heap_pt, &heap_pt); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlPTAlloc of heap table failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } #endif #ifndef ENABLE_HARD_POLLING /* target ct */ ret = PtlCTAlloc(shmem_transport_portals4_ni_h, &shmem_transport_portals4_target_ct_h); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlCTAlloc of target ct failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } le.ct_handle = shmem_transport_portals4_target_ct_h; #endif le.uid = uid; le.options = PTL_LE_OP_PUT | PTL_LE_OP_GET | PTL_LE_EVENT_LINK_DISABLE | PTL_LE_EVENT_SUCCESS_DISABLE; #if !defined(ENABLE_HARD_POLLING) le.options |= PTL_LE_EVENT_CT_COMM; #endif #ifdef ENABLE_REMOTE_VIRTUAL_ADDRESSING le.start = NULL; le.length = PTL_SIZE_MAX; ret = PtlLEAppend(shmem_transport_portals4_ni_h, shmem_transport_portals4_pt, &le, PTL_PRIORITY_LIST, NULL, &shmem_transport_portals4_le_h); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlLEAppend of all memory failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } #else /* Open LE to heap section */ le.start = shmem_internal_heap_base; le.length = shmem_internal_heap_length; ret = PtlLEAppend(shmem_transport_portals4_ni_h, shmem_transport_portals4_heap_pt, &le, PTL_PRIORITY_LIST, NULL, &shmem_transport_portals4_heap_le_h); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlLEAppend of heap section failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } /* Open LE to data section */ le.start = shmem_internal_data_base; le.length = shmem_internal_data_length; ret = PtlLEAppend(shmem_transport_portals4_ni_h, shmem_transport_portals4_data_pt, &le, PTL_PRIORITY_LIST, NULL, &shmem_transport_portals4_data_le_h); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlLEAppend of data section failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } #endif /* Open MD to all memory */ ret = PtlCTAlloc(shmem_transport_portals4_ni_h, &shmem_transport_portals4_put_ct_h); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlCTAlloc of put ct failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } ret = PtlCTAlloc(shmem_transport_portals4_ni_h, &shmem_transport_portals4_get_ct_h); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlCTAlloc of get ct failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } md.start = 0; md.length = PTL_SIZE_MAX; md.options = PTL_MD_EVENT_CT_ACK; if (1 == PORTALS4_TOTAL_DATA_ORDERING) { md.options |= PTL_MD_UNORDERED; } md.eq_handle = shmem_transport_portals4_eq_h; md.ct_handle = shmem_transport_portals4_put_ct_h; ret = PtlMDBind(shmem_transport_portals4_ni_h, &md, &shmem_transport_portals4_put_event_md_h); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlMDBind of put MD failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } md.start = 0; md.length = PTL_SIZE_MAX; md.options = PTL_MD_EVENT_CT_ACK | PTL_MD_EVENT_SUCCESS_DISABLE | PTL_MD_VOLATILE; if (1 == PORTALS4_TOTAL_DATA_ORDERING) { md.options |= PTL_MD_UNORDERED; } md.eq_handle = shmem_transport_portals4_eq_h; md.ct_handle = shmem_transport_portals4_put_ct_h; ret = PtlMDBind(shmem_transport_portals4_ni_h, &md, &shmem_transport_portals4_put_volatile_md_h); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlMDBind of put MD failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } md.start = 0; md.length = PTL_SIZE_MAX; md.options = PTL_MD_EVENT_CT_ACK | PTL_MD_EVENT_SUCCESS_DISABLE; if (1 == PORTALS4_TOTAL_DATA_ORDERING) { md.options |= PTL_MD_UNORDERED; } md.eq_handle = shmem_transport_portals4_eq_h; md.ct_handle = shmem_transport_portals4_put_ct_h; ret = PtlMDBind(shmem_transport_portals4_ni_h, &md, &shmem_transport_portals4_put_cntr_md_h); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlMDBind of put cntr MD failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } md.start = 0; md.length = PTL_SIZE_MAX; md.options = PTL_MD_EVENT_CT_REPLY | PTL_MD_EVENT_SUCCESS_DISABLE; if (1 == PORTALS4_TOTAL_DATA_ORDERING) { md.options |= PTL_MD_UNORDERED; } md.eq_handle = shmem_transport_portals4_eq_h; md.ct_handle = shmem_transport_portals4_get_ct_h; ret = PtlMDBind(shmem_transport_portals4_ni_h, &md, &shmem_transport_portals4_get_md_h); if (PTL_OK != ret) { fprintf(stderr, "[%03d] ERROR: PtlMDBind of get MD failed: %d\n", shmem_internal_my_pe, ret); goto cleanup; } ret = 0; cleanup: if (NULL != desired) free(desired); return ret; }