Algoritmo parallelo - Prodotto matrice per vettore (1 strategia)

di il
3 risposte

Algoritmo parallelo - Prodotto matrice per vettore (1 strategia)

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

  • Re: Algoritmo parallelo - Prodotto matrice per vettore (1 strategia)

    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;
    }
    
  • Re: Algoritmo parallelo - Prodotto matrice per vettore (1 strategia)

    Invece di usare OpenMPI (immagino stia utilizzando questa) potresti vedere Boost.MPI che ti semplifica molto il codice.

    http://www.boost.org/doc/libs/1_61_0/doc/html/mpi.htm
  • Re: Algoritmo parallelo - Prodotto matrice per vettore (1 strategia)

    Darò un'occhiata senz'altro. Grazie mille!
Devi accedere o registrarti per scrivere nel forum
3 risposte