MPI_Aint的大小是多少?

5

我有一个关于MPI_Aint的简单问题,但是我在任何地方都找不到答案。由于某种原因,MPI_Type_size(MPI_Aint)不起作用(它看起来不像经典的数据类型,例如MPI_Double或MPI_Int),至少在OpenMPI 1.8.4和1.10.1中是这样,但我不认为这是一个OpenMPI的问题。

我必须使用MPI_Type_create_hindexed()创建一个类型,并动态分配array_of_displacements数组。计算大小N后,我写了:

MPI_Aint* disps = (MPI_Aint*) malloc(N*sizeof(MPI_Aint)) ;

替代

int mpiAintSize ;
MPI_Type_size(MPI_Aint, &mpiAintSize) ;
MPI_Aint* disps = (MPI_Aint*) malloc(N*mpiAintSize) ;

因为这个问题,只要我幸运且不需要可移植性(这个数组将用于使用MPI-I/O写入/读取大型文件),sizeof() 就可以完成工作。
但是我想知道:分配我的 disps 数组的最佳方法是什么?我在 MPI_Aint 方面错过了什么?

编辑:对于任何感兴趣的人,我在Gilles的回复后发现MPI_Aint作为C类型不存在可移植性问题。我们从不读/写MPI_Aint,我们只使用它们的值来定义结构(这不取决于它们在内存中的大小)。因此,无需为它们创建统一(可移植)的MPI_Type - Robin Huart
1个回答

3

MPI_Aint不是MPI_INTMPI_DOUBLE或者使用MPI_Type_create_hindexed()创建的MPI_Type,而是C语言中的一种类型,就像intdouble或者struct一样。实际上,我怀疑大多数时候MPI_Aint只是被定义为足够存储所需内容的typedef。很可能,它会被定义为typedef long MPI_Aint;或者typedef long long MPI_Aint;

因此,您分配数组的方法是正确的,应该使用sizeof()而不是MPI_Type_size()


1
实际上,在检查后,我在mpi.h中找到了typedef,它是一个ptrdiff_t... 在我看来,让MPI_Double看起来像MPI_Aint非常令人困惑,尽管其中一个是MPI_type而另一个不是。但无论如何,非常感谢您的答复! - Robin Huart
如果我理解正确,更令人困惑的是,甚至有一个MPI_AINT数据类型来描述MPI_Aint。https://trac.mpich.org/projects/mpich/browser/src/include/mpi.h.in?rev=fd6627a1bf6cdbe629defe77db231558948c48dd - alfC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接