gpt4 book ai didi

debugging - 如何在创建 MPI 派生数据类型期间修复无效参数

转载 作者:行者123 更新时间:2023-12-03 09:03:28 27 4
gpt4 key购买 nike

我有一个 structure xyz如下所示 struct xyz { char a; int32_t b; char c[50]; uint32_t d; uchar e[10];}
我需要广播它,所以我使用了 MPI_Bcast(),其中我需要与 struct xyz 相对应的 MPI 数据类型,因为我使用了 MPI_Type_creat_struct()函数创建一个新的 MPI 数据类型为 MPI_Datatype MPI_my_new_datatype, oldtypes[4];其中我使用了对应于上述结构成员数据类型的 MPI 数据类型如下
oldtypes[4] = {MPI_CHAR, MPI_INT, MPI_UNSIGNED, MPI_UNSIGNED_CHAR};为了创建新的数据类型,我在函数中使用了以下参数..
MPI_Type_create_struct(4,blockcounts, offsets, oldtypes, &MPI_my_new_datatype); MPI_Type_commit(&MPI_my_new_datatype);
现在它正在编译但给出运行时错误如下:
* 在 MPI_Type_create_struct 中发生错误在通讯器上MPI_COMM_WORLD MPI_ERR_ARG : 其他类型的无效参数 MPI_ERRORS_ARE_FATAL (再见)。

任何人都可以找出问题出在哪里吗?

最佳答案

你不能像那样“捆绑”类似的类型。每个字段都需要单独处理,其中有 5 个,而不是 4 个。

另请注意,一般来说,实际“测量”偏移量而不是推断它们是一个好主意。

以下工作:

#include <stdio.h>
#include <mpi.h>
#include <stdint.h>

struct xyz_t {
char a; int32_t b; char c[50]; uint32_t d; unsigned char e[10];
};

int main(int argc, char **argv) {
int rank, size, ierr;
MPI_Datatype oldtypes[5] = {MPI_CHAR, MPI_INT, MPI_CHAR, MPI_UNSIGNED, MPI_UNSIGNED_CHAR};
int blockcounts[5] = {1, 1, 50, 1, 10};
MPI_Datatype my_mpi_struct;
MPI_Aint offsets[5];

struct xyz_t old, new;

MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

/* find offsets */

offsets[0] = (char*)&(old.a) - (char*)&old;
offsets[1] = (char*)&(old.b) - (char*)&old;
offsets[2] = (char*)&(old.c) - (char*)&old;
offsets[3] = (char*)&(old.d) - (char*)&old;
offsets[4] = (char*)&(old.e) - (char*)&old;

MPI_Type_create_struct(5, blockcounts, offsets, oldtypes, &my_mpi_struct);
MPI_Type_commit(&my_mpi_struct);
if (rank == 0) {
old.a = 'a';
old.b = (int)'b';
strcpy(old.c,"This is field c");
old.d = (unsigned int)'d';
strcpy(old.e,"Field e");

MPI_Send(&old, 1, my_mpi_struct, 1, 1, MPI_COMM_WORLD);
} else if (rank == 1) {
MPI_Status status;
MPI_Recv(&new, 1, my_mpi_struct, 0, 1, MPI_COMM_WORLD, &status);
printf("new.a = %c\n", new.a);
printf("new.b = %d\n", new.b);
printf("new.e = %s\n", new.e);
}

MPI_Type_free(&my_mpi_struct);
MPI_Finalize();

return 0;
}

运行:
$ mpirun -np 2 ./struct
new.a = a
new.b = 98
new.e = Field e

更新 :正如下面的 Dave Goodell 指出的那样,偏移量计算会更好地完成
#include <stddef.h>
/* ... */

offsets[0] = offsetof(struct xyz_t,a);
offsets[1] = offsetof(struct xyz_t,b);
offsets[2] = offsetof(struct xyz_t,c);
offsets[3] = offsetof(struct xyz_t,d);
offsets[4] = offsetof(struct xyz_t,e);

如果您的 MPI 支持它(大多数应该支持,尽管 OpenMPI 对某些 MPI2.2 类型很慢) MPI_UNSIGNED应替换为 MPI_UINT32

关于debugging - 如何在创建 MPI 派生数据类型期间修复无效参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8985651/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com