What`s wrong with my code

Halevy, Benny bhalevy at panasas.com
Mon Nov 3 11:02:54 EST 2003


Mathias, I suspect you run out of stack with higher values of LINHAS and COLUNAS.
Try calculating how much memory these automatic variables need...

>	if(my_rank == master) {
>		  int matriz1[LINHAS][COLUNAS],
>matriz2[LINHAS][COLUNAS], resultado[LINHAS][COLUNAS];

You should consider to allocate these matrices dynamically using
malloc();

- Benny

>-----Original Message-----
>From: Mathias Brito [mailto:mathiasbrito at yahoo.com.br]
>Sent: Monday, November 03, 2003 7:54 AM
>To: beowulf at beowulf.org
>Subject: What`s wrong with my code
>
>
>Well, I avoided to send my code, because it is not the
>best way to solve the problem, and I using only the
>basics calls of MPI. The programam make the sum of two
>matrices. It generate two matrices ramdomically and
>sum it. But it didn`t work with a matrix greather than
>834x834. I dont kwon why. Some variables and functions
>have portuguese names, but i commented it to say what
>it do.
>
>#include <stdio.h>
>#include <stdlib.h>
>#include <time.h>
>#include <mpi.h>
>
>#define LINHAS 835	/*Number of lines*/
>#define COLUNAS 835	/*Number of colums*/
>#define TRUE 1
>#define FALSE 0
>
>void juntar(int *, int*); /*put the result of local
>operation in the final result matrix*/
>void somar(int *, int*, int*); /*make the sum*/
>void imprimir(int[][COLUNAS]); /*print a matrix*/
>void inicializar(int[][COLUNAS]); /*initialize matrix
>with ramdom numbers*/
>
>int main(int argc, char *argv[]) {
>	int minha_parte1[LINHAS], /*my_part, my_result*/
>minha_parte2[LINHAS], meu_resultado[LINHAS] = {0};
>	int size, my_rank;
>	int i, j, tag = 0;
>	int master = 0;
>	int sair = 0; /*exit = 0*/
>	MPI_Status status;
>
>	srand(time(NULL));
>
>	MPI_Init(&argc, &argv);
>	MPI_Comm_size(MPI_COMM_WORLD, &size);
>	MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
>
>	if(my_rank == master) {
>		  int matriz1[LINHAS][COLUNAS],
>matriz2[LINHAS][COLUNAS], resultado[LINHAS][COLUNAS];
>		  int linhas_env = 0;	/*number of line sent*/
>		  int linhas_rec = 0;   /*number of lines received*/
>
>		  inicializar(matriz1);
>		  inicializar(matriz2);
>
>		  //imprimir(matriz1);
>		  //imprimir(matriz2);
>
>		  for(i = 1; i < size; i++) {
>			    if(linhas_env < LINHAS) {
>				    
>if(MPI_Send(&matriz1[linhas_env][0], COLUNAS,
>MPI_INT, i, tag, MPI_COMM_WORLD) == MPI_ERR_BUFFER)
>					    printf("ERRO\n");
>				    
>MPI_Send(&matriz2[linhas_env][0], COLUNAS,
>MPI_INT, i, tag, MPI_COMM_WORLD);
>				    //printf("MASTER: Enviando 
>dados para o
>processo %d\n", i);
>				    linhas_env++;
>			    }
>		  }
>		  
>
>		  i = 1;
>		  while(TRUE) {
>
>			    if(linhas_rec < LINHAS) {
>				    MPI_Recv(&meu_resultado, 
>COLUNAS, MPI_INT, i,
>tag, MPI_COMM_WORLD, &status);
>				    juntar(&resultado[linhas_rec][0],
>meu_resultado);
>				    //printf("MASTER: Recebendo 
>dados do processo
>%d. Total de linhas recebidas = %d\n", i, linhas_rec +
>1);
>				    linhas_rec++;
>			    }
>			    else
>					break;
>			    
>			    if(linhas_env < LINHAS) {
>				    
>MPI_Send(&matriz1[linhas_env][0], COLUNAS,
>MPI_INT, i, tag, MPI_COMM_WORLD);
>				    
>MPI_Send(&matriz2[linhas_env][0], COLUNAS,
>MPI_INT, i, tag, MPI_COMM_WORLD);
>				    //printf("MASTER: Enviado 
>mais dados para o
>processo %d. Total de linhas enviadas = %d\n", i,
>linhas_env + 1);
>				    linhas_env++;
>			    }
>			    if(i == size - 1)
>					i = 1;
>			    else
>			    		i++;
>		  }
>
>		  for(i = 1; i < size; i++) {
>			    MPI_Send(&sair, COLUNAS, MPI_INT, i, tag,
>MPI_COMM_WORLD);
>			    //printf("MASTER: Finalizando 
>processo %d\n",
>i);
>		  }
>		  
>		  printf("\n\n");
>		  //imprimir(resultado);
>
>	}
>	else {
>		  while(TRUE) {
>			  MPI_Recv(&minha_parte1, COLUNAS, 
>MPI_INT, master,
>tag, MPI_COMM_WORLD, &status);
>			  if(minha_parte1[0] == 0)
>				  break;
>
>			  MPI_Recv(&minha_parte2, COLUNAS, 
>MPI_INT, master,
>tag, MPI_COMM_WORLD, &status);
>			  
>			  somar(minha_parte1, minha_parte2, 
>meu_resultado);
>	
>			  MPI_Send(&meu_resultado, COLUNAS, MPI_INT,
>master, tag, MPI_COMM_WORLD);
>		}
>	}
>	
>	MPI_Finalize();
>	return 0;
>}
>
>void juntar(int *m, int *r) {
>	int i;
>	for(i = 0; i < COLUNAS; i++) {
>		m[i] = r[i];
>	}
>}
>
>void somar(int m[], int n[], int r[]) {
>	  int i;
>	  for(i = 0; i < COLUNAS; i++)
>		    r[i] = m[i] + n[i];
>}
>
>void imprimir(int m[][COLUNAS]) {
>	  int i, j;
>	  for(i = 0;i < LINHAS; i++) {
>		    for(j = 0; j < COLUNAS; j++) {
>				printf("%d\t", m[i][j]);
>		    }
>		    printf("\n");
>	  }
>	  printf("\n\n");
>}
>
>void inicializar(int m[][COLUNAS]) {
>	  int i, j;
>	  for(i = 0; i < LINHAS; i++) {
>		    for(j = 0; j < COLUNAS; j++) {
>				m[i][j] = (rand() % 10) + 1;
>		    }
>	  }
>}
>
>
>=====
>Mathias Brito
>Universidade Estadual de Santa Cruz - UESC
>Departamento de Ciências Exatas e Tecnológicas
>Estudante do Curso de Ciência da Computação
>
>Yahoo! Mail - o melhor webmail do Brasil
>http://mail.yahoo.com.br
>_______________________________________________
>Beowulf mailing list, Beowulf at beowulf.org
>To change your subscription (digest mode or unsubscribe) visit 
>http://www.beowulf.org/mailman/listinfo/beowulf
>
_______________________________________________
Beowulf mailing list, Beowulf at beowulf.org
To change your subscription (digest mode or unsubscribe) visit http://www.beowulf.org/mailman/listinfo/beowulf



More information about the Beowulf mailing list