gpt4 book ai didi

c - 如何正确使用MPI_Gather?

转载 作者:行者123 更新时间:2023-11-30 15:00:15 24 4
gpt4 key购买 nike

我读过有关 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();

}

它不打印“aaaaabbbbbccccc”,而是仅打印“aaaaa”。

我做错了什么?

最佳答案

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”的不同(不可写)部分。

关于c - 如何正确使用MPI_Gather?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42237853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com