Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Io 使用MPI-I/O读取Fortran未格式化文件中的真实实体_Io_Fortran_Mpi Io - Fatal编程技术网

Io 使用MPI-I/O读取Fortran未格式化文件中的真实实体

Io 使用MPI-I/O读取Fortran未格式化文件中的真实实体,io,fortran,mpi-io,Io,Fortran,Mpi Io,我正在尝试通过MPI-I/O读取CFD网格文件。该文件是一个具有大端性的Fortran非格式化格式,它包含整数和实*8的混合变量(该文件以块大小整数开始,然后是该块的x、y、z坐标)。我可以设法读取第一个整数,但真正的实体是完全错误的或不是那么准确。所以我简化了代码以重现相同的错误。它以Fortran非格式化格式将一个实值写入文件,并尝试以串行和并行方式(通过MPI-I/O)将其读回: 如果使用big-endian选项(我为“英特尔编译器”添加了“-convert big_-endian”选项)

我正在尝试通过MPI-I/O读取CFD网格文件。该文件是一个具有大端性的Fortran非格式化格式,它包含整数和实*8的混合变量(该文件以块大小整数开始,然后是该块的x、y、z坐标)。我可以设法读取第一个整数,但真正的实体是完全错误的或不是那么准确。所以我简化了代码以重现相同的错误。它以Fortran非格式化格式将一个实值写入文件,并尝试以串行和并行方式(通过MPI-I/O)将其读回:

如果使用big-endian选项(我为“英特尔编译器”添加了“-convert big_-endian”选项)编译,“英特尔MPI”的结果略有不同(这似乎是与字节相关的问题):

如果我放弃big-endian模式(即,将MPI_FILE_OPEN的数据表示形式替换为“本机”+设置disp=4以跳过Fortran未格式化格式的第一个4字节记录标记+无额外编译标志),MPI-I/O读取的值将完全相同。但是,由于网格文件是以big-endian格式提供的,因此我必须继续使用“-convert big_-endian”选项

HDF-5的使用似乎也不容易,因为文件格式已被其他预处理和后处理代码共享

有没有人有过这样的经历或知道补救方法

最好的,
Jeff

虽然MPI中通信操作的默认错误处理程序是
MPI\u ERRORS\u FATAL
,因此如果发生任何类型的通信错误,程序将中止,但文件I/O操作的默认错误处理程序是
MPI\u ERRORS\u RETURN
,这意味着程序将继续执行并返回错误代码。如果在调用
MPI\u FILE\u SET\u VIEW
后检查
ierr
的值,您会注意到打开的MPI返回
MPI\u ERR\u UNSUPPORTED\u DATAREP
。原因是OpenMPI附带的ROM-IO版本没有实现
external32
数据表示

至于使用英特尔MPI时浮点数的值稍有错误:64位IEEE 754中的
0.142857149243355
0x3FC24924A0000000
。根据英特尔MPI,此数字的
external32
表示形式(可以使用
MPI\u PACK\u EXTERNAL
进行验证)为:

这根本不是big-endian存储中的IEEE 754数字。更确切地说,它是一个奇怪的大端和小端的混合体——值被分成两半,每个值都存储在大端,但下半部分和小端一样首先出现。这是Intel实现的
external32
中的一个错误,还是表示法的一个实际问题,我无法判断,因为后者在MPI标准中几乎没有描述

在big-endian计算机上编写的未格式化文件可能如下所示:

00 00 00 08 3F C2 49 24 A0 00 00 00 00 00 00 08
----------- ^^^^^^^^^^^^^^^^^^^^^^^ -----------
  reclen         record value          reclen

MPI文件读取顺序的前8个字节是
00 00 08 3F C2 49 24
。英特尔MPI将这些字节从
external32
转换回后,将获得
0x3FC2492400000008
,在64位IEEE 754表示中是
0.142857074737549

而MPI中通信操作的默认错误处理程序是
MPI\u ERRORS\u FATAL
,因此如果发生任何类型的通信错误,程序将中止,文件I/O操作的默认错误处理程序是
MPI\u ERRORS\u RETURN
,这意味着程序将继续执行并返回错误代码。如果在调用
MPI\u FILE\u SET\u VIEW
后检查
ierr
的值,您会注意到打开的MPI返回
MPI\u ERR\u UNSUPPORTED\u DATAREP
。原因是OpenMPI附带的ROM-IO版本没有实现
external32
数据表示

至于使用英特尔MPI时浮点数的值稍有错误:64位IEEE 754中的
0.142857149243355
0x3FC24924A0000000
。根据英特尔MPI,此数字的
external32
表示形式(可以使用
MPI\u PACK\u EXTERNAL
进行验证)为:

这根本不是big-endian存储中的IEEE 754数字。更确切地说,它是一个奇怪的大端和小端的混合体——值被分成两半,每个值都存储在大端,但下半部分和小端一样首先出现。这是Intel实现的
external32
中的一个错误,还是表示法的一个实际问题,我无法判断,因为后者在MPI标准中几乎没有描述

在big-endian计算机上编写的未格式化文件可能如下所示:

00 00 00 08 3F C2 49 24 A0 00 00 00 00 00 00 08
----------- ^^^^^^^^^^^^^^^^^^^^^^^ -----------
  reclen         record value          reclen

MPI文件读取顺序的前8个字节是
00 00 08 3F C2 49 24
。英特尔MPI将这些字节从
external32
转换回后,将获得
0x3FC2492400000008
,即64位IEEE 754表示法中的
0.142857074737549

也可以通过用户代码(例如,使用
transfer
)转换尾数。也可以通过用户代码转换尾数(例如,使用
传输
)。
A0 00 00 00 3F C2 49 24
00 00 00 08 3F C2 49 24 A0 00 00 00 00 00 00 08
----------- ^^^^^^^^^^^^^^^^^^^^^^^ -----------
  reclen         record value          reclen