1
1

added put support for zero copy operation

This commit was SVN r6775.
Этот коммит содержится в:
Tim Woodall 2005-08-09 14:10:17 +00:00
родитель 24dc319237
Коммит 078836c5b9
5 изменённых файлов: 91 добавлений и 42 удалений

Просмотреть файл

@ -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;