2

常见问题解答 #20说:

从 v1.1 开始,Open MPI 要求 C、C++ 和 Fortran 数据类型的大小在单个并行应用程序内的所有平台上都相同,但 MPI_BOOL 和 MPI_LOGICAL 表示的类型除外——这些类型在进程之间的大小差异得到妥善处理。单个 MPI 作业中进程之间的字节序差异会得到正确且自动的处理。

在 v1.1 之前,Open MPI 不包括对数据大小或字节序异质性的任何支持。

这是否意味着 MPI_UNSIGNED_LONG 在所有主机上必须是 32 位或在所有主机上必须是 64 位?我的集群由 32 位和 64 位 Linux 服务器组成。确保所有主机大小相同long的最佳方法是什么?unsigned long也许我应该只使用int和'long long'?在所有主机上分别是 32 位和 64 位。只要不使用,数据大小不一致是否可以?

谢谢你。

4

2 回答 2

3

无论架构如何,OpenMPI 数据类型都应该相同。例如,aMPI_UNSIGNED_LONG定义为 32 位,而 an 定义MPI_UNSIGNED_LONG_LONG为 64 位(参见例如此处:http ://www.mpi-forum.org/docs/mpi-2.2/mpi22-report.pdf ,第 433 页。MPI_UNSIGNED_LONG被定义为有 4 个字节)。

MPI 规范有另外MPI_INT64_T的朋友,所以不涉及猜测。

于 2011-08-23T17:32:34.407 回答
1

值得一提的是,MPI 1.1 有点老了。如果您必须使用 MPI 1.1,那么我不确定,但如果您可以使用 MPI 2,请查看MPI 2.2 标准的第 3.3 节。据我了解,例如 MPI_UNSIGNED_LONG 在所有主机上的大小(相同的字节数)是不需要的。对于发送/接收操作,MPI 数据类型未定义为特定大小;它们被定义为对应于 C 或 Fortran 中的特定数据类型。因此,例如 MPI_UNSIGNED_LONG 对应于 C 中的unsigned long int(表 3.2)。由于 C 不保证unsigned long int的任何特定大小(只是在 C99 中至少为 32 位),因此MPI 也不保证。

为了支持这一点,我们直接引用了标准第 38 页:

[...] 如果发送方和接收方在不同的环境中执行,则从发送缓冲区获取的十个实数值将在存储到接收缓冲区之前转换为接收方站点上的实数表示。虽然从发送缓冲区获取的实元素数等于接收缓冲区中存储的实元素数,但存储的字节数不必等于加载的字节数。例如,发送方可以使用四字节表示,而接收方可以使用八字节表示来表示实数。

据我所知,第 433 页的表 13.2 中定义的大小仅对“external32”数据表示(用于文件互操作性)有效,并且在其他地方无效。

于 2011-08-23T20:18:29.827 回答