2016-10-28 6 views
0

こちらは新しいものです。OpenMPIおよびCを使用しています。私のコードがSegmentatioin faultにつながる理由を調べようとしています。私はすでにMPIについて多くの赤いが、私は助けを見つけることはできませんでした。それは私に既に数時間かかりました。そこで私はここで助けを求めることにしました。MPIセグメンテーションエラーMPI_Scatter using C

私のコードの期待した結果が得られます。しかし、私も毎回エラーメッセージを受け取ります。

私の場合、MPI_Scatterを使用するのは正しいですか?

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

const int MASTER_RANK = 0; 
#define DIM 3 

int main(int argc, char* argv[]) 
{ 
    int numProc, rank; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &numProc); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    int n = 9; 
    double *m; 
    double *m_client; 
    m_client = (double *)malloc(3); 

    if(rank == MASTER_RANK) 
    { 
     m = (double*)malloc(n); 
     for(int i=0; i<n; i++) 
     { 
      m[i] = (double)i+1.0; 
     } 
    } 

    MPI_Scatter(m, 3, MPI_DOUBLE, m_client, 3, MPI_DOUBLE, MASTER_RANK, MPI_COMM_WORLD); 

    printf("Process %d:\n", rank); 
    for(int i=0; i < 3; i++) 
    { 
     printf(" (%lf", m_client[i]); 
     m_client[i] += 1000*rank; 
     printf(" -> %lf)", m_client[i]); 
     printf("\n"); 
    } 
    printf("\n"); 

    MPI_Gather(m_client, 3, MPI_DOUBLE, m, 3, MPI_DOUBLE, MASTER_RANK, MPI_COMM_WORLD); 

    if(rank == MASTER_RANK) 
    { 
     printf("Master: Received= \n"); 
     for(int i=0; i<numProc; i++) 
     { 
      for(int j=0; j < 3; j++) 
      { 
       int idx = i*3 + j; 
       printf("%lf ", m[idx]); 
      } 
      printf("from Process %d\n", i); 
     } 
    } 
    free(m); 
    free(m_client); 
    MPI_Finalize(); 
    exit(0); 
} 

私はmpicc mpifile.c -o mpifileを使用して、私のMPIファイルを構築し、mpirun -np 3 ./mpifileでそれを実行します。

は、ここに私の簡単なコードです。私は3つのプロセスを使用します。

私が手にエラーがある:

[Samuel-Z97-HD3:14361] *** Process received signal *** 
[Samuel-Z97-HD3:14361] Signal: Segmentation fault (11) 
[Samuel-Z97-HD3:14361] Signal code: (128) 
[Samuel-Z97-HD3:14361] Failing at address: (nil) 

私はUbuntuとvimの/ Geanyを使用しています。

答えて

1

コードには2つの問題があります。

  • 両方のmalloc()コールのサイズが間違っています。倍精度数の代わりにバイト数を割り当てる必要があります。例えば。 malloc(3)を呼び出す代わりに、malloc(3 * sizeof(double))を呼び出します。
  • もう1つの問題は、変数mをNULLに初期化する必要があることです。あるいは、free(m)をif(rank == MASTER_RANK)で囲むこともできます。つまり、非マスタプロセスはfree(m)を呼び出します。ここで、mは初期化されておらず、任意の値を含むことができます。
+0

ありがとうございました!今私はエラーを参照してくださいとうまく動作します。 – Samuel

関連する問題