// Internal use only
CREATE_MPI_DATATYPE(MPI_PTR, void*);
+/** Check if the datatype is usable for communications
+ */
+int is_datatype_valid(MPI_Datatype datatype) {
+ return datatype != MPI_DATATYPE_NULL
+ && (datatype->flags & DT_FLAG_COMMITED);
+}
size_t smpi_datatype_size(MPI_Datatype datatype)
{
return datatype->size;
}
-
-
MPI_Aint smpi_datatype_lb(MPI_Datatype datatype)
{
return datatype->lb;
void *recvbuf, int recvcount, MPI_Datatype recvtype)
{
int count;
-
+ if(smpi_privatize_global_variables){
+ switch_data_segment(smpi_process_index());
+ }
/* First check if we really have something to do */
if (recvcount > 0 && recvbuf != sendbuf) {
/* FIXME: treat packed cases */
xbt_free((*type)->substruct);
}
xbt_free(*type);
-
+ *type = MPI_DATATYPE_NULL;
}
void smpi_datatype_use(MPI_Datatype type){
void smpi_op_apply(MPI_Op op, void *invec, void *inoutvec, int *len,
MPI_Datatype * datatype)
{
+ if(smpi_privatize_global_variables){ //we need to switch here, as the called function may silently touch global variables
+ XBT_VERB("Applying operation, switch to the right data frame ");
+ switch_data_segment(smpi_process_index());
+ }
+
if(!_xbt_replay_is_active())
op->func(invec, inoutvec, len, datatype);
}