0

scanf("%d", &size)を使用し、行列のサイズを指定して を定義する mpi 行列多重化プログラムをコーディングしましたが、コンパイルするint matrix[size*size]と、行列が宣言されていないと報告されました。理由、または私の問題を教えてください。

Ed の提案に従って、行列の定義を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();     

}              
4

2 に答える 2

1

マトリックスのサイズを設定する前に 1 台のマシンで scanf() を使用している可能性がありますが、マトリックスのサイズがすべてのマシンに格納されている場合、scanf() はすべてのマシンで実行されません。

その場合、MPI 機能を開始する前に、メイン プロセスでマトリックスのサイズを scanf() してから、マトリックスのサイズを送信する必要があります (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 ステートメントの前に定義して、さらに機能させる必要があるため、割り当てずに main の直後に定義するだけです。(そうしないと、他のプロセスがそれらを使用しようとしたときにそれらは存在しません)

申し訳ありませんが、コードを理解して実際に実行する時間がありませんが、少なくともデバッグ可能な実行可能なコードを取得する必要があります。

于 2009-04-14T14:07:18.407 に答える
0

「サイズ」の値は、コンパイル時には不明です。したがって、エラー。

コーディングに不慣れな場合は、サイズの値を読み取って割り当てようとしているのは論理的に思えるかもしれません。実際、これはPythonのようなインタプリタ言語で機能します。ただし、コードはCです。Cプログラムを動作させるにはコンパイルする必要があります。コンパイラがコードを見るとき、変数「size」の値が何であるかを知りません。次のステートメントでは、変数「size」を使用しています。そのため、値がまだわかっていない変数を使用しようとしています。それがコンパイラが不満を言っていることです。

これを解決する2つの方法:1)十分に大きなマトリックス(たとえば、1000 X 1000)を宣言します。実行時に、使用するサイズを決定します。ただし、ソースにハードコーディングした値、つまり1000 X 1000を超える値を指定しないでください。ここで行っているのは、1000 X 1000アイテムにメモリを割り当てるようにコンパイラに指示することですが、スペース全体を使用する場合と使用しない場合があります。あなたはメモリを浪費するでしょう、そしてこれはこれをするための効率的な方法ではありません。

2)動的割り当てを使用します。ただし、この質問の性質を考えると、現時点ではこれはあまりにも進んでいる可能性があります。

于 2011-03-03T23:16:55.457 に答える