0

我需要读取(和写入)一些二进制小端文件。我正在使用英特尔 FC 和英特尔 MPI 在 PC 上编写我的 fortran 代码。I/O 在 PC 上运行良好,但最终原因是在 Bluegene/P 上运行程序。Bluegene/P(XL Fortran 编译器)具有大字节序。当我需要非并行 I/O 操作(如 fortran REED & WRITE)时,我正在使用

call SETRTEOPTS('ufmt_littleendian=8')

不幸的是,当我需要并行 I/O 时,例如 MPI_FILE_READ,“SETRTEOPTS('ufmt_littleendian=8')”被忽略。我正在设置视图:

call MPI_FILE_SET_VIEW(ifile, offset, MPI_FLOAT, MPI_FLOAT, 'native', MPI_INFO_NULL, ierr)

我应该怎么办?我不想创建自己的 DATAREP。还有其他方法吗?速度非常重要。

4

2 回答 2

1

您需要使用 parallel-netcdf 或 HDF5。Parallel-HDF5 的学习曲线有点陡峭,但您会得到一个自我描述的可移植文件格式。它将以您尚不了解的方式帮助您前进。

性能开销可以忽略不计。如果你有很多小数据集,Pnetcdf 有一点优势,但这是一种相当病态的情况。

一些应用程序会进行字节交换,但正如您提到的 fortran,您必须非常小心,PC fortran 编译器和 Blue Gene fortran 编译器在将多少(如果有)记录填充放入其 fortran 输出中完全一致。呸。

于 2014-10-15T20:08:10.163 回答
0

您可以尝试将“call setrteopts('ufmt_littleendian=8')”添加到您的程序中,而不是设置环境变量。

或者,您可以指示英特尔编译器生成大端数据文件。请参阅 OPEN 语句中的 CONVERT= 说明符或 convert 编译器选项。

转换(在 BG/P 端从 big-endian 到 little-endian,或者在 Intel 端从 little-endian 到 big-endian)具有运行时性能成本。因此,如果您希望读取端 (BG/P) 尽可能快,最好在写入端 (Intel) 创建大端数据文件。

于 2015-01-12T06:56:18.880 回答