added put support for zero copy operation
This commit was SVN r6775.
Этот коммит содержится в:
родитель
24dc319237
Коммит
078836c5b9
@ -352,10 +352,26 @@ int mca_btl_tcp_send(
|
||||
{
|
||||
mca_btl_tcp_module_t* tcp_btl = (mca_btl_tcp_module_t*) btl;
|
||||
mca_btl_tcp_frag_t* frag = (mca_btl_tcp_frag_t*)descriptor;
|
||||
size_t i;
|
||||
|
||||
frag->btl = tcp_btl;
|
||||
frag->endpoint = endpoint;
|
||||
frag->rc = 0;
|
||||
frag->iov_idx = 0;
|
||||
frag->iov_cnt = 1;
|
||||
frag->iov_ptr = frag->iov;
|
||||
frag->iov[0].iov_base = &frag->hdr;
|
||||
frag->iov[0].iov_len = sizeof(frag->hdr);
|
||||
frag->hdr.size = 0;
|
||||
for(i=0; i<frag->base.des_src_cnt; i++) {
|
||||
frag->hdr.size += frag->segments[i].seg_len;
|
||||
frag->iov[i+1].iov_len = frag->segments[i].seg_len;
|
||||
frag->iov[i+1].iov_base = frag->segments[i].seg_addr.pval;
|
||||
frag->iov_cnt++;
|
||||
}
|
||||
frag->hdr.base.tag = tag;
|
||||
frag->hdr.type = MCA_BTL_TCP_HDR_TYPE_SEND;
|
||||
MCA_BTL_TCP_FRAG_INIT_SRC(frag,endpoint);
|
||||
frag->hdr.count = 0;
|
||||
return mca_btl_tcp_endpoint_send(endpoint,frag);
|
||||
}
|
||||
|
||||
@ -373,12 +389,31 @@ int mca_btl_tcp_put(
|
||||
mca_btl_base_endpoint_t* endpoint,
|
||||
mca_btl_base_descriptor_t* descriptor)
|
||||
{
|
||||
mca_btl_tcp_module_t* tcp_btl = (mca_btl_tcp_module_t*) btl;
|
||||
mca_btl_tcp_frag_t* frag = (mca_btl_tcp_frag_t*) descriptor;
|
||||
mca_btl_tcp_module_t* tcp_btl = (mca_btl_tcp_module_t*) btl;
|
||||
mca_btl_tcp_frag_t* frag = (mca_btl_tcp_frag_t*)descriptor;
|
||||
size_t i;
|
||||
|
||||
frag->btl = tcp_btl;
|
||||
frag->endpoint = endpoint;
|
||||
/* TODO */
|
||||
return OMPI_ERR_NOT_IMPLEMENTED;
|
||||
frag->rc = 0;
|
||||
frag->iov_idx = 0;
|
||||
frag->hdr.size = 0;
|
||||
frag->iov_cnt = 2;
|
||||
frag->iov_ptr = frag->iov;
|
||||
frag->iov[0].iov_base = &frag->hdr;
|
||||
frag->iov[0].iov_len = sizeof(frag->hdr);
|
||||
frag->iov[1].iov_base = frag->base.des_dst;
|
||||
frag->iov[1].iov_len = frag->base.des_dst_cnt * sizeof(mca_btl_base_segment_t);
|
||||
for(i=0; i<frag->base.des_src_cnt; i++) {
|
||||
frag->hdr.size += frag->segments[i].seg_len;
|
||||
frag->iov[i+2].iov_len = frag->segments[i].seg_len;
|
||||
frag->iov[i+2].iov_base = frag->segments[i].seg_addr.pval;
|
||||
frag->iov_cnt++;
|
||||
}
|
||||
frag->hdr.base.tag = MCA_BTL_TAG_BTL;
|
||||
frag->hdr.type = MCA_BTL_TCP_HDR_TYPE_PUT;
|
||||
frag->hdr.count = frag->base.des_dst_cnt;
|
||||
return mca_btl_tcp_endpoint_send(endpoint,frag);
|
||||
}
|
||||
|
||||
|
||||
@ -396,12 +431,24 @@ int mca_btl_tcp_get(
|
||||
mca_btl_base_endpoint_t* endpoint,
|
||||
mca_btl_base_descriptor_t* descriptor)
|
||||
{
|
||||
mca_btl_tcp_module_t* tcp_btl = (mca_btl_tcp_module_t*) btl;
|
||||
mca_btl_tcp_frag_t* frag = (mca_btl_tcp_frag_t*) descriptor;
|
||||
mca_btl_tcp_module_t* tcp_btl = (mca_btl_tcp_module_t*) btl;
|
||||
mca_btl_tcp_frag_t* frag = (mca_btl_tcp_frag_t*)descriptor;
|
||||
|
||||
frag->btl = tcp_btl;
|
||||
frag->endpoint = endpoint;
|
||||
/* TODO */
|
||||
return OMPI_ERR_NOT_IMPLEMENTED;
|
||||
frag->rc = 0;
|
||||
frag->iov_idx = 0;
|
||||
frag->hdr.size = 0;
|
||||
frag->iov_cnt = 2;
|
||||
frag->iov_ptr = frag->iov;
|
||||
frag->iov[0].iov_base = &frag->hdr;
|
||||
frag->iov[0].iov_len = sizeof(frag->hdr);
|
||||
frag->iov[1].iov_base = frag->base.des_src;
|
||||
frag->iov[1].iov_len = frag->base.des_src_cnt * sizeof(mca_btl_base_segment_t);
|
||||
frag->hdr.base.tag = MCA_BTL_TAG_BTL;
|
||||
frag->hdr.type = MCA_BTL_TCP_HDR_TYPE_GET;
|
||||
frag->hdr.count = frag->base.des_src_cnt;
|
||||
return mca_btl_tcp_endpoint_send(endpoint,frag);
|
||||
}
|
||||
|
||||
|
||||
|
@ -214,11 +214,11 @@ int mca_btl_tcp_component_open(void)
|
||||
mca_btl_tcp_module.super.btl_max_send_size =
|
||||
mca_btl_tcp_param_register_int ("max_send_size", 256*1024) - sizeof(mca_btl_base_header_t);
|
||||
mca_btl_tcp_module.super.btl_min_rdma_size =
|
||||
mca_btl_tcp_param_register_int("min_rdma_size", 1024*1024);
|
||||
mca_btl_tcp_param_register_int("min_rdma_size", 256*1024);
|
||||
mca_btl_tcp_module.super.btl_max_rdma_size =
|
||||
mca_btl_tcp_param_register_int("max_rdma_size", 2*1024*1024);
|
||||
mca_btl_tcp_param_register_int("max_rdma_size", INT_MAX);
|
||||
mca_btl_tcp_module.super.btl_flags =
|
||||
mca_btl_tcp_param_register_int("flags", 0);
|
||||
mca_btl_tcp_param_register_int("flags", MCA_BTL_FLAGS_RDMA);
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -161,19 +161,40 @@ bool mca_btl_tcp_frag_recv(mca_btl_tcp_frag_t* frag, int sd)
|
||||
}
|
||||
|
||||
/* read header */
|
||||
if(frag->iov_cnt == 0 && frag->iov_idx == 1) {
|
||||
if(frag->iov_cnt == 0) {
|
||||
switch(frag->hdr.type) {
|
||||
case MCA_BTL_TCP_HDR_TYPE_SEND:
|
||||
frag->iov[1].iov_base = (frag+1);
|
||||
frag->iov[1].iov_len = frag->hdr.size;
|
||||
frag->segments[0].seg_addr.pval = frag+1;
|
||||
frag->segments[0].seg_len = frag->hdr.size;
|
||||
frag->iov_cnt++;
|
||||
return false;
|
||||
if(frag->iov_idx == 1) {
|
||||
frag->iov[1].iov_base = (frag+1);
|
||||
frag->iov[1].iov_len = frag->hdr.size;
|
||||
frag->segments[0].seg_addr.pval = frag+1;
|
||||
frag->segments[0].seg_len = frag->hdr.size;
|
||||
frag->iov_cnt++;
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case MCA_BTL_TCP_HDR_TYPE_PUT:
|
||||
if(frag->iov_idx == 1) {
|
||||
frag->iov[1].iov_base = frag->segments;
|
||||
frag->iov[1].iov_len = frag->hdr.count * sizeof(mca_btl_base_segment_t);
|
||||
frag->iov_cnt++;
|
||||
return false;
|
||||
} else if (frag->iov_idx == 2) {
|
||||
for(i=0; i<frag->hdr.count; i++) {
|
||||
frag->iov[i+2].iov_base = frag->segments[i].seg_addr.pval;
|
||||
frag->iov[i+2].iov_len = frag->segments[i].seg_len;
|
||||
frag->iov_cnt++;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case MCA_BTL_TCP_HDR_TYPE_GET:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return (frag->iov_cnt == 0);
|
||||
}
|
||||
|
||||
|
@ -39,7 +39,7 @@ struct mca_btl_tcp_frag_t {
|
||||
struct mca_btl_base_endpoint_t *endpoint;
|
||||
struct mca_btl_tcp_module_t* btl;
|
||||
mca_btl_tcp_hdr_t hdr;
|
||||
struct iovec iov[3];
|
||||
struct iovec iov[4];
|
||||
struct iovec *iov_ptr;
|
||||
size_t iov_cnt;
|
||||
size_t iov_idx;
|
||||
@ -110,26 +110,6 @@ OBJ_CLASS_DECLARATION(mca_btl_tcp_frag_user_t);
|
||||
(opal_list_item_t*)(frag)); \
|
||||
}
|
||||
|
||||
#define MCA_BTL_TCP_FRAG_INIT_SRC(frag,endpoint) \
|
||||
do { \
|
||||
size_t i; \
|
||||
frag->rc = 0; \
|
||||
frag->hdr.size = 0; \
|
||||
frag->iov_idx = 0; \
|
||||
frag->endpoint = endpoint; \
|
||||
frag->hdr.size = 0; \
|
||||
frag->iov_cnt = 1; \
|
||||
frag->iov_ptr = frag->iov; \
|
||||
frag->iov[0].iov_base = &frag->hdr; \
|
||||
frag->iov[0].iov_len = sizeof(frag->hdr); \
|
||||
for(i=0; i<frag->base.des_src_cnt; i++) { \
|
||||
frag->hdr.size += frag->segments[i].seg_len; \
|
||||
frag->iov[i+1].iov_len = frag->segments[i].seg_len; \
|
||||
frag->iov[i+1].iov_base = frag->segments[i].seg_addr.pval; \
|
||||
frag->iov_cnt++; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define MCA_BTL_TCP_FRAG_INIT_DST(frag,ep) \
|
||||
do { \
|
||||
frag->rc = 0; \
|
||||
|
@ -37,7 +37,8 @@ extern "C" {
|
||||
|
||||
struct mca_btl_tcp_hdr_t {
|
||||
mca_btl_base_header_t base;
|
||||
uint8_t type;
|
||||
uint8_t type;
|
||||
uint16_t count;
|
||||
uint64_t size;
|
||||
};
|
||||
typedef struct mca_btl_tcp_hdr_t mca_btl_tcp_hdr_t;
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user