Hi,
I have faced with a problem when my program try to send structure data more than two process. I created data structure mpi_docking_t as below
typedef struct s_docking{ char receptor[MAX_FILE_NAME]; char compound[MAX_FILE_NAME]; }docking_t; /************* mpi_docking_t ***************************/ const int nitems_dock=2; int blocklengths_dock[nitems_dock] = {MAX_PATH, MAX_PATH}; MPI_Datatype types_dock[nitems_dock] = {MPI_CHAR, MPI_CHAR}; MPI_Aint offsets_dock[nitems_dock]; offsets_dock[0] = offsetof(docking_t, receptor); offsets_dock[1] = offsetof(docking_t, compound); MPI_Type_create_struct(nitems_dock, blocklengths_dock, offsets_dock, types_dock, &mpi_docking_t); MPI_Type_commit(&mpi_docking_t); /************* mpi_docking_t end ***************************/
i tried to send data based on this code:
//Preparing buffer to be sent docking_t *buff = NULL; int buffer_dock; buffer_dock = sizeof(docking_t)*number_dock*MPI_BSEND_OVERHEAD; buff = (docking_t *) malloc(buffer_dock); f_dock = open_file(argv[2], fREAD); //Ignoring first line of file fgets(line, MAX_LINE_FILE, f_dock); //Obtaining docking that will be executed in root for (num_line_ref = 0; num_line_ref < number_dock_root; num_line_ref++){ fgets(line, MAX_LINE_FILE, f_dock); set_receptor_compound(docking_root[num_line_ref].receptor, docking_root[num_line_ref].compound, line); } MPI_Buffer_attach(buff, buffer_dock); num_line_ref = -1; dest = 1; while (fgets(line, MAX_LINE_FILE, f_dock) != NULL){ if (num_line_ref < number_dock){ num_line_ref = num_line_ref + 1; }else{ MPI_Isend(v_docking, number_dock, mpi_docking_t, dest, tag_docking, MPI_COMM_WORLD, &request_dock); dest = dest + 1; num_line_ref = 0; } set_receptor_compound(v_docking[num_line_ref].receptor, v_docking[num_line_ref].compound, line); } //Sending to last rank because MPI_Send inside while command is not executed for the last rank MPI_Isend(v_docking, number_dock, mpi_docking_t, dest, tag_docking, MPI_COMM_WORLD, &request_dock); fclose(f_dock);
My receid code is:
MPI_Irecv(v_docking, number_dock, mpi_docking_t, root,tag_docking, MPI_COMM_WORLD, &request_dock); MPI_Wait(&request_dock, &status);
When I execute my program using line below, it works fine.
faccioli@faccioli:~/Execute/MPI$ mpirun -np 2 /home/faccioli/workspace/drugdesign/virtualscreening/build/./vs_main config.conf overall_docking_list.txt faccioli@faccioli:~/Execute/MPI$
However, when I increase the process number (-np > 2) I receive a memory error. I looked at internet and the book Using MPI by William Gropp, but no success to indentify a solution. I understood that I have to create a MPI derived data type. I couldn't understand how I do it.
My project is [1]. My main file is virtual_screening/src/vs_main.c.
I appreciate any help.
Thanks in advance.