0

こんにちは、MPI を使用して C 言語で単純な並列プログラムを作成しようとしています。プログラムは配列の最大値を見つける必要があります。ルート プロセスは、MPI_Scatter を使用して配列のチャンクをすべてのプロセスに送信し、MPI_Gather によって結果を収集する必要があります。プログラムを実行すると、次のような一般的なエラーが発生します。

おそらく、この Unix エラー メッセージが役に立ちます: Unix errno: 14 Bad address

MPI_Scatter と MPI_Gather、またはこの関数に送信する値に問題があることはわかっています。

解決策を見つけようとしていましたが、役立つものは何も見つかりませんでした。

これが私のコードです:

  #include <mpi.h>
  #include <stdio.h>
  #include <stdlib.h> 
  #define BUFSIZE 9

  int max(int *buf, int N){
      int i;
      int value = 0;
      for(i=0; i<N; i++){
         if (buf[i]>value){
             value = buf[i];
         }
      }
 return value;
 }
 int main(int argc, char** argv)
 { int size, rank;
   int slave;
   int *buf;
   int *buf1; 
   int *buf2;       
   int i, n, value;
   MPI_Status status;
   /* Initialize MPI  */
   MPI_Init(NULL, NULL);
   /* 
    * Determine size in the world group.
    */
   MPI_Comm_size(MPI_COMM_WORLD, &size);

   if ((BUFSIZE % size) != 0) {
     printf("Wrong Bufsize ");
     return(0);
   }


  MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

  if (rank==0) { 
     buf = (int *)malloc(BUFSIZE*sizeof(int));
     buf2 = (int *)malloc(size*sizeof(int));

     printf("\n Generated array: \n");
     for(i=0; i<BUFSIZE; i++){
       buf[i] = rand() % 20;
       printf("%d, ", buf[i]);
     }
     printf("\n");
     printf("\n Sending values to processes:"); 
     printf("\n -----------------------------"); 
  }

  buf1 = (int *)malloc((BUFSIZE/size)*sizeof(int));

  MPI_Scatter(buf, BUFSIZE/size, MPI_INT, buf1, BUFSIZE/size, MPI_INT, 0, MPI_COMM_WORLD);

  value = max(&buf1[0], BUFSIZE/size);

  printf("\n Max from rocess %d : %d \n", rank, max(&buf1[0], BUFSIZE/size));

  MPI_Gather(&value, 1, MPI_INT, buf2, 1, MPI_INT, 0, MPI_COMM_WORLD);

  if (rank == 0){
     printf("\n Max value: %d", max(&buf2[0], size));
  }

  MPI_Finalize();
  return(0);
  }
4

1 に答える 1

1

ポインターを NULL に初期化し、追跡します。&buf1[0] の代わりに buf1 を使用すると、より明確になります。MPI_Finalize() の前に次のようにバッファーを解放します。

if(bufferPionter != NULL) free(bufferPionter);

ポインターに何か問題があると、無料呼び出しでクラッシュします。max 関数では、すべての数値が 0 未満の場合、最大値は 0 です。私はそれを修正します。

 int max(int *buf, int N){
      int i;
      int value = N? buf[0] : 0;
      for(i=0; i<N; i++){
         if (buf[i]>value){
             value = buf[i];
         }
      }
 return value;
 }

よろしくお願いします!

于 2013-10-20T04:34:05.010 に答える