1
1

Re-enable the ability for the rdma one-sided component to start messages

as soon as the epochs allow, rather than waiting for the end of the
synchronization phase.

This commit was SVN r14800.
Этот коммит содержится в:
Brian Barrett 2007-05-30 17:06:19 +00:00
родитель bc32a0f1bc
Коммит 84f7ed70b3
4 изменённых файлов: 84 добавлений и 24 удалений

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

@ -133,7 +133,8 @@ struct ompi_osc_rdma_module_t {
opal_list_t m_queued_sendreqs;
/** start sending data eagerly */
bool m_eager_send;
bool m_eager_send_active;
bool m_eager_send_ok;
/* ********************* FENCE data ************************ */
/* an array of <sizeof(m_comm)> ints, each containing the value

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

@ -50,9 +50,10 @@ ompi_osc_rdma_module_accumulate(void *origin_addr, int origin_count,
{
int ret;
ompi_osc_rdma_sendreq_t *sendreq;
ompi_osc_rdma_module_t *module = GET_MODULE(win);
if ((OMPI_WIN_STARTED & ompi_win_get_mode(win)) &&
(!GET_MODULE(win)->m_sc_remote_active_ranks[target])) {
(!module->m_sc_remote_active_ranks[target])) {
return MPI_ERR_RMA_SYNC;
}
@ -84,14 +85,32 @@ ompi_osc_rdma_module_accumulate(void *origin_addr, int origin_count,
target_disp,
target_count,
target_dt,
GET_MODULE(win),
module,
&sendreq);
if (OMPI_SUCCESS != ret) return ret;
sendreq->req_op_id = op->o_f_to_c_index;
/* enqueue sendreq */
ret = enqueue_sendreq(GET_MODULE(win), sendreq);
if (0 && module->m_eager_send_active) {
OPAL_THREAD_LOCK(&module->m_lock);
sendreq->req_module->m_num_pending_out += 1;
module->m_num_pending_sendreqs[sendreq->req_target_rank] += 1;
OPAL_THREAD_UNLOCK(&(module->m_lock));
ret = ompi_osc_rdma_sendreq_send(module, sendreq);
if (OMPI_SUCCESS != ret) {
OPAL_THREAD_LOCK(&module->m_lock);
sendreq->req_module->m_num_pending_out -= 1;
opal_list_append(&(module->m_pending_sendreqs),
(opal_list_item_t*) sendreq);
OPAL_THREAD_UNLOCK(&module->m_lock);
ret = OMPI_SUCCESS;
}
} else {
/* enqueue sendreq */
ret = enqueue_sendreq(module, sendreq);
}
return ret;
}
@ -140,10 +159,7 @@ ompi_osc_rdma_module_get(void *origin_addr,
&sendreq);
if (OMPI_SUCCESS != ret) return ret;
/* if we're doing fence synchronization, try to actively send
right now */
if (module->m_eager_send &&
(OMPI_WIN_FENCE & ompi_win_get_mode(win))) {
if (module->m_eager_send_active) {
OPAL_THREAD_LOCK(&module->m_lock);
sendreq->req_module->m_num_pending_out += 1;
module->m_num_pending_sendreqs[sendreq->req_target_rank] += 1;
@ -156,7 +172,7 @@ ompi_osc_rdma_module_get(void *origin_addr,
sendreq->req_module->m_num_pending_out -= 1;
opal_list_append(&(module->m_pending_sendreqs),
(opal_list_item_t*) sendreq);
OPAL_THREAD_LOCK(&module->m_lock);
OPAL_THREAD_UNLOCK(&module->m_lock);
ret = OMPI_SUCCESS;
}
} else {
@ -209,8 +225,7 @@ ompi_osc_rdma_module_put(void *origin_addr, int origin_count,
/* if we're doing fence synchronization, try to actively send
right now */
if (module->m_eager_send &&
(OMPI_WIN_FENCE & ompi_win_get_mode(win))) {
if (module->m_eager_send_active) {
OPAL_THREAD_LOCK(&module->m_lock);
sendreq->req_module->m_num_pending_out += 1;
module->m_num_pending_sendreqs[sendreq->req_target_rank] += 1;
@ -223,7 +238,7 @@ ompi_osc_rdma_module_put(void *origin_addr, int origin_count,
sendreq->req_module->m_num_pending_out -= 1;
opal_list_append(&(module->m_pending_sendreqs),
(opal_list_item_t*) sendreq);
OPAL_THREAD_LOCK(&module->m_lock);
OPAL_THREAD_UNLOCK(&module->m_lock);
ret = OMPI_SUCCESS;
}
} else {

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

@ -322,7 +322,11 @@ ompi_osc_rdma_component_select(ompi_win_t *win,
memset(module->m_num_pending_sendreqs, 0,
sizeof(unsigned int) * ompi_comm_size(module->m_comm));
module->m_eager_send = check_config_value_bool("eager_send", info);
module->m_eager_send_ok = check_config_value_bool("eager_send", info);
/* initially, we're in that pseudo-fence state, so we allow eager
sends (yay for Fence). Other protocols will disable before
they start their epochs, so this isn't a problem. */
module->m_eager_send_active = module->m_eager_send_ok;
/* fence data */
module->m_fence_coll_counts = (int*)
@ -623,7 +627,39 @@ component_fragment_cb(struct mca_btl_base_module_t *btl,
OPAL_THREAD_LOCK(&module->m_lock);
count = (module->m_num_post_msgs -= 1);
OPAL_THREAD_UNLOCK(&module->m_lock);
if (count == 0) opal_condition_broadcast(&module->m_cond);
if (count == 0) {
module->m_eager_send_active = module->m_eager_send_ok;
while (module->m_eager_send_active &&
opal_list_get_size(&module->m_pending_sendreqs)) {
ompi_osc_rdma_sendreq_t *sendreq;
OPAL_THREAD_LOCK(&module->m_lock);
sendreq = (ompi_osc_rdma_sendreq_t*)
opal_list_remove_first(&module->m_pending_sendreqs);
if (NULL == sendreq) {
OPAL_THREAD_UNLOCK(&module->m_lock);
break;
}
sendreq->req_module->m_num_pending_out += 1;
OPAL_THREAD_UNLOCK(&module->m_lock);
ret = ompi_osc_rdma_sendreq_send(module, sendreq);
if (OMPI_SUCCESS != ret) {
OPAL_THREAD_LOCK(&module->m_lock);
sendreq->req_module->m_num_pending_out -= 1;
opal_list_append(&(module->m_pending_sendreqs),
(opal_list_item_t*) sendreq);
OPAL_THREAD_UNLOCK(&module->m_lock);
break;
}
}
opal_condition_broadcast(&module->m_cond);
}
}
break;
case OMPI_OSC_RDMA_HDR_COMPLETE:

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

@ -168,11 +168,15 @@ ompi_osc_rdma_module_start(ompi_group_t *group,
{
int i, ret = OMPI_SUCCESS;
ompi_osc_rdma_module_t *module = GET_MODULE(win);
int32_t count;
OBJ_RETAIN(group);
ompi_group_increment_proc_count(group);
module->m_eager_send_active = false;
OPAL_THREAD_LOCK(&module->m_lock);
if (NULL != module->m_sc_group) {
OPAL_THREAD_UNLOCK(&module->m_lock);
ret = MPI_ERR_RMA_SYNC;
@ -182,7 +186,7 @@ ompi_osc_rdma_module_start(ompi_group_t *group,
/* possible we've already received a couple in messages, so
add however many we're going to wait for */
module->m_num_post_msgs += ompi_group_size(module->m_sc_group);
count = (module->m_num_post_msgs += ompi_group_size(module->m_sc_group));
OPAL_THREAD_UNLOCK(&(module->m_lock));
memset(module->m_sc_remote_active_ranks, 0,
@ -221,6 +225,10 @@ ompi_osc_rdma_module_start(ompi_group_t *group,
ompi_win_remove_mode(win, OMPI_WIN_FENCE);
ompi_win_append_mode(win, OMPI_WIN_ACCESS_EPOCH | OMPI_WIN_STARTED);
if (count == 0) {
module->m_eager_send_active = module->m_eager_send_ok;
}
return OMPI_SUCCESS;
clean:
@ -249,12 +257,8 @@ ompi_osc_rdma_module_complete(ompi_win_t *win)
/* for each process in group, send a control message with number
of updates coming, then start all the requests */
for (i = 0 ; i < ompi_group_size(module->m_sc_group) ; ++i) {
int comm_rank = module->m_sc_remote_ranks[i];
module->m_num_pending_out +=
module->m_copy_num_pending_sendreqs[comm_rank];
}
module->m_num_pending_out +=
(int32_t) opal_list_get_size(&module->m_copy_pending_sendreqs);
OPAL_THREAD_UNLOCK(&module->m_lock);
for (i = 0 ; i < ompi_group_size(module->m_sc_group) ; ++i) {
@ -390,13 +394,13 @@ ompi_osc_rdma_module_test(ompi_win_t *win,
*flag = 1;
ompi_win_remove_mode(win, OMPI_WIN_EXPOSE_EPOCH | OMPI_WIN_POSTED);
OPAL_THREAD_LOCK(&(module->m_lock));
group = module->m_pw_group;
module->m_pw_group = NULL;
OPAL_THREAD_UNLOCK(&(module->m_lock));
ompi_win_remove_mode(win, OMPI_WIN_EXPOSE_EPOCH | OMPI_WIN_POSTED);
ompi_group_decrement_proc_count(group);
OBJ_RELEASE(group);
@ -439,6 +443,8 @@ ompi_osc_rdma_module_lock(int lock_type,
module->m_comm->c_my_rank,
lock_type);
module->m_eager_send_active = false;
/* return */
return OMPI_SUCCESS;
}
@ -517,6 +523,8 @@ ompi_osc_rdma_module_unlock(int target,
/* set our mode on the window */
ompi_win_remove_mode(win, OMPI_WIN_ACCESS_EPOCH | OMPI_WIN_LOCK_ACCESS);
module->m_eager_send_active = module->m_eager_send_ok;
return OMPI_SUCCESS;
}