Search code examples
data-structuresmpigmp

Send array of mpz_t over mpi


I use a libgmp (GMP) to work with very long integers, stored as mpz_t: http://gmplib.org/manual/Integer-Internals.html#Integer-Internals

mpz_t variables represent integers using sign and magnitude, in space dynamically allocated and reallocated.

So I think mpz_t is like pointer.

How can I send an array of mpz_t variables with data over MPI?


Solution

  • Here is the code:

    unsigned long *buf, *t; // pointers for ulong array for storing gmp data
    unsigned long count, countc; // sizes of data and element sizes array 
    unsigned long size = array_size; // size of array
    size_t *bc,*tc; // pointers for size_t array to store element sizes;
    
    buf=(unsigned long*)malloc(sizeof(unsigned long)*(size*limb_per_element));
    bc=(size_t*)malloc(sizeof(size_t)*(size));
    
    if(rank==SENDER_RANK) {
        t=buf;
        tc=bc;
        for(int i;i<size;i++) {
            mpz_export(t,tc,1,sizeof(unsigned long),0,0, ARRAY(i));
            t+=*tc;
        tc++;
        }
        count=t-buf;
        countc=tc-bc;
        MPI_Send(&count, 1, MPI_UNSIGNED_LONG, 0, 0, MPI_COMM_WORLD);
        MPI_Send(&countc, 1, MPI_UNSIGNED_LONG, 0, 0, MPI_COMM_WORLD);
        MPI_Send(bc, countc*(sizeof(size_t)), MPI_CHAR, 0, 0, MPI_COMM_WORLD);
        MPI_Send(buf, count, MPI_UNSIGNED_LONG, 0, 0, MPI_COMM_WORLD);
    } else {
        status=MPI_Recv(&count, 1, MPI_UNSIGNED_LONG, SENDER_RANK, 0, MPI_COMM_WORLD, NULL); 
        status=MPI_Recv(&countc, 1, MPI_UNSIGNED_LONG, SENDER_RANK, 0, MPI_COMM_WORLD, NULL); 
        t=buf;
        tc=bc;
        status=MPI_Recv(bc, countc*(sizeof(size_t)), MPI_CHAR, SENDER_RANK, 0, MPI_COMM_WORLD, NULL); 
        status=MPI_Recv(buf, count, MPI_UNSIGNED_LONG, SENDER_RANK, 0, MPI_COMM_WORLD, NULL); 
        for(int i; i<size; i++) {
            mpz_import(ARRAY(i),*tc,1,sizeof(unsigned long),0,0, t);
            t+=*tc;
            tc++;
        }
    }
    free(buf);
    free(bc);