gasnet_handle_t gasnete_amref_put_nb_inner(gasnet_node_t node, void *dest, void *src, size_t nbytes, int isbulk GASNETE_THREAD_FARG) { if (nbytes <= GASNETE_GETPUT_MEDIUM_LONG_THRESHOLD) { gasnete_eop_t *op = gasnete_eop_new(GASNETE_MYTHREAD); GASNETI_SAFE( MEDIUM_REQ(2,4,(node, gasneti_handleridx(gasnete_amref_put_reqh), src, nbytes, PACK(dest), PACK_EOP_DONE(op)))); return (gasnet_handle_t)op; } else if (nbytes <= gasnet_AMMaxLongRequest()) { gasnete_eop_t *op = gasnete_eop_new(GASNETE_MYTHREAD); if (isbulk) { GASNETI_SAFE( LONGASYNC_REQ(1,2,(node, gasneti_handleridx(gasnete_amref_putlong_reqh), src, nbytes, dest, PACK_EOP_DONE(op)))); } else { GASNETI_SAFE( LONG_REQ(1,2,(node, gasneti_handleridx(gasnete_amref_putlong_reqh), src, nbytes, dest, PACK_EOP_DONE(op)))); } return (gasnet_handle_t)op; } else { /* TODO: don't need the iop for large xfers in the GASNETE_EOP_COUNTED case */ /* need many messages - use an access region to coalesce them into a single handle */ /* (note this relies on the fact that our implementation of access regions allows recursion) */ gasnete_begin_nbi_accessregion(1 /* enable recursion */ GASNETE_THREAD_PASS); #if GASNETE_BUILD_AMREF_PUT_BULK && GASNETE_BUILD_AMREF_PUT if (isbulk) gasnete_amref_put_nbi_bulk(node, dest, src, nbytes GASNETE_THREAD_PASS); else gasnete_amref_put_nbi (node, dest, src, nbytes GASNETE_THREAD_PASS); #elif GASNETE_BUILD_AMREF_PUT_BULK gasnete_amref_put_nbi_bulk(node, dest, src, nbytes GASNETE_THREAD_PASS); #else gasnete_amref_put_nbi (node, dest, src, nbytes GASNETE_THREAD_PASS); #endif return gasnete_end_nbi_accessregion(GASNETE_THREAD_PASS_ALONE); } }
gasnet_handle_t gasnete_extref_put_nb_inner(gasnet_node_t node, void *dest, void *src, size_t nbytes, int isbulk GASNETE_THREAD_FARG) { if (nbytes <= GASNETE_GETPUT_MEDIUM_LONG_THRESHOLD) { gasnete_eop_t *op = gasnete_eop_new(GASNETE_MYTHREAD); GASNETI_SAFE( MEDIUM_REQ(2,4,(node, gasneti_handleridx(gasnete_extref_put_reqh), src, nbytes, PACK(dest), PACK(op)))); return (gasnet_handle_t)op; } else if (nbytes <= gasnet_AMMaxLongRequest()) { gasnete_eop_t *op = gasnete_eop_new(GASNETE_MYTHREAD); if (isbulk) { GASNETI_SAFE( LONGASYNC_REQ(1,2,(node, gasneti_handleridx(gasnete_extref_putlong_reqh), src, nbytes, dest, PACK(op)))); } else { GASNETI_SAFE( LONG_REQ(1,2,(node, gasneti_handleridx(gasnete_extref_putlong_reqh), src, nbytes, dest, PACK(op)))); } return (gasnet_handle_t)op; } else { /* need many messages - use an access region to coalesce them into a single handle */ /* (note this relies on the fact that our implementation of access regions allows recursion) */ gasnete_begin_nbi_accessregion(1 /* enable recursion */ GASNETE_THREAD_PASS); #if 0 /* No AM-based Bulk Puts in gm-conduit */ if (isbulk) gasnete_extref_put_nbi_bulk(node, dest, src, nbytes GASNETE_THREAD_PASS); else gasnete_extref_put_nbi (node, dest, src, nbytes GASNETE_THREAD_PASS); #else gasneti_assert(!isbulk); gasnete_extref_put_nbi (node, dest, src, nbytes GASNETE_THREAD_PASS); #endif return gasnete_end_nbi_accessregion(GASNETE_THREAD_PASS_ALONE); } }
void gasnete_amref_put_nbi_inner(gasnet_node_t node, void *dest, void *src, size_t nbytes, int isbulk GASNETE_THREAD_FARG) { gasnete_threaddata_t * const mythread = GASNETE_MYTHREAD; gasnete_iop_t * const op = mythread->current_iop; if (nbytes <= GASNETE_GETPUT_MEDIUM_LONG_THRESHOLD) { op->initiated_put_cnt++; GASNETI_SAFE( MEDIUM_REQ(2,4,(node, gasneti_handleridx(gasnete_amref_put_reqh), src, nbytes, PACK(dest), PACK_IOP_DONE(op,put)))); return; } else if (nbytes <= gasnet_AMMaxLongRequest()) { op->initiated_put_cnt++; if (isbulk) { GASNETI_SAFE( LONGASYNC_REQ(1,2,(node, gasneti_handleridx(gasnete_amref_putlong_reqh), src, nbytes, dest, PACK_IOP_DONE(op,put)))); } else { GASNETI_SAFE( LONG_REQ(1,2,(node, gasneti_handleridx(gasnete_amref_putlong_reqh), src, nbytes, dest, PACK_IOP_DONE(op,put)))); } return; } else { int chunksz = gasnet_AMMaxLongRequest(); uint8_t *psrc = src; uint8_t *pdest = dest; for (;;) { op->initiated_put_cnt++; if (nbytes > chunksz) { if (isbulk) { GASNETI_SAFE( LONGASYNC_REQ(1,2,(node, gasneti_handleridx(gasnete_amref_putlong_reqh), psrc, chunksz, pdest, PACK_IOP_DONE(op,put)))); } else { GASNETI_SAFE( LONG_REQ(1,2,(node, gasneti_handleridx(gasnete_amref_putlong_reqh), psrc, chunksz, pdest, PACK_IOP_DONE(op,put)))); } nbytes -= chunksz; psrc += chunksz; pdest += chunksz; } else { if (isbulk) { GASNETI_SAFE( LONGASYNC_REQ(1,2,(node, gasneti_handleridx(gasnete_amref_putlong_reqh), psrc, nbytes, pdest, PACK_IOP_DONE(op,put)))); } else { GASNETI_SAFE( LONG_REQ(1,2,(node, gasneti_handleridx(gasnete_amref_putlong_reqh), psrc, nbytes, pdest, PACK_IOP_DONE(op,put)))); } break; } } return; } }