1
1

osc/portals4: Be sure that the ME are operationnal (wait for the PTL_EVENT_LINK)

Этот коммит содержится в:
Pascal Deveze 2016-07-07 11:17:13 +02:00
родитель e99e7d08ed
Коммит c4181909a4
2 изменённых файлов: 20 добавлений и 2 удалений

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

@ -54,6 +54,8 @@ struct ompi_osc_portals4_component_t {
ptl_size_t matching_fetch_atomic_max;
ptl_size_t matching_atomic_ordered_size;
ptl_uid_t uid;
opal_mutex_t lock;
opal_condition_t cond;
opal_free_list_t requests; /* request free list for the r* communication variants */
};
@ -83,6 +85,7 @@ struct ompi_osc_portals4_module_t {
ptl_handle_ni_t ni_h; /* network interface used by this window */
ptl_pt_index_t pt_idx; /* portal table index used by this window (this will be same across window) */
ptl_handle_ct_t ct_h; /* Counting event handle used for completion in this window */
int ct_link; /* PTL_EVENT_LINK flag */
ptl_handle_md_t md_h; /* memory descriptor describing all of memory used by this window */
ptl_handle_md_t req_md_h; /* memory descriptor with event completion used by this window */
ptl_handle_me_t data_me_h; /* data match list entry (MB are CID | OSC_PORTALS4_MB_DATA) */

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

@ -218,6 +218,13 @@ process:
count++;
if (NULL != ev.user_ptr) {
/* be sure that we receive the PTL_EVENT_LINK */
if (ev.type == PTL_EVENT_LINK) {
*(int *)ev.user_ptr = *(int *)ev.user_ptr + 1;
opal_condition_broadcast(&mca_osc_portals4_component.cond);
continue;
}
req = (ompi_osc_portals4_request_t*) ev.user_ptr;
opal_atomic_add_size_t(&req->super.req_status._ucount, ev.mlength);
ops = opal_atomic_add_32(&req->ops_committed, 1);
@ -503,7 +510,7 @@ component_select(struct ompi_win_t *win, void **base, size_t size, int disp_unit
module->pt_idx,
&me,
PTL_PRIORITY_LIST,
NULL,
&module->ct_link,
&module->data_me_h);
if (PTL_OK != ret) {
opal_output_verbose(1, ompi_osc_base_framework.framework_output,
@ -526,7 +533,7 @@ component_select(struct ompi_win_t *win, void **base, size_t size, int disp_unit
module->pt_idx,
&me,
PTL_PRIORITY_LIST,
NULL,
&module->ct_link,
&module->control_me_h);
if (PTL_OK != ret) {
opal_output_verbose(1, ompi_osc_base_framework.framework_output,
@ -574,6 +581,13 @@ component_select(struct ompi_win_t *win, void **base, size_t size, int disp_unit
PtlAtomicSync();
/* Make sure that everyone's ready to receive. */
OPAL_THREAD_LOCK(&mca_osc_portals4_component.lock);
while (module->ct_link != 2) {
opal_condition_wait(&mca_osc_portals4_component.cond,
&mca_osc_portals4_component.lock);
}
OPAL_THREAD_UNLOCK(&mca_osc_portals4_component.lock);
module->comm->c_coll.coll_barrier(module->comm,
module->comm->c_coll.coll_barrier_module);
@ -618,6 +632,7 @@ ompi_osc_portals4_free(struct ompi_win_t *win)
module->comm->c_coll.coll_barrier_module);
/* cleanup */
PtlMEUnlink(module->control_me_h);
PtlMEUnlink(module->data_me_h);
PtlMDRelease(module->md_h);
PtlMDRelease(module->req_md_h);