使用C

时间:2016-10-28 19:19:45

标签: c segmentation-fault mpi

我是这方面的新手并使用OpenMPIC。我试着找出为什么我的代码会导致Segmentatioin fault。我已经很多关于MPI了,但我找不到任何帮助。我花了好几个小时。所以我决定在这里寻求帮助。

我得到了我的代码的预期结果。但我每次都会收到错误信息。

在我的案例中如何使用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 个答案:

答案 0 :(得分:1)

您的代码有两个问题。

  • 你的malloc()调用都有错误的大小。您应该分配字节数而不是双精度数。例如。而不是调用malloc(3),调用malloc(3 * sizeof(double))。
  • 另一个问题是你的变量m应该被初始化为NULL。或者,你可以用if(rank == MASTER_RANK)包围free(m)。因此,非主进程调用free(m),其中m未初始化并且可以包含任意值。