MPI后垃圾收集输出使用派生类型 [英] Garbage output after MPI gather using derived type

查看:146
本文介绍了MPI后垃圾收集输出使用派生类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

鉴于这种结构:

 结构mpi_energy_data {
    INT排名;
    从time_t的;
    time_t的到;
    焦炭主机[HOST_NAME_MAX]
};

我试图建立一个派生MPI类型。我后来在收集操作使用,但是接收阵列中的所有输出,除了垃圾是从0级发送。

  MPI_Datatype time_interval_mpi;
MPI_Datatype类型[4] = {MPI_INT,MPI_CHAR,MPI_INT,MPI_INT};
INT blocklen [4] = {1,HOST_NAME_MAX,1,1};MPI_Aint偏移[4];
偏移[0] = offsetof(结构mpi_energy_data,等级);
偏移[1] = offsetof(结构mpi_energy_data,主机名);
偏移[2] = offsetof(结构mpi_energy_data,从);
偏移[3] = offsetof(结构mpi_energy_data,到);
MPI_Type_create_struct(4 blocklen,偏移,类型,&安培; time_interval_mpi);
MPI_Type_commit(安培; time_interval_mpi);

这里的聚集地。我的目标是收集结构的1从每道工序到根进程。任何人都看到什么了?

 结构mpi_energy_data *数据= NULL;
   如果(排名== 0){
        数据=的malloc(sizeof的(*数据)*大小);
   }
   结构mpi_energy_data LDATA;
   ldata.rank =排名;
   sprintf的(ldata.hostname,example.com);
   的gethostname(ldata.hostname,HOST_NAME_MAX);
   ldata.from =(INT)ti.from;
   ldata.to =(INT)ti.to;
   的printf(%d个发送%s的%D \\ n,l​​data.rank,ldata.hostname,(INT)ldata.to,(INT)ldata.from);
   MPI_Gather(安培; LDATA,1,time_interval_mpi,
   数据,1,time_interval_mpi,0,MPI_COMM_WORLD);
   MPI_Type_free(安培; time_interval_mpi);


解决方案

我固定它。我的派生类型的创建是不正确的。这里是工作版本:

  MPI_Datatype time_interval_mpi;
MPI_Datatype类型[3] = {MPI_INT,MPI_LONG,MPI_CHAR};
INT blocklen [3] = {1,2,HOST_NAME_MAX};MPI_Aint偏移[3];
偏移[0] = offsetof(结构mpi_energy_data,等级);
偏移[1] = offsetof(结构mpi_energy_data,从);
偏移[2] = offsetof(结构mpi_energy_data,主机名);
MPI_Type_create_struct(3 blocklen,偏移,类型,&安培; time_interval_mpi);
MPI_Type_commit(安培; time_interval_mpi);

Given this struct:

struct mpi_energy_data { 
    int rank;  
    time_t from;
    time_t to; 
    char hostname[HOST_NAME_MAX]; 
};

I'm attempting to build a derived MPI type. I later use this in a gather operation, but all output in the receiving array is garbage except that which is sent from rank 0.

MPI_Datatype time_interval_mpi;
MPI_Datatype type[4] = { MPI_INT, MPI_CHAR, MPI_INT, MPI_INT };
int blocklen[4] = { 1,HOST_NAME_MAX, 1, 1 };

MPI_Aint offsets[4];
offsets[0] = offsetof(struct mpi_energy_data, rank);
offsets[1] = offsetof(struct mpi_energy_data, hostname);
offsets[2] = offsetof(struct mpi_energy_data, from);
offsets[3] = offsetof(struct mpi_energy_data, to);
MPI_Type_create_struct(4, blocklen, offsets, type, &time_interval_mpi);
MPI_Type_commit(&time_interval_mpi);

Here's the gather. I aim to gather 1 of the structs from each process to the root process. Anyone see anything wrong?

   struct mpi_energy_data *data = NULL;
   if (rank == 0) {
        data = malloc(sizeof(*data) * size);
   }
   struct mpi_energy_data ldata;
   ldata.rank = rank;
   sprintf(ldata.hostname, "example.com");
   gethostname(ldata.hostname, HOST_NAME_MAX);
   ldata.from = (int) ti.from;
   ldata.to = (int) ti.to;
   printf("%d sending %s %d %d\n", ldata.rank, ldata.hostname, (int)ldata.to, (int)ldata.from);
   MPI_Gather(&ldata, 1, time_interval_mpi,
   data, 1, time_interval_mpi, 0, MPI_COMM_WORLD);
   MPI_Type_free(&time_interval_mpi);

解决方案

I fixed it. My creation of the derived type was incorrect. Here is the working version:

MPI_Datatype time_interval_mpi;
MPI_Datatype type[3] = { MPI_INT, MPI_LONG, MPI_CHAR };
int blocklen[3] = { 1, 2, HOST_NAME_MAX };

MPI_Aint offsets[3];
offsets[0] = offsetof(struct mpi_energy_data, rank);
offsets[1] = offsetof(struct mpi_energy_data, from);
offsets[2] = offsetof(struct mpi_energy_data, hostname);
MPI_Type_create_struct(3, blocklen, offsets, type, &time_interval_mpi);
MPI_Type_commit(&time_interval_mpi);

这篇关于MPI后垃圾收集输出使用派生类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆