LAM/MPI logo

LAM/MPI General User's Mailing List Archives

  |   Home   |   Download   |   Documentation   |   FAQ   |   all just in this list

From: Adán Cosgaya (acosgaya_at_[hidden])
Date: 2006-11-16 21:32:13


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