【问题标题】:MPI in C and pointer transmissionsC 语言中的 MPI 和指针传输
【发布时间】:2012-03-26 17:47:41
【问题描述】:

我遇到了一个新的小问题;

我有一个小指针叫做:

int *a;

现在..在我的主要方法中的某个地方,我使用以下几行为其分配了一些空间并分配了一个值:

a = (int *) malloc(sizeof(int));
*a=5;

..然后我尝试传输它(比如流程 1):

MPI_Bsend(a, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);

另一方面,如果我尝试接收该指针

int *b;
MPI_Recv(b, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);

printf("This is what I received: %d \n", *b);

我收到关于缓冲区的错误!

但是,如果我不声明“b”指针,而是执行以下操作:

int b;
MPI_Recv(&b, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);

printf("This is what I received: %d \n", b);

...一切似乎都很好!有人可以帮我弄清楚发生了什么以及如何只使用指针吗?

提前致谢!

【问题讨论】:

    标签: mpi


    【解决方案1】:

    线的含义

    MPI_Bsend(a, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
    

    如下:“a 是内存中的一个点,我有 1 个整数。发送它。`

    在您上面发布的代码中,这是绝对正确的:a 确实指向一个整数,因此它被发送。这就是为什么您可以使用第二种方法接收它的原因,因为该行的含义

    MPI_Recv(&b, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
    

    是“接收1个整数,并将其存储在&bb是一个常规int,所以一切都很好。在第一次接收中,你试图将一个整数接收到一个int* 变量 没有分配内存b 指向,所以Recv 无处可写。但是,我应该指出:

    切勿将指针的内容传递给 MPI 中的另一个进程

    MPI 进程无法读取彼此的内存,而虚拟寻址使一个进程的指针对另一个进程完全没有意义。

    【讨论】:

    • 我认为这里真正的问题是没有为 int *b 分配内存!此外,如果需要,MPI 会负责将数据从一个进程传输到另一个进程,这样一个进程就不必能够读取另一个进程的内存!
    • 没错,真正的问题是b 未被分配。尽管如此,这仍然是一个相当有争议的问题,因为在任何情况下都不应该传递指针本身。
    【解决方案2】:

    这个问题与处理指针和分配内存有关;这不是 MPI 特定的问题。

    在您的第二个变体中,int a 自动为一个整数分配内存。通过传递&a,您正在传递一个指向已分配内存段的指针。在您的第一个变体中,指针的内存是自动分配的,但不是指针指向的内存。因此,当您传入指针时,MPI 会尝试写入未分配的内存,从而导致错误。

    但它会这样工作:

    int *b = (int *) malloc(sizeof(int));
    MPI_Recv(b, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
    

    【讨论】:

      【解决方案3】:

      您遇到的错误是您正在将 MPI_Recv 的结果复制到某些内存 *b 中,而您不拥有且未初始化。

      不是 MPI 专家,但您肯定无法将指针(即内存地址)传输到可能在另一台机器上运行的进程!

      【讨论】:

      • +1 表示第一句,-1 表示第二句:用于 MPI_Send 和 MPI_Recv 函数的指针被 MPI 用作读/写缓冲区。 MPI 将负责将一个进程的写缓冲区中的数据传输到另一个进程的读缓冲区。
      • @mort:正如您所说,传输的是缓冲区内容。将指针(即地址)转移到另一台机器当然可以,但没有意义。所以马丁的回答是正确的。
      猜你喜欢
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多