Algoritmo parallelo - Prodotto matrice per vettore (1 strategia)

di Anonimizzato12128 il
3 risposte
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

3 Risposte

  • Fortunatamente preso dalla calma sono arrivato alla conclusione. C'erano un bel pò di errori:
    
    #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);
    	if(id != 0) {
    		v = (int *)calloc(m,sizeof(int));
    	}
    	MPI_Bcast(v,m,MPI_INT,0,MPI_COMM_WORLD);
    	
    	nlocale = n/nproc;
    	
    	vettorelocale = (int *)malloc(sizeof(int)*nlocale*m);
    	
    	if(id == 0) {
    		vettorelocale = alin;
    		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[0],nlocale*m,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
    	}
    	
    		printf("\nVettore v Processore %d\n",id);
    		for(i=0;i<m;i++) {
    			printf("%d ", v[i]);
    		}
    		
    		printf("\nVettore locale Processore %d\n", id);
    		for(i=0;i<nlocale*m;i++) {
    			printf("%d ", vettorelocale[i]);
    		}
    	
    	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;
    }
    
  • Darò un'occhiata senz'altro. Grazie mille!
Devi accedere o registrarti per scrivere nel forum
3 risposte