}
/* PMPI User level calls */
+extern "C" { // Obviously, the C MPI interface should use the C linkage
int PMPI_Init(int *argc, char ***argv)
{
dt_size_send = smpi_datatype_size(datatype);
extra->send_size = 0;
extra->recvcounts= xbt_new(int, size);
- for(i=0; i< size; i++)//copy data to avoid bad free
+ int totalcount = 0;
+ for(i=0; i< size; i++){//copy data to avoid bad free
extra->recvcounts[i] = recvcounts[i]*dt_size_send;
- TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra);
-
+ totalcount+= recvcounts[i];
+ }
void* sendtmpbuf=sendbuf;
- if(sendbuf==MPI_IN_PLACE)
- sendtmpbuf=recvbuf;
+ if(sendbuf==MPI_IN_PLACE){
+ sendtmpbuf= static_cast<void*>(xbt_malloc(totalcount*smpi_datatype_size(datatype)));
+ memcpy(sendtmpbuf,recvbuf, totalcount*smpi_datatype_size(datatype));
+ }
- mpi_coll_reduce_scatter_fun(sendtmpbuf, recvbuf, recvcounts, datatype, op, comm);
- retval = MPI_SUCCESS;
+ TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra);
+
+ mpi_coll_reduce_scatter_fun(sendtmpbuf, recvbuf, recvcounts, datatype, op, comm);
+ retval = MPI_SUCCESS;
TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
+
+ if(sendbuf==MPI_IN_PLACE)
+ xbt_free(sendtmpbuf);
}
smpi_bench_begin();
} else if (recvcount < 0) {
retval = MPI_ERR_ARG;
} else {
- int count=smpi_comm_size(comm);
+ int count=smpi_comm_size(comm);
int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
extra->recvcounts= xbt_new(int, count);
for(i=0; i< count; i++)//copy data to avoid bad free
extra->recvcounts[i] = recvcount*dt_size_send;
+ void* sendtmpbuf=sendbuf;
+ if(sendbuf==MPI_IN_PLACE){
+ sendtmpbuf= static_cast<void*>(xbt_malloc(recvcount*count*smpi_datatype_size(datatype)));
+ memcpy(sendtmpbuf,recvbuf, recvcount*count*smpi_datatype_size(datatype));
+ }
TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra);
int* recvcounts=static_cast<int*>(xbt_malloc(count*sizeof(int)));
- for (i=0; i<count;i++)
- recvcounts[i]=recvcount;
- mpi_coll_reduce_scatter_fun(sendbuf, recvbuf, recvcounts, datatype, op, comm);
- xbt_free(recvcounts);
- retval = MPI_SUCCESS;
+ for (i=0; i<count;i++)
+ recvcounts[i]=recvcount;
+ mpi_coll_reduce_scatter_fun(sendtmpbuf, recvbuf, recvcounts, datatype, op, comm);
+ xbt_free(recvcounts);
+ retval = MPI_SUCCESS;
TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
+
+ if(sendbuf==MPI_IN_PLACE)
+ xbt_free(sendtmpbuf);
}
smpi_bench_begin();
return MPI_SUCCESS;
}
+} // extern "C"