/** * \brief ARMCI Extension blocking put operation. * * \param[in] src Source buffer on the local node * \param[in] dst Destination buffer on the remote node * \param[in] bytes Number of bytes to transfer * \param[in] proc Remote node rank * * \return ??? */ int ARMCIX_Put( void * src, void * dst, int bytes, int proc) { DCMF_CriticalSection_enter (0); volatile unsigned active = 1; DCMF_Callback_t cb_wait = { ARMCIX_DCMF_cb_decrement, (void *)&active }; DCMF_Request_t request; DCMF_Memregion_t * src_memregion = &__connection[proc].local_mem_region; DCMF_Memregion_t * dst_memregion = &__connection[proc].remote_mem_region; DCMF_Result result = DCMF_Put (&__put_protocol, &request, cb_wait, DCMF_SEQUENTIAL_CONSISTENCY, proc, bytes, src_memregion, dst_memregion, armcix_dcmf_va_to_offset (src_memregion, src), armcix_dcmf_va_to_offset (dst_memregion, dst)); #ifdef BLOCKING_OPERATIONS_REQUIRE_FENCE ARMCIX_Fence (proc); #else while (active) DCMF_Messager_advance (); #endif DCMF_CriticalSection_exit (0); return (result != DCMF_SUCCESS); }
/** * \brief ARMCI Extension blocking vector put operation. * * \param[in] darr Descriptor array * \param[in] len Length of descriptor array * \param[in] proc Remote process(or) ID * * \return ??? */ int ARMCIX_PutV (armci_giov_t * darr, int len, int proc) { armci_ireq_t nb_request; armci_ihdl_t nb_handle = (armci_ihdl_t) &nb_request; ARMCIX_NbPutV (darr, len, proc, nb_handle); #ifdef BLOCKING_OPERATIONS_REQUIRE_FENCE ARMCIX_Fence (proc); #else ARMCIX_Wait (&nb_handle->cmpl_info); #endif return 0; }
/** * \brief ARMCI Extension blocking strided put operation. * * \param[in] src_ptr pointer to 1st segment at source * \param[in] src_stride_arr array of strides at source * \param[in] dst_ptr pointer to 1st segment at destination * \param[in] dst_stride_arr array of strides at destination * \param[in] seg_count number of segments at each stride levels: count[0]=bytes * \param[in] stride_levels number of stride levels * \param[in] proc remote process(or) ID * * \return ??? */ int ARMCIX_PutS (void * src_ptr, int * src_stride_arr, void * dst_ptr, int * dst_stride_arr, int * seg_count, int stride_levels, int proc) { armci_ireq_t nb_request; armci_ihdl_t nb_handle = (armci_ihdl_t) &nb_request; ARMCIX_NbPutS (src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, seg_count, stride_levels, proc, nb_handle); #ifdef BLOCKING_OPERATIONS_REQUIRE_FENCE ARMCIX_Fence (proc); #else ARMCIX_Wait (&nb_handle->cmpl_info); #endif return 0; }
void PARMCI_Fence(int proc) { #if defined(DATA_SERVER) && !(defined(GM) && defined(ACK_FENCE)) if(FENCE_ARR(proc) && (armci_nclus >1)){ int cluster = armci_clus_id(proc); int master = armci_clus_info[cluster].master; armci_rem_ack(cluster); bzero(&FENCE_ARR(master), armci_clus_info[cluster].nslave); } #elif defined(ARMCIX) ARMCIX_Fence (proc); #elif defined(BGML) BGML_WaitProc(proc); MEM_FENCE; #else FENCE_NODE(proc); MEM_FENCE; #endif }