1
1

Commit the code to test at OSU.

This commit was SVN r1824.
Этот коммит содержится в:
Weikuan Yu 2004-07-30 17:14:20 +00:00
родитель 985687112b
Коммит 1e162da7c7
6 изменённых файлов: 36 добавлений и 31 удалений

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

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

@ -42,7 +42,7 @@ mca_ptl_elan_t mca_ptl_elan = {
mca_ptl_elan_get, mca_ptl_elan_get,
mca_ptl_elan_matched, mca_ptl_elan_matched,
mca_ptl_elan_req_init, mca_ptl_elan_req_init,
mca_ptl_elan_req_fini, mca_ptl_elan_req_fini
} }
}; };
@ -164,27 +164,25 @@ int
mca_ptl_elan_req_init (struct mca_ptl_t *ptl, mca_ptl_elan_req_init (struct mca_ptl_t *ptl,
struct mca_pml_base_send_request_t *request) struct mca_pml_base_send_request_t *request)
{ {
int rc = OMPI_SUCCESS;
mca_ptl_elan_send_frag_t *sd; mca_ptl_elan_send_frag_t *sd;
mca_ptl_elan_send_request_t * elan_req; mca_ptl_elan_send_request_t * elan_req;
START_FUNC(); START_FUNC();
/*OBJ_CONSTRUCT (request, mca_pml_base_send_request_t);*/
sd = mca_ptl_elan_alloc_send_desc(ptl, request); sd = mca_ptl_elan_alloc_send_desc(ptl, request);
if (NULL == sd) { if (NULL == sd) {
ompi_output(0, ompi_output(0,
"[%s:%d] Unable to allocate an elan send descriptors \n", "[%s:%d] Unable to allocate an elan send descriptors \n",
__FILE__, __LINE__); __FILE__, __LINE__);
rc = OMPI_ERR_OUT_OF_RESOURCE; return OMPI_ERR_OUT_OF_RESOURCE;
} else { } else {
/* XXX: Hope PML never writes into the fragment */ /* XXX: Hope PML never writes into the fragment */
(mca_ptl_elan_send_request_t *request)->req_frag = sd; ((mca_ptl_elan_send_request_t *)request)->req_frag = sd;
} }
sd->desc->desc_status = MCA_PTL_ELAN_DESC_CACHED; sd->desc->desc_status = MCA_PTL_ELAN_DESC_CACHED;
END_FUNC(); END_FUNC();
return rc; return OMPI_SUCCESS;
} }
void void
@ -193,10 +191,12 @@ mca_ptl_elan_req_fini (struct mca_ptl_t *ptl,
{ {
/* XXX: Lock to be added */ /* XXX: Lock to be added */
ompi_ptl_elan_queue_ctrl_t *queue; ompi_ptl_elan_queue_ctrl_t *queue;
queue = (struct mca_ptl_elan_t * ptl)->queue; mca_ptl_elan_send_frag_t *desc;
queue = ((struct mca_ptl_elan_t * )ptl)->queue;
/* return the fragment and update the status */ /* return the fragment and update the status */
desc = (mca_ptl_elan_send_request_t *) request->req_frag; desc = ((mca_ptl_elan_send_request_t *) request)->req_frag;
OMPI_FREE_LIST_RETURN (&queue->tx_desc_free, (ompi_list_item_t *) desc); OMPI_FREE_LIST_RETURN (&queue->tx_desc_free, (ompi_list_item_t *) desc);
desc->desc->desc_status = MCA_PTL_ELAN_DESC_LOCAL; desc->desc->desc_status = MCA_PTL_ELAN_DESC_LOCAL;
return; return;
@ -243,19 +243,20 @@ mca_ptl_elan_isend (struct mca_ptl_t *ptl,
START_FUNC(); START_FUNC();
if (offset == 0) /* The first fragment uses a cached desc */ if (offset == 0) { /* The first fragment uses a cached desc */
sd = ((mca_ptl_elan_send_request_t*)sendreq)->req_frag; sd = ((mca_ptl_elan_send_request_t*)sendreq)->req_frag;
} else { } else {
/* Get a frag desc and allocate a send desc */ /* Get a frag desc and allocate a send desc */
ompi_free_list_t * frag_list; ompi_free_list_t * frag_list;
ompi_list_item_t * item;
frag_list = &mca_ptl_elan_module.elan_send_frags_free; frag_list = &mca_ptl_elan_module.elan_send_frags_free;
/* More sendfrag then descritpors, no need to block */ /* More sendfrag then descritpors, no need to block */
ompi_mutex_lock(&frag_list->fl_lock); ompi_mutex_lock(&frag_list->fl_lock);
item = ompi_list_remove_first (&((flist)->super)); item = ompi_list_remove_first (&((frag_list)->super));
ompi_mutex_unlock(&flist->fl_lock); ompi_mutex_unlock(&frag_list->fl_lock);
OMPI_PTL_ELAN_CHECK_UNEX (item, NULL, OMPI_ERROR, 0); OMPI_PTL_ELAN_CHECK_UNEX (item, NULL, OMPI_ERROR, 0);
sd = mca_ptl_elan_alloc_send_desc(ptl, sendreq); sd = mca_ptl_elan_alloc_send_desc(ptl, sendreq);
@ -329,7 +330,7 @@ mca_ptl_elan_matched (mca_ptl_t * ptl,
request = frag->frag_request; request = frag->frag_request;
/* Process the fragment */ /* Process the fragment */
set = fetchNset (&(mca_ptl_elan_recv_frag_t *)frag->frag_progressed, 1); set = fetchNset (&((mca_ptl_elan_recv_frag_t *)frag)->frag_progressed, 1);
if (!set) { if (!set) {
@ -339,7 +340,7 @@ mca_ptl_elan_matched (mca_ptl_t * ptl,
* But in ELAN cases, we save the data into an unex buffer * But in ELAN cases, we save the data into an unex buffer
* if the recv descriptor is not posted (for too long) (TODO). * if the recv descriptor is not posted (for too long) (TODO).
* We then need to copy from unex_buffer to application buffer */ * We then need to copy from unex_buffer to application buffer */
if(header->hdr_frag_length > 0) { if(header->hdr_frag.hdr_frag_length > 0) {
struct iovec iov; struct iovec iov;
ompi_proc_t *proc; ompi_proc_t *proc;
@ -377,8 +378,11 @@ mca_ptl_elan_matched (mca_ptl_t * ptl,
*/ */
} }
frag->frag_base.frag_owner->ptl_recv_progress frag->frag_base.frag_owner->ptl_recv_progress (
(frag->frag_base.frag_owner, request, frag->frag_base.frag_size); frag->frag_base.frag_owner,
request,
frag->frag_base.frag_size,
frag->frag_base.frag_size);
/* FIXME: /* FIXME:
* To support the required ACK, do not return * To support the required ACK, do not return

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

@ -124,7 +124,7 @@ mca_ptl_elan_alloc_send_desc (struct mca_ptl_t *ptl_ptr,
} }
} }
desc = (mca_ptl_elan_send_frag_t *) item; desc = (mca_ptl_elan_send_frag_t *) item;
desc->desc->desc_type = MCA_PTL_ELAN_QDMA_DESC; desc->desc->desc_type = MCA_PTL_ELAN_DESC_QDMA;
} }
desc->desc->req = (struct mca_pml_base_send_request_t *)sendreq; desc->desc->req = (struct mca_pml_base_send_request_t *)sendreq;

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

@ -33,7 +33,7 @@ typedef struct mca_ptl_elan_send_frag_t mca_ptl_elan_send_frag_t;
* ELAN received fragment derived type. * ELAN received fragment derived type.
*/ */
struct mca_ptl_elan_recv_frag_t { struct mca_ptl_elan_recv_frag_t {
mca_ptl_base_recv_frag_t frag_base; mca_ptl_base_recv_frag_t frag_recv;
size_t frag_hdr_cnt; size_t frag_hdr_cnt;
size_t frag_msg_cnt; size_t frag_msg_cnt;
int frag_progressed; int frag_progressed;

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

@ -26,6 +26,7 @@ mca_ptl_elan_init_qdma_desc (struct ompi_ptl_elan_qdma_desc_t *desc,
int destvp; int destvp;
int size_out; int size_out;
int size_in; int size_in;
int rc = OMPI_SUCCESS;
START_FUNC(); START_FUNC();
@ -92,7 +93,7 @@ mca_ptl_elan_init_qdma_desc (struct ompi_ptl_elan_qdma_desc_t *desc,
if (rc < 0) { if (rc < 0) {
ompi_output (0, "[%s:%d] Unable to pack data\n", ompi_output (0, "[%s:%d] Unable to pack data\n",
__FILE__, __LINE__); __FILE__, __LINE__);
return OMPI_ERROR; return;
} }
size_out = iov.iov_len; size_out = iov.iov_len;
} else { } else {
@ -158,7 +159,7 @@ mca_ptl_elan_start_desc (mca_ptl_elan_send_frag_t * desc,
#endif #endif
if (desc->desc->desc_type == MCA_PTL_ELAN_QDMA_DESC) { if (desc->desc->desc_type == MCA_PTL_ELAN_DESC_QDMA) {
struct ompi_ptl_elan_qdma_desc_t *qdma; struct ompi_ptl_elan_qdma_desc_t *qdma;
qdma = (ompi_ptl_elan_qdma_desc_t *)desc->desc; qdma = (ompi_ptl_elan_qdma_desc_t *)desc->desc;
@ -197,10 +198,10 @@ mca_ptl_elan_data_frag (struct mca_ptl_elan_t *ptl,
ompi_list_item_t *item; ompi_list_item_t *item;
mca_pml_base_recv_request_t *request; mca_pml_base_recv_request_t *request;
int rc; bool matched;
int rc = OMPI_SUCCESS;
rc = OMPI_FREE_LIST_GET (&mca_ptl_elan_module.elan_recv_frags_free, OMPI_FREE_LIST_GET (&mca_ptl_elan_module.elan_recv_frags_free, item, rc);
item, rc);
while (OMPI_SUCCESS != rc) { while (OMPI_SUCCESS != rc) {
@ -208,7 +209,7 @@ mca_ptl_elan_data_frag (struct mca_ptl_elan_t *ptl,
ompi_output (0, ompi_output (0,
"[%s:%d] Retry to allocate a recv fragment", "[%s:%d] Retry to allocate a recv fragment",
__FILE__, __LINE__); __FILE__, __LINE__);
rc = OMPI_FREE_LIST_GET (&mca_ptl_elan_module.elan_recv_frags_free, OMPI_FREE_LIST_GET (&mca_ptl_elan_module.elan_recv_frags_free,
item, rc); item, rc);
} }
@ -233,8 +234,7 @@ mca_ptl_elan_data_frag (struct mca_ptl_elan_t *ptl,
/* Taking the data starting point be default */ /* Taking the data starting point be default */
recv_frag->frag_recv.frag_base.frag_addr = recv_frag->frag_recv.frag_base.frag_addr =
(char *) header + sizeof (mca_ptl_base_header_t); (char *) header + sizeof (mca_ptl_base_header_t);
recv_frag->frag_recv.frag_base.frag_size = recv_frag->frag_recv.frag_base.frag_size = header->hdr_frag.hdr_frag_length;
header->hdr_frag.hdr_frag_length;
/* match with preposted requests */ /* match with preposted requests */
matched = mca_ptl_base_recv_frag_match ( matched = mca_ptl_base_recv_frag_match (
@ -294,7 +294,7 @@ mca_ptl_elan_drain_recv (mca_ptl_elan_module_1_0_0_t * emp)
OMPI_LOCK (&queue->rx_lock); OMPI_LOCK (&queue->rx_lock);
#if 1 #if 1
rc = (int *) (&rxq->qr_doneWord); rc = (*(int *) (&rxq->qr_doneWord));
#else #else
rc = elan4_pollevent_word (ctx, &rxq->qr_doneWord, 1); rc = elan4_pollevent_word (ctx, &rxq->qr_doneWord, 1);
#endif #endif
@ -402,7 +402,7 @@ mca_ptl_elan_update_send (mca_ptl_elan_module_1_0_0_t * emp)
desc = (mca_ptl_elan_send_frag_t *) desc = (mca_ptl_elan_send_frag_t *)
ompi_list_get_first (&queue->tx_desc); ompi_list_get_first (&queue->tx_desc);
#if 1 #if 1
rc = (int *) (&desc->desc->main_doneWord); rc = * ((int *) (&desc->desc->main_doneWord));
#else #else
/* Poll the completion event for 1usec */ /* Poll the completion event for 1usec */
rc = elan4_pollevent_word(ctx, &desc->desc->main_doneWord, 1); rc = elan4_pollevent_word(ctx, &desc->desc->main_doneWord, 1);
@ -414,14 +414,15 @@ mca_ptl_elan_update_send (mca_ptl_elan_module_1_0_0_t * emp)
desc = (mca_ptl_elan_send_frag_t *) desc = (mca_ptl_elan_send_frag_t *)
ompi_list_remove_first (&queue->tx_desc); ompi_list_remove_first (&queue->tx_desc);
req = desc->desc->req; req = desc->desc->req;
header = (mca_ptl_base_header_t *)&desc->desc->buff[0]; header = (mca_ptl_base_header_t *)&
((ompi_ptl_elan_qdma_desc_t *)desc->desc)->buff[0];
if(NULL == req) { /* An ack descriptor */ if(NULL == req) { /* An ack descriptor */
OMPI_FREE_LIST_RETURN (&queue->tx_desc_free, OMPI_FREE_LIST_RETURN (&queue->tx_desc_free,
(ompi_list_item_t *) desc); (ompi_list_item_t *) desc);
} else if (0 == (header->hdr_common.hdr_flags } else if (0 == (header->hdr_common.hdr_flags
& MCA_PTL_FLAGS_ACK_MATCHED) & MCA_PTL_FLAGS_ACK_MATCHED)
|| mca_pml_base_send_request_matched(request)) { || mca_pml_base_send_request_matched(req)) {
/* XXX: NO_NEED_FOR_MATCH || ALREADY_MATCHED */ /* XXX: NO_NEED_FOR_MATCH || ALREADY_MATCHED */
if(fetchNset (&desc->frag_progressed, 1) == 0) { if(fetchNset (&desc->frag_progressed, 1) == 0) {