2017-09-23 23 views
0

私はMPIを初めて使用しています。私は現在、ローカルのベオウルフクラスターでアレイ解析を行う必要があるプロジェクトに取り組んでいます。私のコードはCで書かれ、正しくコンパイルされます。 1つのプロセスだけを使用しているときは正しく動作しますが、複数のプロセスで実行しようとすると、ルート(ランク0)以外のすべてのプロセスがデータをブロードキャストしようとするときに消滅する傾向があります。私のコードは、この複数のプロセスを使用している場合、MPI Bcast付近のSegフォールト

//1. Initialize global variables 
//2. Initialize MPI, get number of processes, get rank 
//3. All processes create two dimensional arrays 
    array1 = (char **) malloc(sizeArray1 * sizeof(char *)); 
    array1[0] = (char *) malloc(sizeArray1 * lineLength * sizeof(char)); 
    for(i = 1; i < sizeArray1; i++) 
    { 
      array1[i] = array1[i - 1] + lineLength; 
    } 
    //4. Only server will populate it's arrays, then broadcast to all processes 
    if(rank == 0) 
    { 
      f = fopen("path..../testFile1.txt", "r"); 
      if(NULL == f) { 
        perror("FAILED: "); 
        return -1; 
      } 
      numWords = 0; 
      while(err != EOF && numWords < sizeArray2) 
      { 
        err = fscanf(f, "%[^\n]\n", array2[numWords]); 
        numWords ++; 
      } 
      fclose(f); 

    } 

//5. Broadcast each line from both arrays to all processes 
MPI_Bcast(array1, sizeArrray1 * lineLength, MPI_CHAR, 0, MPI_COMM_WORLD); 
//6. do further work on arrays 

ようになり、他のノードは通常、一回放送のラインを印刷し、次に死ぬしようとしながら、ルートノードは、この完全に罰金のすべてを実現します。あなたは私のコードのいずれかの他の部分を見てする必要がある場合は、私が取得しています正確なエラーは

Signal: Segmentation fault (11) 
Signal code: Address not mapped (1) 
Failing at address: 0x37 
malloc.c:2392: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. 

である私は

注知ってみましょう:私は他のユーザーからの提案に対応するために私のコードを編集したのが、エラーは依然として続きます

+3

理想的に、あなたが建設する[、最小完全、かつ検証例](https://stackoverflow.com/help/mcve)。少なくとも、あなたが 'array1'と' array2'を割り当てるところのコードを表示してください。これらの配列は**すべての**タスクに割り当てられ、ルートタスク(ここではタスク '0')にのみ配置されます。 –

+0

コードをその部分で更新します。全体のファイルはかなり長いです。あなたが言ったように、私はすべてのタスクに配列を割り当てていますが、1つだけに配置します。 – MrRempton

+0

チャンスは(あなたが* minimal *であるが実用的な例があれば)あなた自身が答えを見つけるかもしれない。 – YePhIcK

答えて

0

あなたの配列はであり、intではありません。 だからMPI_INTの代わりにMPI_Bcast()MPI_CHARにする必要があります。スタイルの問題として、例えば

MPI_Bcast(&(array1[i][0]), lineLength, MPI_CHAR, 0, MPI_COMM_WORLD); 

、あなたもまた、あなたが1つのチャンクでarray1を割り当てることもできますので、あなたは1つのコール(とそれをMPI_Bcast()でき

MPI_Bcast(array1[i], lineLength, MPI_CHAR, 0, MPI_COMM_WORLD); 

としてこれを書くことができますこれは

割り当てが

array1 = (char **)malloc(sizeArray1 * sizeof(char *); 
array1[0] = (char *)malloc(sizeArray1 * lineLength * sizeof(char)); 
for (int i=1; i<sizeArray1; i++) array1[i] = array1[i-1] + lineLength; 
のようになります。)一般的に、より効率的です

その後、

MPI_Bcast(array1, sizeArray1 * lineLength, MPI_CHAR, 0, MPI_COMM_WORLD); 
+0

ありがとう!私はすぐにそれを見ていないと信じることができない、それは睡眠や何かが不足している必要があります。隣接配列に関するアイデアをありがとう!編集:私はタイプを変更したが、私はまだsegフォールトを持っていたが、この場合、それ以上の配列を通過することができた。それはまだ助けになり、私に何を目に見えるかのまともな考えを与えます。 – MrRempton

+0

これがあなたの質問に答えたなら、あなたはアップ投票をしたり、答えを受け入れることができますか?新しい問題に直面している場合は、新しい質問を発行してください。 –

関連する問題