Pergunta

eu codificado um MPI matriz multification programa, que o uso scanf("%d", &size), tamanho matriz designado, em seguida, I definido int matrix[size*size], mas quando cumprida, ele relatam que a matriz é não declarado. Por favor, me diga por que, ou o que o meu problema é!

De acordo com a sugestão do Ed, eu mudei a definição de matriz para bloco if(myid == 0), mas tem o mesmo err! Agora eu postar meu código, por favor, me ajudar a descobrir onde eu cometi erros! obrigado!

#include "mpi.h"
#include <stdio.h>
#include <math.h>
#include <time.h>

int size;

int main(int argc, char* argv[])
     {

     int myid, numprocs;
     int *p;
     MPI_Status status;

     int i,j,k;

     MPI_Init(&argc, &argv);
     MPI_Comm_rank(MPI_COMM_WORLD,&myid);
     MPI_Comm_size(MPI_COMM_WORLD, &numprocs);




     if(myid == 0)
     {
             scanf("%d", &size);
             int matrix1[size*size];
             int matrix2[size*size];
             int matrix3[size*size];
             int section = size/numprocs;
             int tail = size % numprocs;


             srand((unsigned)time(NULL));

             for( i=0; i<size; i++)
                for( j=0; j<size; j++)
                   {
                        matrix1[i*size+j]=rand()%9;
                        matrix3[i*size+j]= 0;
                        matrix2[i*size+j]=rand()%9;
                   }   

             printf("Matrix1 is: \n"); 
             for( i=0; i<size; i++)
                {
                for( j=0; j<size; j++)
                  {
                        printf("%3d", matrix1[i*size+j]);
                  }
                printf("\n");
                }

             printf("\n");
             printf("Matrix2 is: \n");
             for( i=0; i<size; i++)
                {
                for( j=0; j<size; j++)
                {
                        printf("%3d", matrix2[i*size+j]);
                }
                printf("\n");
                }                
              //MPI_BCAST(matrix1, size*size, MPI_INT, 0, MPI_COMM_WORLD, );

              for( i=1; i<numprocs; i++)
                  {
                      MPI_Send(&size, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
                      MPI_Send(&section, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
                      MPI_Send(&tail, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
                      MPI_Send(maxtrix2, size*size, MPI_INT, i, 0, MPI_COMM_WORLD); 

                  }


              j = 0;

              for( i=1; i<numprocs-1; i++)
                  {
                       p = &matrix1[size*section*j++];
                       MPI_Send(p, size*section, MPI_INT, i, 1, MPI_COMM_WORLD);
                  }
              p = &matrix1[size*section*j];
              MPI_Send(p, size*section+size*tail, MPI_INT, numprocs-1, 1, MPI_COMM_WORLD);


              p = matrix3;
              for( i=1; i<numprocs-1; i++)
                  {
                      MPI_Recv(p, size*section, MPI_INT, i, 1, MPI_COMM_WORLD, &status);
                      p = &matrix3[size*section*i];

                      }
              MPI_Recv(p, size*section+size*tail, MPI_INT, numprocs-1, 1, MPI_COMM_WORLD, &status);

             printf("\n");
             printf("Matrix3 is: \n");
             for( i=0; i<size; i++)
                {
                for( j=0; j<size; j++)
                {
                        printf("%2d ", matrix3[i*size+j]);
                }
                printf("\n");
                }
       }

       else if (myid > 0 && myid<numprocs-1 )
       {      
              MPI_Recv(&size, 1, MPI_INT, 0, 0,MPI_COMM_WORLD, &status);
              MPI_Recv(&section, 1, MPI_INT, 0, 0,MPI_COMM_WORLD, &status);
              MPI_Recv(&tail, 1, MPI_INT, 0, 0,MPI_COMM_WORLD, &status);
              int matrix1[size*size];
              int matrix2[size*size];
              int matrix3[size*size];

              MPI_Recv(matrix2, size*size, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
              MPI_Recv(matrix1, size*section, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);   

              for( i=0; i<section; i++)
                  for( j=0; j<size; j++)
                    for( k=0; k<size; k++)
                    {
                            matrix1[i*size+j] = matrix1[i*size+k]*matrix2[k*size+j];
                    }

             MPI_Send(matrix1, size*section, MPI_INT, 0, 1, MPI_COMM_WORLD);             
       }

       else if (myid > 0 && myid == numprocs-1)
       {
              MPI_Recv(&size, 1, MPI_INT, 0, 0,MPI_COMM_WORLD, &status);
              MPI_Recv(&section, 1, MPI_INT, 0, 0,MPI_COMM_WORLD, &status);
              MPI_Recv(&tail, 1, MPI_INT, 0, 0,MPI_COMM_WORLD, &status);
              int matrix1[size*size];
              int matrix2[size*size];
              int matrix3[size*size];

              MPI_Recv(matrix2, size*size, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
              MPI_Recv(matrix1, size*section+size*tail, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);

              for( i=0; i<section+tail; i++)
                  for( j=0; j<size; j++)
                    for( k=0; k<size; k++)
                    {
                            matrix1[i*size+j] = matrix1[i*size+k]*matrix2[k*size+j];
                    }

             MPI_Send(matrix1, size*section+size*tail, MPI_INT, 0, 1, MPI_COMM_WORLD);       
       }

     return 0;         
     MPI_Finalize();     

}              
Foi útil?

Solução

Pode ser que você está usando scanf () em uma máquina antes de definir o tamanho da matriz, no entanto, se o tamanho da matriz é armazenado em todas as máquinas do scanf () não serão executados em todos eles.

Se for esse o caso, você terá que scanf () o tamanho da matriz no processo principal antes de começar com a funcionalidade MPI, em seguida, enviar o tamanho da matriz (via COMM_WORLD.Bcast () ou algum outro método) para cada processo, a fim da matriz a ser definida correctamente.

Claro, isso é apenas um palpite, porque você forneceu muito pouca informação para fazer uma resposta informada, então eu vou para a explicação mais provável.

Editar

Ok, aqui vai algumas mudanças que tornarão compilar (Alguns deles podem ser feito de qualquer maneira, o código saiu um pouco engraçado quando você colou-lo, e pode haver outros que eu perdi, mais uma vez código é formatado um pouco engraçado)

MPI_Send(maxtrix2, size*size, MPI_INT, i, 0, MPI_COMM_WORLD); 
deveria estar
MPI_Send(&matrix2, size*size, MPI_INT, i, 0, MPI_COMM_WORLD); 

         int section = size/numprocs;
         int tail = size % numprocs;
Estes precisam ser definidas antes da primeira instrução if para que eles para trabalhar ainda mais em, então, basta defini-los logo após a principal sem atribuir-lhes. (Caso contrário eles não existem quando os seus outros processos tentar usá-los)

Desculpe, mas eu não tenho tempo para descobrir o código e realmente fazê-lo fazer o que quiser, mas que deve, pelo menos, obter o código executável pode depurar.

Outras dicas

O valor de "tamanho" não é conhecido em tempo de compilação. Daí o erro.

Pode parecer lógico, se você é novo para a codificação, que você está lendo o valor do tamanho e tentar alocá-lo. Isto, na verdade, trabalho para linguagens interpretadas como Python. Mas o código é em programas C. C precisam ser compilados para o trabalho. Quando os olhares do compilador em seu código, ele não sabe o que é o valor da variável "tamanho". E na próxima declaração, você está usando o "tamanho" variável. Então, você está tentando usar uma variável cujo valor ainda não é conhecido. Isso é o que o compilador está reclamando.

Duas maneiras de resolver isso: 1) Declarar uma matriz suficientemente grande, digamos, 1000 X 1000. E durante o tempo de execução, você decide quanto o tamanho que você deseja usar. Mas os valores não dão mais do que você codificado na fonte, ou seja, 1000 x 1000. O que você está fazendo aqui está dizendo o compilador para alocar memória para 1000 x 1000 itens, mas você pode ou não usar todo o espaço. Você estará desperdiçando memória e esta não é uma maneira eficiente de fazer isso.

2) alocação Use dinâmico. No entanto, dada a natureza desta questão, isso pode ser muito avançado para você no momento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top