在上一篇中我们介绍了非线程安全的 Probe 和 MPI-3 中线程安全的 Mprobe,下面将介绍 MPI-3 中大的计数及相关函数。
在 MPI-1 和 MPI-2 标准中,所有的通信和 I/O 函数/方法中的计数参数都使用的是 C 语言 int 或者 Fortran INTEGER 类型,在大多数系统中,它们都是用 32 位来表示的。一个 32 位的 C int 数所能表示的最大整数是 2147483647,超过该值就会发生溢出,此即一些通信和 I/O 函数中能够发送/接收的最大数据类型个数,如果使用 MPI 中预定义的数据类型,如 MPI.INT 或 MPI.FLOAT,则单次能够发送/接收的数据量的上限大概是 2 GB。这对一些数据量比较大的应用是一个比较严重的限制。
MPI 论坛也意识到这个问题,一种可行的解决方案是为这些函数都定义一个新的版本,在这些新版本中使用 64 位或更大的整数类型,不过这样会使得 MPI 标准中的函数数量大为增加。MPI 论坛采用了另外一种解决方案,那就是利用 MPI 对派生数据类型的支持,再额外定义一个 MPI_Count 数据类型及若干使用该数据类型的查询函数。通过此种方法,如果要发送/接收计数超过 32 位最大整数的某种类型数据,则可以首先由该数据类型作为基本类型创建派生数据类型,只要所发送/接收的数据按照派生数据类型计数不超过 32 位最大整数,通信操作就能成功执行,并且可以用这些新定义的查询函数来得到大的消息及数据类型的相关信息,而不至于发生溢出。
MPI-3 新定义的 MPI_COUNT 数据类型被定义为足够大的整数以使其足以表示 MPI 支持的内存地址和文件偏移。新定义的查询函数与已经存在的对应函数完成相同的功能,不过在名称后面加了 _x 后缀,并且 size,lb,extent 等参数都使用了 MPI_Count 数据类型,其 C 语言接口如下:
MPI_Type_size_x(MPI_Datatype datatype, MPI_Count *size)
MPI_Type_get_extent_x(MPI_Datatype datatype, MPI_Count *lb, MPI_Count *extent)
MPI_Type_get_true_extent_x(MPI_Datatype datatype, MPI_Count *lb, MPI_Count *extent)
另外,新增 statu