Decide if sends should be throttled at the receiver and pass this to the sender
in an ACK message. The decision can't be done reliably at the sender. This commit was SVN r17987.
Этот коммит содержится в:
родитель
e2ad9c4be2
Коммит
cf40674369
@ -394,7 +394,8 @@ void mca_pml_ob1_process_pending_packets(mca_bml_base_btl_t* bml_btl)
|
||||
send_dst,
|
||||
pckt->hdr.hdr_ack.hdr_src_req.lval,
|
||||
pckt->hdr.hdr_ack.hdr_dst_req.pval,
|
||||
pckt->hdr.hdr_ack.hdr_send_offset);
|
||||
pckt->hdr.hdr_ack.hdr_send_offset,
|
||||
pckt->hdr.hdr_common.hdr_flags & MCA_PML_OB1_HDR_FLAGS_NORDMA);
|
||||
MCA_PML_OB1_PCKT_PENDING_RETURN(pckt);
|
||||
if(OMPI_ERR_OUT_OF_RESOURCE == rc) {
|
||||
MCA_PML_OB1_ADD_ACK_TO_PENDING(pckt->proc,
|
||||
|
@ -47,6 +47,7 @@
|
||||
#define MCA_PML_OB1_HDR_FLAGS_NBO 2 /* is the hdr in network byte order */
|
||||
#define MCA_PML_OB1_HDR_FLAGS_PIN 4 /* is user buffer pinned */
|
||||
#define MCA_PML_OB1_HDR_FLAGS_CONTIG 8 /* is user buffer contiguous */
|
||||
#define MCA_PML_OB1_HDR_FLAGS_NORDMA 16 /* rest will be send by copy-in-out */
|
||||
|
||||
/**
|
||||
* Common hdr attributes - must be first element in each hdr type
|
||||
|
@ -110,7 +110,7 @@ void mca_pml_ob1_recv_frag_callback( mca_btl_base_module_t* btl,
|
||||
|
||||
/* if the request should be delivered entirely by copy in/out
|
||||
* then throttle sends */
|
||||
if(sendreq->req_bytes_delivered == hdr->hdr_ack.hdr_send_offset)
|
||||
if(hdr->hdr_common.hdr_flags & MCA_PML_OB1_HDR_FLAGS_NORDMA)
|
||||
sendreq->req_throttle_sends = true;
|
||||
|
||||
mca_pml_ob1_send_request_copy_in_out(sendreq,
|
||||
|
@ -205,7 +205,8 @@ static void mca_pml_ob1_put_completion( mca_btl_base_module_t* btl,
|
||||
|
||||
int mca_pml_ob1_recv_request_ack_send_btl(
|
||||
ompi_proc_t* proc, mca_bml_base_btl_t* bml_btl,
|
||||
uint64_t hdr_src_req, void *hdr_dst_req, uint64_t hdr_send_offset)
|
||||
uint64_t hdr_src_req, void *hdr_dst_req, uint64_t hdr_send_offset,
|
||||
bool nordma)
|
||||
{
|
||||
mca_btl_base_descriptor_t* des;
|
||||
mca_pml_ob1_ack_hdr_t* ack;
|
||||
@ -222,7 +223,7 @@ int mca_pml_ob1_recv_request_ack_send_btl(
|
||||
/* fill out header */
|
||||
ack = (mca_pml_ob1_ack_hdr_t*)des->des_src->seg_addr.pval;
|
||||
ack->hdr_common.hdr_type = MCA_PML_OB1_HDR_TYPE_ACK;
|
||||
ack->hdr_common.hdr_flags = 0;
|
||||
ack->hdr_common.hdr_flags = nordma ? MCA_PML_OB1_HDR_FLAGS_NORDMA : 0;
|
||||
ack->hdr_src_req.lval = hdr_src_req;
|
||||
ack->hdr_dst_req.pval = hdr_dst_req;
|
||||
ack->hdr_send_offset = hdr_send_offset;
|
||||
@ -246,7 +247,7 @@ static int mca_pml_ob1_recv_request_ack(
|
||||
size_t bytes_received)
|
||||
{
|
||||
ompi_proc_t* proc = (ompi_proc_t*)recvreq->req_recv.req_base.req_proc;
|
||||
mca_bml_base_endpoint_t* bml_endpoint = NULL;
|
||||
mca_bml_base_endpoint_t* bml_endpoint = NULL;
|
||||
|
||||
bml_endpoint = (mca_bml_base_endpoint_t*) proc->proc_bml;
|
||||
|
||||
@ -302,7 +303,8 @@ static int mca_pml_ob1_recv_request_ack(
|
||||
/* let know to shedule function there is no need to put ACK flag */
|
||||
recvreq->req_ack_sent = true;
|
||||
return mca_pml_ob1_recv_request_ack_send(proc, hdr->hdr_src_req.lval,
|
||||
recvreq, recvreq->req_send_offset);
|
||||
recvreq, recvreq->req_send_offset,
|
||||
recvreq->req_send_offset == bytes_received);
|
||||
}
|
||||
|
||||
|
||||
|
@ -349,10 +349,11 @@ static inline void mca_pml_ob1_recv_request_schedule(
|
||||
|
||||
int mca_pml_ob1_recv_request_ack_send_btl(ompi_proc_t* proc,
|
||||
mca_bml_base_btl_t* bml_btl, uint64_t hdr_src_req, void *hdr_dst_req,
|
||||
uint64_t hdr_rdma_offset);
|
||||
uint64_t hdr_rdma_offset, bool nordma);
|
||||
|
||||
static inline int mca_pml_ob1_recv_request_ack_send(ompi_proc_t* proc,
|
||||
uint64_t hdr_src_req, void *hdr_dst_req, uint64_t hdr_send_offset)
|
||||
uint64_t hdr_src_req, void *hdr_dst_req, uint64_t hdr_send_offset,
|
||||
bool nordma)
|
||||
{
|
||||
size_t i;
|
||||
mca_bml_base_btl_t* bml_btl;
|
||||
@ -362,7 +363,7 @@ static inline int mca_pml_ob1_recv_request_ack_send(ompi_proc_t* proc,
|
||||
for(i = 0; i < mca_bml_base_btl_array_get_size(&endpoint->btl_eager); i++) {
|
||||
bml_btl = mca_bml_base_btl_array_get_next(&endpoint->btl_eager);
|
||||
if(mca_pml_ob1_recv_request_ack_send_btl(proc, bml_btl, hdr_src_req,
|
||||
hdr_dst_req, hdr_send_offset) == OMPI_SUCCESS)
|
||||
hdr_dst_req, hdr_send_offset, nordma) == OMPI_SUCCESS)
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user