我读过关于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;。
我做错了什么?
答案 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();
}