C-使用派生类型收集MPI后的垃圾输出

  • 本文关键字:输出 MPI 派生 类型 c mpi hpc
  • 更新时间 :
  • 英文 :


给定此结构:

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

我正在尝试构建派生的MPI类型。我后来在收集操作中使用它,但是接收阵列中的所有输出都是垃圾,除了从等级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);

这是聚集。我的目标是从每个过程中收集1个结构。有人看到什么错了吗?

   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 %dn", 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);

我修复了它。我对派生类型的创建是不正确的。这是工作版本:

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);

最新更新