如何正确使用MPI_Gather?

时间:2017-02-14 23:04:16

标签: c mpi openmpi

我读过关于mpi的文章,我对使用MPI_Gather函数感兴趣。

现在我正在做这件事,但它不起作用:

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

char *funcion (char *a) {
    sprintf(a, "asdfa%u", 2);
}

int main (int argc, char *argv[]) {

    MPI_Init(&argc, &argv);
    int rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    char *parcial = malloc(5*sizeof(char));
    char *total;

    if (rank == 0) {
        total = malloc(15*sizeof(char));
        parcial = "aaaaa";
    }
    else if (rank == 1) {
        parcial = "bbbbb";
    }
    else if (rank == 2) {
        parcial = "ccccc";
    }

    MPI_Gather(parcial,5,MPI_CHAR,total,15,MPI_CHAR,0,MPI_COMM_WORLD);

    if (rank == 0) {
        printf("%s",total);
    }

    MPI_Finalize();

}

而不是印刷&#34; aaaaabbbbbccccc&#34;它只打印&#34; aaaaa&#34;。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

recvcount参数指定任何单个接收的元素数,而不是总数。因此你应该使用:

MPI_Gather(parcial,5,MPI_CHAR,total,5,MPI_CHAR,0,MPI_COMM_WORLD);

请注意,您对C中字符串的理解基本上是错误的。

首先,每个C字符串都需要一个额外的字节用于终止空字符。因此,您必须分配6/16字节。但是,您无法发送这些空终止符,否则主服务器上的字符串将仅在第一个终结符处结束。但是您必须明确设置total[15] = 0才能正确终止字符串。

其次,parcial = "aaaaa"不会将字符串复制到malloc'内存中(由strncpy完成),而是将指针简单地分配给不同的(不可写) )在内存中存储"aaaaa\0"的部分。

答案 1 :(得分:0)

这很好用:

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

char *funcion (char *a) {
    sprintf(a, "asdfa%u", 2);
}

int main (int argc, char *argv[]) {

    MPI_Init(&argc, &argv);
    int rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    void *total;
    void *parcial;

    if (rank == 0) {
        parcial = "aaaaa";
    }
    else if (rank == 1) {
        parcial = "bbbbb";
    }
    else if (rank == 2) {
        parcial = "ccccc";
    }

    MPI_Gather(parcial,5,MPI_CHAR,total,5,MPI_CHAR,0,MPI_COMM_WORLD);

    if (rank == 0) {
        printf("%s",(char*)total);
    }

    MPI_Finalize();

}