2

MPI と C 言語を使用して、パイプライン バージョンのガウス消去法を実装する並列プログラムを作成しようとしています...

ただし、コードの実装の早い段階でいくつかの問題が発生しています....

ルート プロセスを使用して、テキスト ファイルからデータ マトリックスを読み取ります...このプロセスにより、このマトリックスのサイズが得られ、そのサイズを他のすべてのプロセスにブロードキャストして、メモリに割り当てることができます...ただし、スレーブ プロセスは、ルートからのブロードキャストの前にそれを割り当てようとしています...どうすればそれらを待機させることができますか?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <mpi.h>

int CalcInd(int i, int j, int dimL)
{
  return i*dimL +j;
}

int main (int argc, char **argv)
{
  FILE *fin, *fout;
  char fA[] = "Matrix.txt";

  int rank, size, i, ii, j, k, m, n, picked, tmp, total;
  int  counter=0, elements=0;
  int * RightNeigbhor, * LeftNeigbhor, * loc;

  float f, magnitude, t;
  float * A, * x;

  MPI_Status status;
  MPI_Request request;

  // MPI initialization
  MPI_Init(&argc, &argv);  
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  MPI_Barrier(MPI_COMM_WORLD);

  if(rank == 0)
  {
    // Defenição dos processos vizinhos pelo master
    RightNeigbhor = (int *)calloc(size,sizeof(int));
    if(RightNeigbhor==NULL)
      {printf("!!! Could not allocate memory !!!\n"); exit(-1);}
    LeftNeigbhor = (int *)calloc(size,sizeof(int));
    if(RightNeigbhor==NULL)
      {printf("!!! Could not allocate memory !!!\n"); exit(-1);}

    for(i = 0; i < size; i++ )
    {
      RightNeigbhor[i] = (rank + 1) % size;
      LeftNeigbhor[i] = (rank - 1) % size;
    }
    // Broadcast os processos vizinhos para todos os processos
    MPI_Bcast ( RightNeigbhor, size, MPI_INTEGER, rank, MPI_COMM_WORLD );
    MPI_Bcast ( LeftNeigbhor, size, MPI_INTEGER, rank, MPI_COMM_WORLD );

    // Leitura da matriz A pelo master
    fin = fopen ( fA, "r" ); 
    if (fin == NULL){ printf("!!! FILE NOT FOUND !!!"); exit(-1); }
    while( !feof(fin))
    {
      fscanf (fin, "%f", &f);
      elements++;
    }
    rewind(fin);
    f = 0;

    while( !feof(fin))
    {
      if(fgetc(fin) == '\n')
      {
    counter++;
      }
    }
    rewind(fin);

    n = counter;
    m = (elements-1) / counter;

   total = n*m;   

   MPI_Bcast ( &total, 1, MPI_INT, rank, MPI_COMM_WORLD );
   MPI_Bcast ( &n, 1, MPI_INT, rank, MPI_COMM_WORLD );

  }

  // Alocação de variaveis
  A = (float *)calloc(total,sizeof(float));
  if(A==NULL){printf("!!! Could not allocate memory !!!\n"); exit(-1);}
  loc = (int *)calloc(n,sizeof(int*));
  if(loc==NULL){printf("!!! Could not allocate memory !!!\n"); exit(-1);}

// AND IT GOES ON AND ON
4

1 に答える 1

4

ブロック内のすべてがrank == 0プロセス 0 でのみ実行されます。プロセスはrank == 1 ... nそのブロックをスキップするだけです。したがって、ここMPI_Bcastですべてのプロセスが表示される環境に呼び出しを配置する必要があります。プロセス 1...n がすべての初期化をスキップし、プロセス 0 が到達する前にブロードキャストにジャンプすると、bcast が発生するまで待機します。MPI_Comm commMPI_COMM_WORLD

于 2013-01-22T13:46:23.047 に答える