Компиляция мультипликации матрицы MPI err: undeclared - PullRequest
0 голосов
/ 14 апреля 2009

Я кодировал программу мультипликации матрицы 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();     

}              

Ответы [ 2 ]

1 голос
/ 14 апреля 2009

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

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

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

EDIT

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

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

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

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

0 голосов
/ 04 марта 2011

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

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

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

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

...