gpt4 book ai didi

c - MPI 收集和排序

转载 作者:太空宇宙 更新时间:2023-11-04 03:04:06 25 4
gpt4 key购买 nike

我正在尝试做一个简单的排序,其中每个非零过程将一个文件(文件名 = proc#)读入缓冲区。零过程收集所有这些缓冲区,对其进行排序,然后将其打印出来。然而,在下面的代码中,proc 0 收集 proc1 的缓冲区,而不是 proc 2 的。有什么建议吗?

我用 mpirun -np 3 a.out 执行它

我的输入文件是文件名:“1”4010100

文件名:“2”90后2025

代码是:

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

#define DEBUG 1

//#undef DEBUG


int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}

int main (int argc, char *argv[])
{
int values[3];
int recv[3];
int n, i=0, temp;
FILE *in1, *in2;
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
char filename[20];
if(rank!=0){
// read files with filename"<proc#>" into the buffer
sprintf(filename, "%d", rank);
in1=fopen(filename,"r");
while(fscanf(in1,"%d",&values[i]) != EOF){
printf("rank %d Read data %d\n", rank,values[i]);
i++;
}
}
// gather values from all procs.

MPI_Gather(values,i,MPI_INT,recv,i,MPI_INT,0,MPI_COMM_WORLD);
printf("Gather done!");
if(rank==0){


// sort
qsort (recv, 6, sizeof(int), compare);
// print results
for (n=0; n<6; n++)
printf ("%d ",recv[n]);
printf("\n");
}

if(rank!=0)
fclose(in1);
MPI_Finalize();
return 0;
}

最佳答案

int recv[3];

接收缓冲区的大小应该是收集节点上要收集的所有处理器的元素总数。所以 recv[9] 应该在这里工作。

检查这个例子以收集 example

关于c - MPI 收集和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7857574/

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