Sono alle prese con questo esercizio con l'utilizzo della libreria MPI per il calcolo del prodotto di una matrice per un vettore solo che mi da un errore di segmentazione che non riesco a risolvere (sarà che ci sto su da un paio di ore e la mia rabbia non mi fa ragionare bene )...
Spero che all'occhio vostro risalti subito l'errore vi posto il codice:
#include <stdlib.h>
#include <stdio.h>
#include "mpi.h"
int main (int argc, char *argv[]) {
//Dichiarazioni
int nproc, id; //Processori
int **A, *v, n, m, *alin; //n righe m colonne
int i, j, k=0;
int *vettorelocale, tmp, nlocale, start, tag;
int *ris;
MPI_Status status;
srand(time(0));
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &nproc);
MPI_Comm_rank(MPI_COMM_WORLD, &id);
if(id == 0) {
printf("Inserisci il numero di righe della tua matrice -> ");
scanf("%d", &n);
printf("Inserisci il numero di colonne della tua matrice -> ");
scanf("%d", &m);
A = (int **)calloc(n,sizeof(int *));
v = (int *)calloc(m,sizeof(int));
for(i=0;i<n;i++) {
A[i] = (int *)calloc(m,sizeof(int *));
}
printf("\nMATRICE\n");
for(i=0;i<n;i++) {
for(j=0;j<m;j++) {
A[i][j] = 1+rand()%4;
printf("%d\t", A[i][j]);
}
printf("\n");
}
printf("\nVETTORE\n");
for(i=0;i<m;i++) {
v[i] = 1+rand()%4;
printf("%d\t", v[i]);
}
printf("\n");
alin = (int *)calloc(m*n,sizeof(int));
for(i=0;i<n;i++) {
for(j=0;j<m;j++) {
alin[k] = A[i][j];
k++;
}
}
for(i=0;i<n;i++) {
free(A[i]);
}
free(A);
}
MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);
MPI_Bcast(&m,1,MPI_INT,0,MPI_COMM_WORLD);
MPI_Bcast(v,m,MPI_INT,0,MPI_COMM_WORLD);
nlocale = n/nproc;
vettorelocale = (int *)malloc(sizeof(int)*m*n);
if(id == 0) {
vettorelocale = v;
tmp = nlocale*m;
start = 0;
for(i=1;i<nproc;i++) {
start = start+tmp;
tag=22+i;
MPI_Send(&alin[start],tmp,MPI_INT,i,tag,MPI_COMM_WORLD);
}
} else {
tag=22+id;
MPI_Recv(vettorelocale,nlocale*m,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
}
ris = (int *)calloc(nlocale,sizeof(int));
for(i=0;i<nlocale;i++) {
for(j=0;j<m;j++) {
ris[i] = ris[i] + v[j]*vettorelocale[i*m + j];
}
}
for(i=0;i<nlocale;i++) {
printf("\nSono il processore %d e il mio risultato è %d\n",id,ris[i]);
}
MPI_Finalize();
return 0;
}
Spero vivamente che qualcuno mi aiuti