我想发送一个从第0位到最后一位的字符串.我已经安装了所有的MPI依赖项,我猜内存分配有一些问题:

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

int main(int argc, char **argv)
{
    int rank, size;
    char *hello_world = NULL;
    int hello_world_size = (strlen("Hello world :)") + 1) * sizeof(char);
    hello_world = malloc(hello_world_size);
    if (hello_world == NULL) exit(EXIT_FAILURE);

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

    if(rank == 0)
    {
        strcpy(hello_world, "Hello world :)");

        MPI_Send(
            &hello_world,
            hello_world_size,
            MPI_CHAR,
            size - 1,
            0,
            MPI_COMM_WORLD
        );
    }

    if(rank == size - 1)
    {
        MPI_Recv(
            &hello_world,
            hello_world_size,
            MPI_CHAR,
            0,
            0,
            MPI_COMM_WORLD,
            MPI_STATUS_IGNORE
        );

        printf("%s from rank %i", hello_world, rank);
    }

    free(hello_world);
    hello_world = NULL;

    MPI_Finalize();
    exit(EXIT_SUCCESS);
}

汇编:mpicc -std=c11 -o hello_world -g -Wall -Wpedantic hello_world.c 执行:mpirun --use-hwthread-cpus -np 4 ./hello_worldmpirun -np 2 ./hello_world

但我一直收到分段错误.我认为字符指针分配有一些问题.

输出:

Authorization required, but no authorization protocol specified

Authorization required, but no authorization protocol specified

[debian:55189] *** Process received signal ***
[debian:55189] Signal: Segmentation fault (11)
[debian:55189] Signal code: Address not mapped (1)
[debian:55189] Failing at address: 0x562a3c5652a0
[debian:55189] [ 0] /lib/x86_64-linux-gnu/libc.so.6(+0x3bfd0)[0x7fe32c154fd0]
[debian:55189] [ 1] /lib/x86_64-linux-gnu/libc.so.6(+0x155d59)[0x7fe32c26ed59]
[debian:55189] [ 2] /lib/x86_64-linux-gnu/libc.so.6(+0x5e168)[0x7fe32c177168]
[debian:55189] [ 3] /lib/x86_64-linux-gnu/libc.so.6(_IO_printf+0xab)[0x7fe32c16b56b]
[debian:55189] [ 4] ./hello_world(+0x12f8)[0x55d9fb4882f8]
[debian:55189] [ 5] /lib/x86_64-linux-gnu/libc.so.6(+0x271ca)[0x7fe32c1401ca]
[debian:55189] [ 6] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x85)[0x7fe32c140285]
[debian:55189] [ 7] ./hello_world(+0x1101)[0x55d9fb488101]
[debian:55189] *** End of error message ***
--------------------------------------------------------------------------
Primary job  terminated normally, but 1 process returned
a non-zero exit code. Per user-direction, the job has been aborted.
--------------------------------------------------------------------------
--------------------------------------------------------------------------
mpirun noticed that process rank 1 with PID 0 on node debian exited on signal 11 (Segmentation fault).

推荐答案

您不应该发送指向字符串的指针,而不是该指针的地址(它可能在堆栈上的某个位置)

因为char *hello_world是自动变量,所以它将被放入堆栈,并且您传递的不是分配在堆上的字符串的地址,而是堆栈上创建的hello_world指针的地址.

正如我在MPI API中看到的,第一个参数是void*,而不是void**

#include <mpi.h>

int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest,
     int tag, MPI_Comm comm)


int MPI_Recv(void *buf, int count, MPI_Datatype datatype,
     int source, int tag, MPI_Comm comm, MPI_Status *status)

C++相关问答推荐

无效指针值在函数调用之间莫名其妙地改变

C中的指针增量和减量(*--*++p)

Char变量如何在不使用方括号或花括号的情况下存储字符串,以及它如何迭代到下一个字符?

使用错误的命令执行程序

在WSL关闭/重新启动后,是什么原因导致共享对象依赖关系发生更改?

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

CS50判断灯泡运动的问题,判断时多出一个灯泡,但不在终端上

为什么编译器不能简单地将数据从EDI转移到EAX?

存储和访问指向 struct 的指针数组

将size_t分配给off_t会产生符号转换错误

未为同一文件中的函数执行DirectFunctionCall

共享内存未授予父进程权限

C 错误:对 int 数组使用 typedef 时出现不兼容的指针类型问题

'printf("%s", user_input)' 危险吗?

当 n 是我们从用户那里获得的整数时,创建 n 个 struct 参数

GDB 跳过动态加载器代码

如何用用户输入的多个字符串填充数组?

Zig 中 C 的system函数的惯用替代方案

C语言:断言表达式为字符串字面值

eBPF: 在将栈变量存储到映射中时超出BPF堆栈限制