-/* smpi_datatype.cpp -- MPI primitives to handle datatypes */
-/* Copyright (c) 2009-2017. The SimGrid Team.
- * All rights reserved. */
+/* smpi_datatype.cpp -- MPI primitives to handle datatypes */
+/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-#include "mc/mc.h"
-#include "private.h"
#include "simgrid/modelchecker.h"
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <string>
-#include <unordered_map>
-#include <xbt/ex.hpp>
+#include "src/smpi/private.h"
+#include "src/smpi/private.hpp"
+#include "src/smpi/smpi_datatype_derived.hpp"
+#include "src/smpi/smpi_op.hpp"
+#include "src/smpi/smpi_process.hpp"
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_datatype, smpi, "Logging specific to SMPI (datatype)");
sizeof(type), /* size */ \
0, /* lb */ \
sizeof(type), /* ub = lb + size */ \
- DT_FLAG_BASIC /* flags */ \
+ DT_FLAG_BASIC /* flags */ \
); \
const MPI_Datatype name = &mpi_##name;
int Datatype::keyval_id_=0;
Datatype::Datatype(int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(nullptr), size_(size), lb_(lb), ub_(ub), flags_(flags), refcount_(1){
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
if(MC_is_active())
MC_ignore(&(refcount_), sizeof(refcount_));
#endif
//for predefined types, so in_use = 0.
Datatype::Datatype(char* name, int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(name), size_(size), lb_(lb), ub_(ub), flags_(flags), refcount_(0){
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
if(MC_is_active())
MC_ignore(&(refcount_), sizeof(refcount_));
#endif
*ret = MPI_SUCCESS;
if(datatype->name_)
name_ = xbt_strdup(datatype->name_);
-
- if(!(datatype->attributes()->empty())){
+
+ if (not datatype->attributes()->empty()) {
int flag;
void* value_out;
for(auto it = datatype->attributes()->begin(); it != datatype->attributes()->end(); it++){
smpi_key_elem elem = keyvals_.at((*it).first);
-
+
if (elem != nullptr && elem->copy_fn.type_copy_fn != MPI_NULL_COPY_FN) {
*ret = elem->copy_fn.type_copy_fn(datatype, (*it).first, nullptr, (*it).second, &value_out, &flag);
if (*ret != MPI_SUCCESS) {
refcount_++;
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
if(MC_is_active())
MC_ignore(&(refcount_), sizeof(refcount_));
#endif
if (datatype->refcount_ > 0)
datatype->refcount_--;
- if (datatype->refcount_ == 0 && !(datatype->flags_ & DT_FLAG_PREDEFINED))
+ if (datatype->refcount_ == 0 && not(datatype->flags_ & DT_FLAG_PREDEFINED))
delete datatype;
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
if(MC_is_active())
MC_ignore(&(datatype->refcount_), sizeof(datatype->refcount_));
#endif
int Datatype::copy(void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcount, MPI_Datatype recvtype){
- int count;
- if(smpi_is_shared(sendbuf)){
- XBT_DEBUG("Copy input buf %p is shared. Let's ignore it.", sendbuf);
- }else if(smpi_is_shared(recvbuf)){
- XBT_DEBUG("Copy output buf %p is shared. Let's ignore it.", recvbuf);
- }
+// FIXME Handle the case of a partial shared malloc.
- if(smpi_privatize_global_variables){
+ if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){
smpi_switch_data_segment(smpi_process()->index());
}
/* First check if we really have something to do */
if (recvcount > 0 && recvbuf != sendbuf) {
sendcount *= sendtype->size();
recvcount *= recvtype->size();
- count = sendcount < recvcount ? sendcount : recvcount;
+ int count = sendcount < recvcount ? sendcount : recvcount;
- if(!(sendtype->flags() & DT_FLAG_DERIVED) && !(recvtype->flags() & DT_FLAG_DERIVED)) {
- if(!smpi_process()->replaying())
+ if (not(sendtype->flags() & DT_FLAG_DERIVED) && not(recvtype->flags() & DT_FLAG_DERIVED)) {
+ if (not smpi_process()->replaying())
memcpy(recvbuf, sendbuf, count);
- }
- else if (!(sendtype->flags() & DT_FLAG_DERIVED))
- {
+ } else if (not(sendtype->flags() & DT_FLAG_DERIVED)) {
recvtype->unserialize( sendbuf, recvbuf, recvcount/recvtype->size(), MPI_REPLACE);
- }
- else if (!(recvtype->flags() & DT_FLAG_DERIVED))
- {
+ } else if (not(recvtype->flags() & DT_FLAG_DERIVED)) {
sendtype->serialize(sendbuf, recvbuf, sendcount/sendtype->size());
}else{
int Datatype::create_vector(int count, int block_length, int stride, MPI_Datatype old_type, MPI_Datatype* new_type)
{
int retval;
- if (block_length<0)
+ if (block_length<0)
return MPI_ERR_ARG;
MPI_Aint lb = 0;
MPI_Aint ub = 0;
int Datatype::create_hvector(int count, int block_length, MPI_Aint stride, MPI_Datatype old_type, MPI_Datatype* new_type)
{
int retval;
- if (block_length<0)
+ if (block_length<0)
return MPI_ERR_ARG;
MPI_Aint lb = 0;
MPI_Aint ub = 0;
if(old_type->flags_ & DT_FLAG_DERIVED)
contiguous=false;
- if(!contiguous){
+ if (not contiguous) {
*new_type = new Type_Indexed(size * old_type->size(),lb,ub,
DT_FLAG_DERIVED|DT_FLAG_DATA, count, block_lengths, indices, old_type);
}else{
return MPI_ERR_ARG;
size += block_lengths[i];
- if(indices[i]+old_type->lb()<lb)
+ if(indices[i]+old_type->lb()<lb)
lb = indices[i]+old_type->lb();
- if(indices[i]+block_lengths[i]*old_type->ub()>ub)
+ if(indices[i]+block_lengths[i]*old_type->ub()>ub)
ub = indices[i]+block_lengths[i]*old_type->ub();
if ( (i< count -1) && (indices[i]+block_lengths[i]*(static_cast<int>(old_type->size())) != indices[i+1]) )
if (old_type->flags_ & DT_FLAG_DERIVED || lb!=0)
contiguous=false;
- if(!contiguous){
+ if (not contiguous) {
*new_type = new Type_Hindexed(size * old_type->size(),lb,ub,
DT_FLAG_DERIVED|DT_FLAG_DATA, count, block_lengths, indices, old_type);
}else{
forced_ub=true;
}
- if(!forced_lb && indices[i]+old_types[i]->lb()<lb)
+ if (not forced_lb && indices[i] + old_types[i]->lb() < lb)
lb = indices[i];
- if(!forced_ub && indices[i]+block_lengths[i]*old_types[i]->ub()>ub)
+ if (not forced_ub && indices[i] + block_lengths[i] * old_types[i]->ub() > ub)
ub = indices[i]+block_lengths[i]*old_types[i]->ub();
if ( (i< count -1) && (indices[i]+block_lengths[i]*static_cast<int>(old_types[i]->size()) != indices[i+1]) )
contiguous=false;
}
- if(!contiguous){
- *new_type = new Type_Struct(size, lb,ub, DT_FLAG_DERIVED|DT_FLAG_DATA,
+ if (not contiguous) {
+ *new_type = new Type_Struct(size, lb,ub, DT_FLAG_DERIVED|DT_FLAG_DATA,
count, block_lengths, indices, old_types);
}else{
Datatype::create_contiguous(size, MPI_CHAR, lb, new_type);