【问题标题】:Receiving an array allocated with malloc in MPI在 MPI 中接收分配有 malloc 的数组
【发布时间】:2014-08-11 12:47:04
【问题描述】:

编辑:这段代码特别没有问题。我创建了我的代码的简化版本,这部分工作完美。我仍然不明白为什么它不能在我的整个代码中工作,因为我已经评论了所有内容,但这个,但这可能太特别了。抱歉,问错了。

(我在底部编辑并添加了我得到的错误)。

我正在尝试并行化 C 程序。

当我尝试将分配有 malloc 的数组从主进程传递到其余进程时遇到错误。或者更好,当我尝试接收它时。

这是我遇到问题的一段代码:

if (rank == 0)
{
    int *data=(int *) malloc(size*sizeof(int));
    int error_code = MPI_Send(data, size, MPI_INT, 1, 1, MPI_COMM_WORLD);
    if (error_code != MPI_SUCCESS) {
        char error_string[BUFSIZ];
        int length_of_error_string;

        MPI_Error_string(error_code, error_string, &length_of_error_string);
        printf("%3d: %s\n", rank, error_string);
    }

    printf("Data sent.");
}
else if (rank == 1)
{
    int *data=(int *) malloc(size*sizeof(int));
    int error_code = MPI_Recv(data, size, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
    if (error_code != MPI_SUCCESS) {
        char error_string[BUFSIZ];
        int length_of_error_string;

        MPI_Error_string(error_code, error_string, &length_of_error_string);
        printf("%3d: %s\n", rank, error_string);
    }
    printf("Received.");
}

“已发送数据。”被打印,然后是由第二个进程引起的分段错误(带有内存转储),并且永远不会打印“已接收”。

我认为我没有很好地接收数据。但是我尝试了几种可能性,我认为我必须传递变量的地址而不仅仅是指向第一个位置的指针,所以我认为这是正确的方法,但它不起作用。

从错误代码中没有打印任何内容。

有谁知道导致错误的原因以及我的错误是什么?

谢谢!

编辑:

这是确切的错误:

*** Process received signal ***
*** End of error message ***
Signal: Segmentation fault (11)
Signal code: Address not mapped (1)

编辑 2:

此代码有效:

int main(int argc, char* argv[])
{
    int size_x = 12;
    int size_y = 12;

    int rank, size, length;
    char nodename[BUFSIZ];
    MPI_Status status;

    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Get_processor_name(nodename, &length);

    MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN);

    if (rank == 0)
    {
        int *data=malloc(size*sizeof(int));
        int error_code = MPI_Send(data, size, MPI_INT, 1, 1, MPI_COMM_WORLD);
        if (error_code != MPI_SUCCESS)
        {
            char error_string[BUFSIZ];
            int length_of_error_string;

            MPI_Error_string(error_code, error_string, &length_of_error_string);
            printf("%3d: %s\n", rank, error_string);
        }
        printf("Data sent.");
    }
    else if (rank > 0)
    {
        int *data=malloc(size*sizeof(int));
        int error_code = MPI_Recv(data, size, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
        if (error_code != MPI_SUCCESS)
        {
            char error_string[BUFSIZ];
            int length_of_error_string;

            MPI_Error_string(error_code, error_string, &length_of_error_string);
            printf("%3d: %s\n", rank, error_string);
        }
        printf("Received.");
    }

    MPI_Finalize();

    return 0;
}

【问题讨论】:

  • 这里没有问题;您可以发布一段完整的可运行代码来重现该问题吗?大小如何设置,状态在哪里声明?作为另一个更挑剔的点 - 通常认为最好的做法是不要从 malloc 中转换返回指针。参见,例如,stackoverflow.com/questions/605845/…
  • 你是对的,我创建了一个独立版本的代码,它可以工作。所以问题一定出在其他地方。我会更新我的问题。

标签: c arrays malloc mpi


【解决方案1】:

我发现了问题,不是 MPI 调用,而是之前的函数(忘记了“printf”中的变量)有问题,我没有注意到。这使得整个代码中断。棘手的 MPI...

【讨论】:

    猜你喜欢
    • 2015-03-08
    • 2018-11-11
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2012-11-04
    • 2015-03-09
    • 2014-09-17
    • 2016-03-19
    相关资源
    最近更新 更多