/* tag contains address of receive buffer guarded by cntr at process p */ void armci_lapi_send(msg_tag_t tag, void* data, int len, int p) { int rc; lapi_cntr_t org_cntr; void *buf = tag.buf; lapi_cntr_t *cntr = tag.cntr; if(!buf)ERROR("armci_lapi_send: NULL tag(buf) error",0); if(!cntr)ERROR("armci_lapi_send: NULL tag(cntr) error",0); rc=LAPI_Setcntr(lapi_handle, &org_cntr, 0); if(rc) ERROR("armci_lapi_send:setcntr failed",rc); rc=LAPI_Put(lapi_handle, (uint)p, (uint)len, buf, data, cntr, &org_cntr, NULL); if(rc) ERROR("armci_lapi_send:put failed",rc); rc+=LAPI_Waitcntr(lapi_handle, &org_cntr, 1, NULL); if(rc) ERROR("armci_lapi_send:waitcntr failed",rc); }
void DDI_GetAcc_lapi_server(DDI_Patch *patch, void *buffer) { /* --------------- *\ Local Variables \* --------------- */ lapi_handle_t hndl; uint tgt; ulong len; void *tgt_addr,*org_addr; lapi_cntr_t *tgt_cntr,*org_cntr,*cmpl_cntr; lapi_cntr_t local_cntr; STD_DEBUG((stdout,"%s: Entering DDI_GetAcc_lapi_server.\n",DDI_Id())) /* ----------------------------------------- *\ Set up the calling arguments for LAPI_Get \* ----------------------------------------- */ hndl = gv(lapi_hnd); /* LAPI Handle */ tgt = patch->cp_lapi_id; /* Target for the LAPI_Get */ len = (ulong) patch->size; /* Amount of data to get */ tgt_addr = patch->cp_buffer_addr; /* Addr at target to get */ org_addr = buffer; /* Local Addr for data that is got */ tgt_cntr = (lapi_cntr_t *) patch->cp_lapi_cntr; /* Target counter */ org_cntr = &local_cntr; /* Local counter -> incremented once the LAPI_Get is completed */ cmpl_cntr = NULL; ULTRA_DEBUG((stdout,"%s: DDI_Patch -> ilo=%i ihi=%i jlo=%i jhi=%i size=%lu.\n", DDI_Id(),patch->ilo,patch->ihi,patch->jlo,patch->jhi,patch->size)) ULTRA_DEBUG((stdout,"%s: org buffer_addr=%x cntr_addr=%x.\n",DDI_Id(),org_addr,org_cntr)) ULTRA_DEBUG((stdout,"%s: tgt id=%i buffer_addr=%x cntr_addr=%x.\n",DDI_Id(),tgt,tgt_addr,tgt_cntr)) /* -------------------------------------------------------------------------- *\ We are interested in when the LAPI_Get is finished, zero the local counter \* -------------------------------------------------------------------------- */ if(LAPI_Setcntr(hndl,org_cntr,0) != LAPI_SUCCESS) { fprintf(stdout,"%s: LAPI_Setcntr failed in DDI_GetAcc_lapi_server.\n",DDI_Id()); Fatal_error(911); } ULTRA_DEBUG((stdout,"%s: Initializing local LAPI counter.\n",DDI_Id())) /* --------------------------------------------------- *\ Execute the LAPI_Get. This is a non-blocking call. \* --------------------------------------------------- */ if(LAPI_Get(hndl,tgt,len,tgt_addr,org_addr,tgt_cntr,org_cntr) != LAPI_SUCCESS) { fprintf(stdout,"%s: LAPI_Get failed in DDI_GetAcc_lapi_server.\n",DDI_Id()); Fatal_error(911); } MAX_DEBUG((stdout,"%s: Executing LAPI_Get from %i.\n",DDI_Id(),tgt)) /* ------------------------------------------------------------------------ *\ Wait here until the local counter is incremented ==> LAPI_Get completed. \* ------------------------------------------------------------------------ */ if(LAPI_Waitcntr(hndl,org_cntr,1,NULL) != LAPI_SUCCESS) { fprintf(stdout,"%s: LAPI_Waitcntr failed in DDI_GetAcc_lapi_server.\n",DDI_Id()); Fatal_error(911); } MAX_DEBUG((stdout,"%s: LAPI_Get from %i completed.\n",DDI_Id(),tgt)) /* -------------------------------------------------------------- *\ Place the data (now local) into the shared-memory of the node. \* -------------------------------------------------------------- */ MAX_DEBUG((stdout,"%s: LAPI handler calling DDI_GetAcc_local.\n",DDI_Id())) DDI_GetAcc_local(patch,buffer); MAX_DEBUG((stdout,"%s: LAPI handler completed DDI_GetAcc_local.\n",DDI_Id())) STD_DEBUG((stdout,"%s: Exiting DDI_GetAcc_lapi_server.\n",DDI_Id())) /* --------------------------------------------------- *\ Execute the LAPI_Put. This is a non-blocking call. \* --------------------------------------------------- */ if(LAPI_Put(hndl,tgt,len,tgt_addr,org_addr,tgt_cntr,org_cntr,cmpl_cntr) != LAPI_SUCCESS) { fprintf(stdout,"%s: LAPI_Get failed in DDI_GetAcc_lapi_server.\n",DDI_Id()); Fatal_error(911); } MAX_DEBUG((stdout,"%s: Executing LAPI_Put from %i.\n",DDI_Id(),tgt)) /* ------------------------------------------------------------------------- *\ Wait here until the local counter is incremented ==> LAPI_Put has copied. \* ------------------------------------------------------------------------- */ if(LAPI_Waitcntr(hndl,org_cntr,1,NULL) != LAPI_SUCCESS) { fprintf(stdout,"%s: LAPI_Waitcntr failed in DDI_GetAcc_lapi_server.\n",DDI_Id()); Fatal_error(911); } MAX_DEBUG((stdout,"%s: LAPI_Put copied data enroute to %i.\n",DDI_Id(),tgt)) }