【问题标题】:Segmentation fault after using MPI_Finalize()使用 MPI_Finalize() 后出现分段错误
【发布时间】:2013-03-21 08:53:12
【问题描述】:

我正在使用 openMPI 在 c 中编程。我的代码发布在下面。发生的情况是,每当我运行此程序时,我都会收到分段错误错误。我相信我已经通过使用这些 printf 语句隔离了问题。分割似乎发生在 MPI_Finalize() 之后。非常感谢任何帮助。

我收到的错误是:

[linuxscc003:10019] *** Process received signal ***
[linuxscc003:10019] Signal: Segmentation fault (11)
[linuxscc003:10019] Signal code: Address not mapped (1)

和我的代码:

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

int main(int argc, char** argv) 
{
    int i = 0; //index
    int comm_sz, my_rank;
    int part_sum = 0;
    //size of the array is hard-coded in, 

    MPI_Init(NULL,NULL);
    MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

    if(my_rank == 0)
    {
        int* array;
        //generate the array of n elements
        printf("There are %d array elements\n", comm_sz);
        array = (int*)malloc(sizeof(int*)*comm_sz);
        for(i = 0; i < comm_sz; i++)
        {
            //we don't want to count zero in here
            //nobody likes zero
            array[i] = (i+1); 
        }
        for(i = 1; i < comm_sz; i++)
        {
            MPI_Send(&array[i], sizeof(int*), MPI_INT, i, 0, MPI_COMM_WORLD);
        }   
        //part_sum = 1;
        free(array);
        printf("freed array!\n");
    }

    if(my_rank != 0)
    {
        MPI_Recv(&part_sum, sizeof(int*), MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        printf("proc %d out of %d, I have received %d!\n", my_rank, comm_sz, part_sum);

    }



    printf("proc %d signing off!\n",my_rank);
    MPI_Finalize();
    printf("proc %d signed off!\n",my_rank);
    return 0;
} 

【问题讨论】:

    标签: c mpi


    【解决方案1】:

    在这一行:

    array = (int*)malloc(sizeof(int*)*comm_sz);
    

    sizeof(int*) 应该是sizeof(int)

    在这一行:

    MPI_Send(&array[i], sizeof(int*), MPI_INT, i, 0, MPI_COMM_WORLD);
    

    sizeof(int*) 应该是 1。您指定要发送多少个 MPI_INTs(而不是多少字节)。 sizeof(int) 可能是 4 或 8,因此您正在过度读取缓冲区。

    在这一行:

    MPI_Recv(&part_sum, sizeof(int*), MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    

    sizeof(int*) 应该是 1,同样的。

    段错误可能发生在某个进程上的MPI_Finalize() 之前,您认为它发生在之后是因为其他进程已完成其MPI_Finalize()。或者,由于您在堆栈上覆盖了part_sum,因此损坏的堆栈在调用MPI_Finalize() 之前不会导致问题。

    【讨论】:

      猜你喜欢
      • 2015-12-28
      • 2019-06-13
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多