2011-10-26 2 views
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; 
} 

답변

1

MPI_Gather에있는 데이터의 크기가 올바르지 않습니다. MPI_Gather recvcount에서 파라미터는 하나의 랭크, 수집 된 데이터가 아니라 전체 크기로부터 메시지임을

MPI_Gather(kv, 
      sizeof(keyval_s)*BUFSIZE, 
      MPI_BYTE, 
      recv, 
      sizeof(keyval_s)*BUFSIZE, 
      MPI_BYTE, 
      0, 
      MPI_COMM_WORLD); 

주의해야한다.