首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mpi_gather结构

mpi_gather结构
EN

Stack Overflow用户
提问于 2011-10-27 01:17:33
回答 1查看 824关注 0票数 1

我正在尝试使用qsort对键值对进行排序。每个进程都会读入文件名作为进程ids的文件。MPI_Gather将所有读取的值发送到Proc0,后者对密钥进行排序并将密钥-val对存储在一个名为"Output“的文件中。然而,聚集似乎并不起作用。任何帮助都是非常感谢的。谢谢!

我以如下方式运行代码

代码语言:javascript
复制
  mpirun -np 3 ./a.out

我的输入文件是: File "0":

代码语言:javascript
复制
21 bbbb  
2119 iiii
120 hhhh

文件"1":

代码语言:javascript
复制
40 dddd 
10 aaaa
100 gggg

文件"2":

代码语言:javascript
复制
32 cccc
44 eeee
99 ffff

代码是:

代码语言:javascript
复制
#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;   
}
EN

回答 1

Stack Overflow用户

发布于 2011-12-19 18:59:57

MPI_Gather中的数据大小不正确。它应该是

代码语言:javascript
复制
MPI_Gather(kv, 
           sizeof(keyval_s)*BUFSIZE, 
           MPI_BYTE,
           recv, 
           sizeof(keyval_s)*BUFSIZE, 
           MPI_BYTE, 
           0, 
           MPI_COMM_WORLD);

请注意,MPI_Gather中的recvcount参数是针对来自单个等级的消息,而不是收集的数据的总大小。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7906360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档