if (extra_ != nullptr) {
if (static_cast<instr_extra_data>(extra_)->sendcounts != nullptr)
- xbt_free(static_cast<instr_extra_data>(extra_)->sendcounts);
+ delete[](static_cast<instr_extra_data>(extra_)->sendcounts);
if (static_cast<instr_extra_data>(extra_)->recvcounts != nullptr)
- xbt_free(static_cast<instr_extra_data>(extra_)->recvcounts);
+ delete[](static_cast<instr_extra_data>(extra_)->recvcounts);
xbt_free(extra_);
}
} else if (instr_fmt_type == instr_fmt_TI) {
fprintf(trace_file, "%s\n", stream.str().c_str());
if (extra->recvcounts != nullptr)
- xbt_free(extra->recvcounts);
+ delete[] extra->recvcounts;
if (extra->sendcounts != nullptr)
- xbt_free(extra->sendcounts);
+ delete[] extra->sendcounts;
xbt_free(extra);
} else {
int* recvcounts;
int num_processes;
};
+
typedef s_instr_extra_data_t* instr_extra_data;
/* Format of TRACING output.
extra->datatype1 = encode_datatype(sendtmptype);
extra->send_size = sendtmptype->is_basic() ? sendtmpcount : sendtmpcount * sendtmptype->size();
extra->datatype2 = encode_datatype(recvtype);
- extra->recv_size = recvtype->is_basic() ? recvcount : recvcount * recvtype->size();
+ extra->recv_size = (comm->rank() != root || recvtype->is_basic()) ? recvcount : recvcount * recvtype->size();
TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
extra->root = root_traced;
extra->datatype1 = encode_datatype(sendtype);
- extra->send_size = sendtype->is_basic() ? sendcount : sendcount * sendtype->size();
+ extra->send_size = (comm->rank() != root || sendtype->is_basic()) ? sendcount : sendcount * sendtype->size();
extra->datatype2 = encode_datatype(recvtype);
extra->recv_size = recvtype->is_basic() ? recvcount : recvcount * recvtype->size();
extra->send_size = datatype->is_basic() ? count : count * datatype->size();
void* sendtmpbuf = sendbuf;
if (sendbuf == MPI_IN_PLACE) {
- sendtmpbuf = static_cast<void*>(xbt_malloc(extra->send_size));
- memcpy(sendtmpbuf, recvbuf, extra->send_size);
+ sendtmpbuf = static_cast<void*>(xbt_malloc(count * datatype->size()));
+ memcpy(sendtmpbuf, recvbuf, count * datatype->size());
}
TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
extra->recvcounts = new int[size];
extra->sendcounts = new int[size];
extra->datatype2 = encode_datatype(recvtype);
- int dt_size_recv = recvtype->is_basic() ? 1 : recvtype->size();
+ int dt_size_recv = recvtype->size();
void* sendtmpbuf = static_cast<char*>(sendbuf);
int* sendtmpcounts = sendcounts;
}
extra->datatype1 = encode_datatype(sendtmptype);
- int dt_size_send = sendtmptype->is_basic() ? 1 : sendtmptype->size();
+ int dt_size_send = sendtmptype->size();
for (i = 0; i < size; i++) { // copy data to avoid bad free
extra->send_size += sendtmpcounts[i] * dt_size_send;
} else {
int rank = smpi_process()->index();
- int src_traced = comm->group()->index(src);
instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
- extra->type = TRACING_IRECV;
- extra->src = src_traced;
- extra->dst = rank;
+ extra->type = TRACING_IRECV;
+ extra->src = comm->group()->index(src);
+ extra->dst = rank;
extra->datatype1 = encode_datatype(datatype);
extra->send_size = datatype->is_basic() ? count : count * datatype->size();
TRACE_smpi_ptp_in(rank, __FUNCTION__, extra);
extra->send_size = datatype->is_basic() ? count : count * datatype->size();
TRACE_smpi_ptp_in(rank, __FUNCTION__, extra);
- TRACE_smpi_send(rank, rank, dst_traced, tag,count*datatype->size());
+ TRACE_smpi_send(rank, rank, dst_traced, tag, count * datatype->size());
simgrid::smpi::Request::ssend(buf, count, datatype, dst, tag, comm);
retval = MPI_SUCCESS;