diff --git a/oshmem/mca/scoll/basic/scoll_basic_collect.c b/oshmem/mca/scoll/basic/scoll_basic_collect.c index aa81facae5..746899ac4f 100644 --- a/oshmem/mca/scoll/basic/scoll_basic_collect.c +++ b/oshmem/mca/scoll/basic/scoll_basic_collect.c @@ -541,13 +541,13 @@ static int _algorithm_central_collector(struct oshmem_group_t *group, group->my_pe); /* Set own data size */ - pSync[0] = nlong; + pSync[0] = (nlong ? nlong : SHMEM_SYNC_READY); if (PE_root == group->my_pe) { long value = 0; int pe_cur = 0; long wait_pe_count = 0; - size_t* wait_pe_array = NULL; + long* wait_pe_array = NULL; wait_pe_count = group->proc_count; wait_pe_array = malloc(sizeof(*wait_pe_array) * wait_pe_count); @@ -569,9 +569,8 @@ static int _algorithm_central_collector(struct oshmem_group_t *group, value = 0; rc = MCA_SPML_CALL(get((void*)pSync, sizeof(value), (void*)&value, pe_cur)); if ((rc == OSHMEM_SUCCESS) - && (value != _SHMEM_SYNC_VALUE) - && (value > 0)) { - wait_pe_array[i] = (size_t) value; + && (value != _SHMEM_SYNC_VALUE)) { + wait_pe_array[i] = value; wait_pe_count--; SCOLL_VERBOSE(14, "Got source data size as %d from #%d (wait list counter: %d)", @@ -588,17 +587,23 @@ static int _algorithm_central_collector(struct oshmem_group_t *group, for (i = 1; (i < group->proc_count) && (rc == OSHMEM_SUCCESS); i++) { + + /* Skip zero size data */ + if (wait_pe_array[i] == SHMEM_SYNC_READY) { + continue; + } + /* Get PE ID of a peer from the group */ pe_cur = oshmem_proc_pe(group->proc_array[i]); /* Get data from the current peer */ - rc = MCA_SPML_CALL(get((void *)source, wait_pe_array[i], (void*)((unsigned char*)target + offset), pe_cur)); + rc = MCA_SPML_CALL(get((void *)source, (size_t)wait_pe_array[i], (void*)((unsigned char*)target + offset), pe_cur)); SCOLL_VERBOSE(14, "Got %d bytes of data from #%d (offset: %d)", (int)wait_pe_array[i], pe_cur, (int)offset); - offset += wait_pe_array[i]; + offset += (size_t)wait_pe_array[i]; } free(wait_pe_array);