Ошибка компиляции умножения матрицы MPI: необъявлено

Я написал программу умножения матриц mpi, в которой используется scanf("%d", &size), обозначающий размер матрицы, затем я определил int matrix[size*size], но когда я выполнил ее, он сообщил, что матрица не объявлена. Подскажите, пожалуйста, почему, или в чем моя проблема!

По совету Эда я изменил определение матрицы на блок if(myid == 0), но получил ту же ошибку! Теперь я публикую свой код, пожалуйста, помогите мне найти, где я допустил ошибки! спасибо!

#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();     

}              

person Johnson    schedule 14.04.2009    source источник
comment
Можем ли мы получить немного больше кода/объяснения, пожалуйста?   -  person Ed James    schedule 14.04.2009
comment
Да, в вашем вопросе недостаточно продолжения.   -  person paxdiablo    schedule 14.04.2009
comment
Согласно предложению Эда, я изменил определение матрицы на блок if(rand == 1), но все равно получил ту же ошибку! теперь я разместил свой код, пожалуйста, помогите мне найти, где я допустил ошибки! #include mpi.h #include ‹stdio.h› #include ‹math.h› #include ‹time.h› int size; int main(int argc, char* argv[])   -  person Johnson    schedule 15.04.2009


Ответы (2)


Возможно, вы используете scanf() на одной машине до того, как установите размер матрицы, однако, если размер матрицы хранится на всех машинах, scanf() не будет запускаться на них всех.

Если это так, вам нужно будет отсканировать () размер матрицы в основном процессе, прежде чем вы начнете с функциональностью MPI, а затем отправить размер матрицы (через COMM_WORLD.Bcast() или какой-либо другой метод) каждому процессу, чтобы матрица была определена правильно.

Конечно, это всего лишь предположение, потому что вы предоставили слишком мало информации, чтобы дать обоснованный ответ, поэтому я выберу наиболее вероятное объяснение.

РЕДАКТИРОВАТЬ

Хорошо, вот некоторые изменения, которые заставят его скомпилироваться (некоторые из них могут быть сделаны в любом случае, ваш код получился немного забавным, когда вы его вставили, и могут быть другие, которые я пропустил, опять же код отформатирован немного забавно)

MPI_Send(maxtrix2, size*size, MPI_INT, i, 0, MPI_COMM_WORLD); 
должно быть
MPI_Send(&matrix2, size*size, MPI_INT, i, 0, MPI_COMM_WORLD); 

         int section = size/numprocs;
         int tail = size % numprocs;
Они должны быть определены перед первым оператором if, чтобы они работали дальше, поэтому просто определяйте их сразу после основного, не назначая их. (В противном случае они не существуют, когда другие ваши процессы пытаются их использовать)

Извините, но у меня нет времени разбираться в коде и на самом деле заставить его делать то, что вы хотите, но это должно, по крайней мере, дать вам исполняемый код, который вы можете отлаживать.

person Ed James    schedule 14.04.2009
comment
Благодарю вас! твой ответ вдохновил меня! Пробовал, но ошибки все равно есть! Итак, я публикую свой код, надеюсь, вы поможете мне его отладить! - person Johnson; 15.04.2009

Значение «size» неизвестно во время компиляции. Отсюда ошибка.

Если вы новичок в программировании, может показаться логичным, что вы читаете значение размера и пытаетесь выделить его. На самом деле это будет работать для интерпретируемых языков, таких как Python. Но ваш код написан на C. Для работы C-программы должны быть скомпилированы. Когда компилятор просматривает ваш код, он не знает, каково значение переменной "size". И в следующем утверждении вы используете переменную «размер». Итак, вы пытаетесь использовать переменную, значение которой еще не известно. Это то, на что компилятор жалуется.

Два способа решить эту проблему: 1) Объявить достаточно большую матрицу, скажем, 1000 X 1000. И во время выполнения вы сами решаете, какой размер вы хотите использовать. Но не давайте значений больше, чем то, что вы жестко закодировали в исходном коде, то есть 1000 X 1000. Здесь вы говорите компилятору выделить память для 1000 X 1000 элементов, но вы можете использовать или не использовать все пространство. Вы будете тратить память, и это неэффективный способ сделать это.

2) Используйте динамическое размещение. Однако, учитывая характер этого вопроса, он может быть слишком сложным для вас в данный момент.

person powerrox    schedule 03.03.2011