saulokada 0 Denunciar post Postado Outubro 4, 2008 Eu tenho q faze um programa q faz multiplicação de matrizes so q usando threads... em C para linux... vendo alguns sides do meu professor.. ja fiz qse tudo... so q no final... o programa da segment fault (core dumped) o codigo segue abaixo: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <pthread.h> #define MAX_THRDS 4 //numero de processadores #define max 1000 //tam. max. arquivo float a[max][max], b[max][max], c[max][max]; int n,nprocs; void readdata() { int i,j; FILE *fpa,*fpb; /* read matrix a */ fpa = fopen("a","r"); for (i=0; i < n; i++) for (j=0; j < n; j++) fscanf(fpa,"%f", &a[i][j]); fclose(fpa); /* read matrix b */ fpb = fopen("b","r"); for (i=0; i < n; i++) for (j=0; j < n; j++) fscanf(fpb,"%f", &b[i][j]); fclose(fpb); } void printdata() { int i,j; FILE *fpc; /* write results */ fpc = fopen("thread_c","w"); for (i=0; i < n; i++) for (j = 0; j < n; j++) fprintf(fpc,"%f\n",c[i][j]); fclose(fpc); } void matmul(int *num_thread) //funcao que multiplica..threads a chamam. { int i, j, k; int iprocs, jprocs; int my_id, i_id,j_id,ilb,iub,jlb,jub; /* number of processors in i direction */ iprocs = (int) sqrt((double) nprocs); /* number of processors in j direction */ jprocs = nprocs / iprocs; my_id = *num_thread; //m_get_myid(); /* get processor ID in i and j dimensions */ i_id = my_id % iprocs; j_id = my_id / iprocs; /* find lower and upper bounds of i loop */ ilb = i_id * n / iprocs; iub = (i_id + 1) * (n / iprocs); /* find lower and upper bounds of j loop */ jlb = j_id * n / jprocs; jub = (j_id + 1) * (n / jprocs); for (i = ilb; i < iub; i++) for (j = jlb; j < jub; j++) { c[i][j] = 0.0; for (k = 0; k < n; k++) c[i][j] = c[i][j] + a[i][k] * b [k][j]; } pthread_exit (NULL); } int main(int argc, char **argv) { pthread_t t[MAX_THRDS]; pthread_attr_t attr; int param[MAX_THRDS]; int i; void readdata(),matmul(),printdata(); //inicializacao das threads pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM); /* get n and nprocs parameters */ if (argc != 3){ printf("usage: pth_matrix <size of matrices> <number of processors>\n"); exit(1); } n = atoi(argv[1]); nprocs = atoi(argv[2]); /* reads matrix a and b */ readdata(); /* create threads */ for (i=0; i < nprocs; i++){ param[i]=i; pthread_create(&t[i], &attr, (void *)matmul, ¶m[i]); } /* wait termination of created threads */ for (i=0; i < nprocs; i++) pthread_join(t[i], NULL); /* outputs matrix c */ printdata(); return (0); } Se alguem puder me ajudar eu apreciaria mto! abraços Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Outubro 6, 2008 você deu bastante printf no programa?? pra ver onde é q ele ta colocando coisa na memória onde num deve? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Outubro 6, 2008 readdata(); Isso é o problema se você não tem o arquivo criado antes de executar o programa. Compartilhar este post Link para o post Compartilhar em outros sites
saulokada 0 Denunciar post Postado Outubro 6, 2008 entao.. utilizando o printf ele executa ate o if do argv... if( argv != 3 ) apos executa-lo... ele sai do programa... e qto ao arquivo... ele ja esta criado sim... contem os valores dos elementos da matriz... Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Outubro 6, 2008 quais parametros q você ta entrando na hr de executar o programa? Compartilhar este post Link para o post Compartilhar em outros sites
saulokada 0 Denunciar post Postado Outubro 6, 2008 ah entao... 2 matrizes nxn... q sao lidas atravez dos arquivos... fora isso... mais nada Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Outubro 6, 2008 poxa nunca mechi com thread, + q eu saiba os parametros do main tem q ser digitados atraves do prompt de comando na hr q você manda executar o programa. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Outubro 6, 2008 - você tem que linkar com -pthread e -lm - os arquivos tem que existir if (argc != 3){ printf("usage: pth_matrix <size of matrices> <number of processors>\n"); exit(1); } - a linha de execucao é pth_matrix 3 2. isis@linux-0khy:~/src/C>cat a3 0 1 0 2 9 -3 5 1 isis@linux-0khy:~/src/C>cat b 2 -3 5 0 2 5 -2 8 0 isis@linux-0khy:~/src/C>./a.out 3 2 isis@linux-0khy:~/src/C>cat resultado 4.000000 -1.000000 15.000000 -18.000000 76.000000 10.000000 -8.000000 27.000000 10.000000 Compartilhar este post Link para o post Compartilhar em outros sites
saulokada 0 Denunciar post Postado Outubro 6, 2008 import java.Isis... VOCE SALVOU MINHA SEMANA! deu certinho aqui!!! mto obrigado MESMO!!! abraçosss!!! Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Outubro 6, 2008 O que você estava esquecendo? Compartilhar este post Link para o post Compartilhar em outros sites