Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trying to MPI_Send and MPI_Recv char array getting garbage

Tags:

mpi

I'm trying to create a log file from each processor and then send that to the root as a char array. I first send the length and then I send the data. The length sends fine, but the data is always garbage! Here is my code:

MPI_Barrier (MPI_COMM_WORLD);
string out = "";

MPI_Status status[2];
MPI_Request reqs[num_procs];

string log = "TEST";
int length = log.length();
char* temp = (char *) malloc(length+1);
strcpy(temp, log.c_str());

if (my_id != 0)
{
    MPI_Send (&length, 1, MPI_INT, 0, 1, MPI_COMM_WORLD);
    MPI_Send (&temp, length+1, MPI_CHAR, 0, 1, MPI_COMM_WORLD);
}   
else {      
    int length;
    for (int i = 1; i < num_procs; i++)
    {
        MPI_Recv (&length, 2, MPI_INT, i, 1, MPI_COMM_WORLD, &status[0]);
        char* rec_buf;
        rec_buf = (char *) malloc(length+1);
        MPI_Recv (rec_buf, length+1, MPI_CHAR, i, 1, MPI_COMM_WORLD, &status[1]);
        out += rec_buf;
        free(rec_buf);
    }
}

MPI_Barrier (MPI_COMM_WORLD);
free(temp);
like image 356
user2228583 Avatar asked Mar 31 '13 05:03

user2228583


1 Answers

You are passing a char** to MPI_Send instead of a char* this causes memory corruption, or in your case the garbled output you are getting. Everything should be fine if you use

MPI_Send (temp, length+1, MPI_CHAR, 0, 1, MPI_COMM_WORLD);

(note the removed & in front of the first argument, temp.)

like image 94
niklasfi Avatar answered Nov 18 '22 06:11

niklasfi