Hi,
I am trying to build a derived datatype from a class, but I am having
problems to make it work, here is my class:
class NNEntry {
public:
int m_status;
long m_id;
double* m_p;
double m_minDist;
int m_isaLeaf;
int m_dimension;
NNEntry(int st, long id, double* p , double f, bool leaf, int d) :
m_status(st), m_id(id), m_p(p), m_minDist(f), m_isaLeaf(leaf),
m_dimension(d) { }
~NNEntry() {}
struct ascending : public std::binary_function<NNEntry*, NNEntry*,
bool> {
bool operator()(const NNEntry* __x, const NNEntry* __y) const {
return __x->m_minDist > __y->m_minDist; }
};
}; // NNEntry
and this is my attempt to create a datatype:
void buildDerivedDataType(int d, MPI_Datatype *MY_MPI_TYPE){
NNEntry* Point;
const int n = 6; // number of elements in the class
int block_lengths[n];
MPI_Aint displacements[n];
MPI_Datatype typelist[n];
MPI_Aint start_address;
MPI_Aint address;
block_lengths[0] = block_lengths[1]
= block_lengths[3]
= block_lengths[4]
= block_lengths[5] = 1;
block_lengths[2] = d;
typelist[0] = MPI_INT;
typelist[1] = MPI_LONG;
typelist[2] = MPI_DOUBLE;
typelist[3] = MPI_DOUBLE;
typelist[4] = MPI_INT;
typelist[5] = MPI_INT;
MPI_Address(&Point->m_status, &start_address);
displacements[0] = 0;
MPI_Address(&Point->m_id, &address);
displacements[1] = address-start_address;
MPI_Address(&Point->m_p[0], &address);
displacements[2] = address-start_address;
MPI_Address(&Point->m_minDist, &address);
displacements[3] = address-start_address;
MPI_Address(&Point->m_isaLeaf, &address);
displacements[4] = address-start_address;
MPI_Address(&Point->m_dimension, &address);
displacements[5] = address-start_address;
MPI_Type_struct(n, block_lengths, displacements, typelist, MY_MPI_TYPE);
MPI_Type_commit(MY_MPI_TYPE);
}
and here is a simple test to check if it works:
....
MPI_Datatype MY_NNEntry_TYPE;
buildDerivedDataType(d, &MY_NNEntry_TYPE);
if (myId == 0){ // try to send one element of type NNEntry* stored
in skyQuery.S[0]
MPI_Send(&skyQuery.S[0], 1, MY_NNEntry_TYPE, 1, 111,
MPI_COMM_WORLD);
}
if (myId == 1){
NNEntry* e;
MPI_Recv(e, 1, MY_NNEntry_TYPE, 0, 111, MPI_COMM_WORLD,
&status);
}
It is not working, and I am not sure if it is because of the construction of
my datatype. I'd really appreciate any suggestion or hint as to how to fix
it.
Thanks
Adan
|