extent =smpi_datatype_get_extent(datatype);
smpi_datatype_extent(datatype, &true_lb, &true_extent);
- if (smpi_op_is_commute(op)) {
+ if (op->is_commutative()) {
is_commutative = 1;
}
if (is_commutative || (src < rank)) {
if (sendbuf != MPI_IN_PLACE) {
- smpi_op_apply( op,
+ if(op!=MPI_OP_NULL) op->apply(
tmp_recvbuf, recvbuf, &recvcounts[rank],
- &datatype);
+ datatype);
}
else {
- smpi_op_apply(op,
+ if(op!=MPI_OP_NULL) op->apply(
tmp_recvbuf, ((char *)recvbuf+disps[rank]*extent),
- &recvcounts[rank], &datatype);
+ &recvcounts[rank], datatype);
/* we can't store the result at the beginning of
recvbuf right here because there is useful data
there that other process/processes need. at the
}
else {
if (sendbuf != MPI_IN_PLACE) {
- smpi_op_apply(op,
- recvbuf, tmp_recvbuf, &recvcounts[rank], &datatype);
+ if(op!=MPI_OP_NULL) op->apply(
+ recvbuf, tmp_recvbuf, &recvcounts[rank], datatype);
/* copy result back into recvbuf */
mpi_errno = smpi_datatype_copy(tmp_recvbuf, recvcounts[rank],
datatype, recvbuf,
if (mpi_errno) return(mpi_errno);
}
else {
- smpi_op_apply(op,
+ if(op!=MPI_OP_NULL) op->apply(
((char *)recvbuf+disps[rank]*extent),
- tmp_recvbuf, &recvcounts[rank], &datatype);
+ tmp_recvbuf, &recvcounts[rank], datatype);
/* copy result back into recvbuf */
mpi_errno = smpi_datatype_copy(tmp_recvbuf, recvcounts[rank],
datatype,
is now our peer's responsibility */
if (rank > peer) {
/* higher ranked value so need to call op(received_data, my_data) */
- smpi_op_apply(op,
+ if(op!=MPI_OP_NULL) op->apply(
incoming_data + recv_offset*true_extent,
outgoing_data + recv_offset*true_extent,
- &size, &datatype );
+ &size, datatype );
/* buf0_was_inout = buf0_was_inout; */
}
else {
/* lower ranked value so need to call op(my_data, received_data) */
- smpi_op_apply( op,
+ if(op!=MPI_OP_NULL) op->apply(
outgoing_data + recv_offset*true_extent,
incoming_data + recv_offset*true_extent,
- &size, &datatype);
+ &size, datatype);
buf0_was_inout = !buf0_was_inout;
}
extent =smpi_datatype_get_extent(datatype);
smpi_datatype_extent(datatype, &true_lb, &true_extent);
- if (smpi_op_is_commute(op)) {
+ if ((op==MPI_OP_NULL) || op->is_commutative()) {
is_commutative = 1;
}
if (received) {
if (is_commutative || (dst_tree_root < my_tree_root)) {
{
- smpi_op_apply(op,
+ if(op!=MPI_OP_NULL) op->apply(
tmp_recvbuf, tmp_results, &blklens[0],
- &datatype);
- smpi_op_apply(op,
+ datatype);
+ if(op!=MPI_OP_NULL) op->apply(
((char *)tmp_recvbuf + dis[1]*extent),
((char *)tmp_results + dis[1]*extent),
- &blklens[1], &datatype);
+ &blklens[1], datatype);
}
}
else {
{
- smpi_op_apply(op,
+ if(op!=MPI_OP_NULL) op->apply(
tmp_results, tmp_recvbuf, &blklens[0],
- &datatype);
- smpi_op_apply(op,
+ datatype);
+ if(op!=MPI_OP_NULL) op->apply(
((char *)tmp_results + dis[1]*extent),
((char *)tmp_recvbuf + dis[1]*extent),
- &blklens[1], &datatype);
+ &blklens[1], datatype);
}
/* copy result back into tmp_results */
mpi_errno = smpi_datatype_copy(tmp_recvbuf, 1, recvtype,