1
1

This commit fixes trac:4662 - "Portals4/MTL hangs in c_get_accumulate test".

- Portals4/OSC was unable to acquire an exclusive lock due to an invalid
local address in the atomic operation.  This caused the reported hang.
- After fixing the hang, the test continued to fail because
ompi_datatype_is_contiguous_memory_layout() reports that MPI_EMPTY (the
origin datatype) is noncontiguous and Portals4/OSC does not support
noncontiguous datatypes at this time.  However, in this case the origin
count is zero so contiguous/noncontiguous is irrelevant.  Now we skip
the contiguous check if the count is zero.

cmr=v1.8.3:reviewer=regrant:subject=Fix for "Portals4/MTL hangs in c_get_accumulate test"

This commit was SVN r32295.

The following Trac tickets were found above:
  Ticket 4662 --> https://svn.open-mpi.org/trac/ompi/ticket/4662
Этот коммит содержится в:
Todd Kordenbrock 2014-07-23 19:13:07 +00:00
родитель d4f83ab929
Коммит 42a871efd4
2 изменённых файлов: 6 добавлений и 5 удалений

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

@ -845,9 +845,10 @@ ompi_osc_portals4_get_accumulate(void *origin_addr,
offset = get_displacement(module, target) * target_disp;
if (!ompi_datatype_is_contiguous_memory_layout(origin_dt, origin_count) ||
!ompi_datatype_is_contiguous_memory_layout(result_dt, result_count) ||
!ompi_datatype_is_contiguous_memory_layout(target_dt, target_count)) {
/* we don't support non-contiguous buffers. but if the count is 0, we don't care if buffer is non-contiguous. */
if ((origin_count > 0 && !ompi_datatype_is_contiguous_memory_layout(origin_dt, origin_count)) ||
(result_count > 0 && !ompi_datatype_is_contiguous_memory_layout(result_dt, result_count)) ||
(target_count > 0 && !ompi_datatype_is_contiguous_memory_layout(target_dt, target_count))) {
opal_output(ompi_osc_base_framework.framework_output,
"MPI_Get_accumulate: transfer of non-contiguous memory is not currently supported.\n");
return OMPI_ERR_NOT_SUPPORTED;

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

@ -52,7 +52,7 @@ lk_cas64(ompi_osc_portals4_module_t *module,
ret = PtlSwap(result_md_h,
(char*) result_val - (char*) result_base,
write_md_h,
(char*) write_val - (char*) write_base,
(char*) &write_val - (char*) write_base,
sizeof(int64_t),
ompi_osc_portals4_get_peer(module, target),
module->pt_idx,
@ -122,7 +122,7 @@ lk_add64(ompi_osc_portals4_module_t *module,
ompi_osc_portals4_get_md(&write_val, module->md_h, &write_md_h, &write_base);
ret = PtlFetchAtomic(result_md_h,
(char*) &result_val - (char*) result_base,
(char*) result_val - (char*) result_base,
write_md_h,
(char*) &write_val - (char*) write_base,
sizeof(int64_t),