fork download
  1. //Matrice vettore II strategia (per colonne)
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <mpi.h>
  7.  
  8.  
  9. /**
  10. * Funzione che esegue il prodotto matrice vettore
  11. */
  12. void prod_mat_vett(double w[], double *a, int ROWS, int COLS, double v[])
  13. {
  14. int i, j;
  15.  
  16. for(i=0;i<ROWS;i++)
  17. {
  18. w[i]=0;
  19. for(j=0;j<COLS;j++)
  20. {
  21. w[i] += a[i*COLS+j]* v[j];
  22. }
  23. }
  24. }
  25.  
  26.  
  27. int main(int argc, char **argv) {
  28.  
  29. int nproc; // Numero di processi totale
  30. int me; // Il mio id
  31. int m,n; // Dimensione della matrice
  32. int local_n; // Dimensione dei dati locali
  33. int i,j; // Iteratori vari
  34. double T_inizio,T_fine,T_max;
  35. // Variabili di lavoro
  36. double *A, *At, *v, *local_v, *localA, *localAt, *local_w, *w;
  37.  
  38.  
  39. //Attiva MPI/
  40. MPI_Init(&argc, &argv);
  41. //Trova il numero totale dei processi/
  42. MPI_Comm_size (MPI_COMM_WORLD, &nproc);
  43. //Da ad ogni processo il proprio numero identificativo/
  44. MPI_Comm_rank (MPI_COMM_WORLD, &me);
  45.  
  46. // Se sono a radice
  47. if(me == 0)
  48. {
  49. printf("inserire numero di righe m = \n");
  50. fflush(stdout);
  51. scanf("%d",&m);
  52.  
  53. printf("inserire numero di colonne n = \n");
  54. fflush(stdout);
  55. scanf("%d",&n);
  56. // Numero di righe da processare
  57. local_n = n/nproc;
  58.  
  59. // Alloco spazio di memoria
  60. A = malloc(m * n * sizeof(double));
  61. v = malloc(sizeof(double)*n);
  62. w = malloc(sizeof(double)*m);
  63.  
  64. //printf("v = \n");
  65. for (j=0;j<n;j++)
  66. {
  67. v[j]=j;
  68. // printf("%f ", v[j]);
  69. }
  70. // printf("\n");
  71.  
  72. // printf("A = \n");
  73. for (i=0;i<m;i++)
  74. {
  75. for(j=0;j<n;j++)
  76. {
  77. if (j==0)
  78. A[i*n+j]= 1.0/(i+1)-1;
  79. else
  80. A[i*n+j]= 1.0/(i+1)-pow(1.0/2.0,j);
  81. // printf("%f ", A[i*n+j] );
  82. }
  83. // printf("\n");
  84. }
  85.  
  86. //Scrivo la matrice trasposta su cui eseguire le operazioni
  87. At=malloc(m * n * sizeof(double));
  88. for(i=0;i<n;i++)
  89. {
  90. for(j=0;j<m;j++)
  91. {
  92. At[i*m+j]=A[j*n+i];
  93. }
  94. }
  95.  
  96. } // fine me==0
  97. fflush(stdout);
  98. // Spedisco m, n, local_n e v
  99. MPI_Bcast(&m,1,MPI_INT,0,MPI_COMM_WORLD);
  100. MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);
  101. MPI_Bcast(&local_n,1,MPI_INT,0,MPI_COMM_WORLD);
  102.  
  103. // 0 invia a tutti un pezzo del vettore v
  104. if(me != 0)
  105. local_v=malloc(sizeof(double)*local_n);
  106. MPI_Scatter(&v[0],local_n, MPI_DOUBLE, &local_v[0], local_n ,MPI_DOUBLE,0,MPI_COMM_WORLD);
  107.  
  108. // tutti allocano A locale e il vettore dei risultati
  109.  
  110. localA = malloc(m * local_n * sizeof(double));
  111. localAt= malloc(m * local_n * sizeof(double));
  112. local_w = malloc(m * sizeof(double));
  113.  
  114. // Adesso 0 invia a tutti un pezzo della matrice
  115. int num = local_n*m;
  116. MPI_Scatter(
  117. &At[0], num, MPI_DOUBLE,
  118. &localAt[0], num, MPI_DOUBLE,
  119. 0, MPI_COMM_WORLD);
  120.  
  121. // Scriviamo la matrice locale ricevuta
  122. //printf("localA %d = \n", me);
  123. for(i = 0; i < m; i++)
  124. {
  125. for(j = 0; j < local_n; j++)
  126. {
  127.  
  128. localA[i*m+j]=localAt[j*(local_n+1)+i];
  129. // printf("%lf\t", localA[i*m+j]);
  130. }
  131. // printf("\n");
  132. }
  133.  
  134. // Effettuiamo i calcoli
  135. T_inizio=MPI_Wtime();//inizio del cronometro per il calcolo del tempo di inizio
  136. prod_mat_vett(local_w,localA,m,local_n,local_v);
  137. T_fine=MPI_Wtime()-T_inizio; // calcolo del tempo di fine
  138. // Eseguiamo le somme dei risultati ottenuti in ogni processore
  139. MPI_Reduce(&local_w[0],&w[0],m,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);
  140. MPI_Reduce(&T_fine,&T_max,1,MPI_DOUBLE,MPI_MAX,0,MPI_COMM_WORLD);
  141. // 0 stampa la soluzione
  142. if(me==0)
  143. {
  144. //printf("w = \n");
  145. //for(i = 0; i < m; i++)
  146. {
  147. // printf("%f ", w[i]);
  148. // printf("\n");
  149. }
  150. printf("\nTempo calcolo locale: %lf\n", T_fine);
  151. printf("\nMPI_Reduce max time: %f\n",T_max);
  152. }
  153.  
  154. MPI_Finalize (); /* Disattiva MPI */
  155. return 0;
  156. }
Success #stdin #stdout #stderr 0.29s 40420KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error: unexpected '/' in "/"
Execution halted