1
qsort로 키 - 값 쌍을 정렬하려고합니다. 모든 proc은 파일 이름을 파일로 읽는다. MPI_Gather는 모든 읽기 값을 proc 0으로 보냅니다.이 값은 키를 정렬하고 "출력"이라는 파일에 키 - 값 쌍을 저장합니다. 그러나 모이기는 효과가없는 것 같습니다. 어떤 도움을 주셔서 감사합니다. 감사!mpi_gather 구조체
나는
mpirun -np 3 ./a.out
으로 코드를 실행하고 내 입력 파일은 다음과 같습니다 파일 "0"
21 bbbb
2119 iiii
120 hhhh
파일 "1":
40 dddd
10 aaaa
100 gggg
파일 "2 ":
32 cccc
44 eeee
99 ffff
그리고 코드는이 :
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define BUFSIZE 3
#define BUFLEN 255
struct keyval{
int key;
char val[BUFLEN];
};
typedef struct keyval keyval_s;
typedef int (*compareptr)(const void*, const void*);
int compare (keyval_s * a, keyval_s * b)
{
return (a->key - b->key);
}
int main (int argc, char *argv[])
{
int values[BUFSIZE];
keyval_s kv[BUFSIZE], *recv;
int n, i=0, temp;
FILE *in, *out;
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
char filename[20];
char data[20];
if(rank ==0){
recv = (keyval_s *) malloc (size*BUFSIZE*sizeof(keyval_s));
}
sprintf(filename, "%d", rank);
in=fopen(filename,"r");
while(fscanf(in,"%d %s",&kv[i].key, kv[i].val) != EOF){
printf("Read key %d, data %s from file\n", kv[i].key, kv[i].val);
i++;
}
MPI_Gather(kv,BUFSIZE,MPI_BYTE,recv,BUFSIZE,MPI_BYTE,0,MPI_COMM_WORLD);
if(rank==0){
qsort ((void*)&kv, BUFSIZE, sizeof(keyval_s),(compareptr) compare);
out=fopen("Output","w");
for (n=0; n<BUFSIZE*size; n++)
fprintf (out,"%d %s\n",recv[n].key, recv[n].val);
free(recv);
fclose(out);
}
fclose(in);
return 0;
}