Dear user, Please note that this mailing list is exclusively intended to discuss potential issues with the MPICH MPI implementation. Since your question is about general MPI usage, we cannot provide you with that assistance here. You will surely find assistance in this kind of topics in general programming forums such as stackoverflow, where some of our team members contribute as well. Also, web search engines are likely to be a good resource in your case. Best regards, Antonio On 12/05/2014 11:50 AM, Chafik sanaa wrote:
I have a table "tab[]" with 10 elements "0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |" I am sending with the Scatterv function; 4 elements to the process 0 "|0 | 1 | 2 | 3 | 4| "and 6 elements to process 1 "| 5 | 6 | 7 | 8 | 9 | ", after I did the summation of the value" add " to each element of the received table which gives me a new table "afteradd[] "for each process, I want this time collecting the both tables "afteradd[]" and send them to the process 0, after a little research I found that there's a GATHERV function which do that but I do not know how ? program: #include <malloc.h> #include <stdlib.h> #include <stdio.h> #include <time.h> #include "math.h" #include "mpi.h"
int main(int argc, char** argv) { int taskid, ntasks; int ierr, i, itask; intsendcounts[2048], displs[2048], recvcount; double **sendbuff, *recvbuff,*afteradd, buffsum, buffsums[2048]; double inittime, totaltime; const int nbr_etat = 10; double tab[nbr_etat]; for (int i = 0; i < nbr_etat; i++) tab[i] = i; int nbr_elm[2] = { 4, 6 }; int dpl[2] = { 0, 4 }; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &taskid); MPI_Comm_size(MPI_COMM_WORLD, &ntasks); recvbuff = (double *)malloc(sizeof(double)*nbr_etat); if (taskid == 0) { sendbuff = (double **)malloc(sizeof(double *)*ntasks);// run for 2 proc sendbuff[0] = (double *)malloc(sizeof(double)*ntasks*nbr_etat); for (i = 1; i < ntasks; i++) { sendbuff[i] = sendbuff[i - 1] + nbr_etat; } } else { sendbuff = (double **)malloc(sizeof(double *)* 1); sendbuff[0] = (double *)malloc(sizeof(double)* 1); }
if (taskid == 0){
srand((unsigned)time(NULL) + taskid); for (itask = 0; itask<ntasks; itask++) { int k; displs[itask] = itask*nbr_etat; int s = dpl[itask]; sendcounts[itask] = nbr_elm[itask];
for (i = 0; i<sendcounts[itask]; i++) { k = i + s; sendbuff[itask][i] = tab[k]; printf("+ %0.0f ", sendbuff[itask][i]); } printf("\n"); } }
recvcount = nbr_elm[taskid];
inittime = MPI_Wtime();
ierr = MPI_Scatterv(sendbuff[0], sendcounts, displs, MPI_DOUBLE, recvbuff, recvcount, MPI_DOUBLE, 0, MPI_COMM_WORLD);
totaltime = MPI_Wtime() - inittime;
buffsum = 0.0; int add = 3; afteradd = (double *)malloc(sizeof(double)*nbr_etat); for (i = 0; i<recvcount; i++) { afteradd [i]= add + recvbuff[i]; } for (i = 0; i<recvcount; i++) { printf("* %0.0f", afteradd[i]); } printf("\n"); if (taskid == 0) { free(sendbuff[0]); free(sendbuff); } else { free(sendbuff[0]); free(sendbuff); free(recvbuff); } MPI_Finalize();
}
_______________________________________________ discuss mailing list [email protected] To manage subscription options or unsubscribe: https://lists.mpich.org/mailman/listinfo/discuss
-- Antonio J. Peña Postdoctoral Appointee Mathematics and Computer Science Division Argonne National Laboratory 9700 South Cass Avenue, Bldg. 240, Of. 3148 Argonne, IL 60439-4847 [email protected] www.mcs.anl.gov/~apenya _______________________________________________ discuss mailing list [email protected] To manage subscription options or unsubscribe: https://lists.mpich.org/mailman/listinfo/discuss
participants (1)
-
"Antonio J. Peña"