【问题标题】:MPI_FILE_READ && little endian on BluegeneBluegene 上的 MPI_FILE_READ && little endian
【发布时间】:2014-10-15 14:41:36
【问题描述】:

我需要读取(和写入)一些二进制小端文件。 我正在使用英特尔 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。还有其他方法吗?速度很重要。

【问题讨论】:

  • 您可以尝试在 PC 和 BGP 系统上使用external32 表示。
  • @HristoIliev,他可以尝试,但它不会做任何事情。他必须在 Blue Gene 系统上建立自己的 MPICH——并非不可能,但我不会迈出第一步。
  • 如果你读取数据成功了,只是字节顺序不对,你就不能交换字节吗?我一直这样做。或者先将文件转换为大端。
  • @VladimirF:字节交换实际上是这里最简单的部分。如何处理 PC fortran 编译器期望的 fortran 记录和 BG fortran 编译器期望的填充(如果有)不是更大的挑战吗?
  • @RobLatham 很可能,我几乎只使用流文件来避免这种复杂性,这就是我没有考虑这一点的原因。

标签: fortran mpi endianness mpi-io


【解决方案1】:

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

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

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

【讨论】:

  • 这真的能帮助他阅读他拥有的特定文件吗?
  • 因为@Vasily 既在写入数据又在读取数据,我推测他对文件格式有一定的控制权。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-12-01
    • 2018-05-15
    • 2019-06-30
    • 1970-01-01
    • 2022-06-10
    • 2013-03-29
    • 1970-01-01
    • 2010-10-16
    • 2012-10-09
    相关资源
    最近更新 更多