首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Fortran和MPI语言实现NetCDF文件的并行读写

用Fortran和MPI语言实现NetCDF文件的并行读写
EN

Stack Overflow用户
提问于 2019-12-28 05:10:23
回答 2查看 961关注 0票数 0

我正在尝试实现NetCDF-4文件的并行读写。

为此,我安装了netcdf-fortran和mpi。我还安装了pnetcdf (我不知道是否需要它)。所有的安装都是通过包管理器完成的(我使用的是Debian 10)。

当我尝试正常读取(没有并行化) NetCDF文件时,一切都进行得很顺利。但是,当我尝试使用mpi时,我收到以下消息:"NetCDF: Parallel operation on file opened for non-parallel access“我尝试运行以下示例(因为我的程序可能是错误的)。https://github.com/Unidata/netcdf-fortran/blob/master/examples/F90/simple_xy_par_rd.f90和我收到了同样的信息...这是什么意思?

我使用的是gfortran,为了编译这个程序,我输入了以下内容:

mpif90 -o executablename -I/usr/include/ mycode.f90 -lnetcdff -lnetcdf -lpnetcdf

在此之后:

mpirun ./executablename

我做错了什么吗?

我从来没有使用过mpi,所以可能是我把安装搞砸了。

使用Fortran有没有其他并行读/写netcdf文件的方法?

EN

回答 2

Stack Overflow用户

发布于 2019-12-29 07:54:02

NetCDF并行I/O软件

有几个软件包可用于NetCDF并行I/O。

Unidata netcdf-c/netcdf-fortran

来自Unidata的规范的netCDF C和Fortran库。参见https://www.unidata.ucar.edu/software/netcdf/。netcdf-fortran库由两个不同的Fortran API组成,一个基于Fortran 77,另一个基于Fortran 90。Fortran API包装了C API,因此Fortran也需要C库。构建netcdf-fortran时,必须找到或指定netcdf-c的位置。

netcdf-c支持几种二进制格式:*原始netCDF格式及其变体(也称为“经典”格式)。* netCDF 4.0中引入的netcdf/HDF5格式。(也称为netcdf-4/HDF5格式)。

并行I/O对于经典格式和HDF5格式都是可能的,但netcdf-c必须正确构建。

要获得经典格式的并行I/O,必须安装pnetcdf (也称为parallel-netcdf)。

要获得netCDF-4/HDF5格式的并行I/O,必须安装HDF5,并且必须在安装时启用并行I/O功能。

pnetcdf

pnetcdf包(有时称为并行netCDF )是一个独立库,是来自Argonne National Labs的完全独立的netCDF实现。它的网页上写道:"PnetCDF是一个高性能的并行I/O库,用于访问Unidata的NetCDF,即经典格式的文件,特别是CDF-1、2和5的格式。“

参见https://parallel-netcdf.github.io/

它对于高性能计算非常有用。它可以独立使用,根本不需要安装netCDF。pnetcdf有一个类似netCDF的API,但函数名不同。如果pnetcdf在独立模式下使用(即没有Unidata netCDF库),则用户代码必须用pnetcdf API编写。这段代码不会使用库运行,它将只使用netCDF运行。

此外,pnetcdf只能与netCDF经典格式一起使用。它不能读/写HDF5文件。

HDF5

HDF5是一种众所周知的高性能数据格式。请参阅https://portal.hdfgroup.org/display/support

HDF5支持并行I/O。HDF5必须使用MPI编译器构建,并且必须在configure中指定--enable-parallel选项。这将导致HDF5在构建时启用并行I/O功能。

PIO (也称为ParallelIO)

PIO是一个C/Fortran库,用于许多处理器上的并行I/O。

PIO提供了类似netCDF的API,并允许用户指定处理器的某个子集来执行IO。计算代码调用类似netCDF的函数来读写数据,而PIO使用IO处理器来执行所有必要的IO。参见https://ncar.github.io/ParallelIO/

PIO有自己的应用程序接口,但也支持使用netCDF原生应用程序接口。因此,PIO可以与现有的netCDF代码一起使用。PIO还提供了一种跨处理器分解数据的好方法,并通过netCDF调用轻松处理。PIO可以使用Unidata netCDF、HDF5和pnetcdf,因此可以读/写各种netCDF文件。

如何进行取决于您的情况。

几个处理器上的I/O (<10)

使用Unidata的netcdf-c/netcdf-fortran库将是最简单的。构建pnetcdf,HDF5,然后是netcdf-c,然后是netcdf-fortran,所有这些都使用MPI编译器。确保在构建HDF5时指定--enable-parallel。(对于netcdf-c,netcdf-fortran不是必需的,它们将自动检测HDF5构建的并行功能)。

一旦构建完成,netcdf和Fortran API就可以对任何netCDF文件执行并行I/O操作。(几乎所有的HDF5文件也是如此。)使用nc_open_par()/nc_create_par()获取并行I/O。

某些处理器上的I/O (10 - 1000)

pnetcdf的使用可能是最简单的,并为经典格式文件提供最佳性能。它的API稍有不同,不适用于HDF5文件。

多个处理器上的I/O (1000- 1M)

PIO将允许您指定处理器的某个子集来执行所有I/O。该子集可以使用pnetcdf、HDF5或Unidata代码,具体取决于底层数据格式和用户所做的选择。

票数 2
EN

Stack Overflow用户

发布于 2020-03-31 07:36:19

我也有同样的问题。我通过使用netcdf4和MPI库以及以下命令的输出给出的链接标志解决了这个问题:

代码语言:javascript
复制
> nf-fortran-config --cflags

-I/usr/lib/hpc/gnu7/openmpi3/netcdf-fortran/4.5.2/include -I /usr/lib/hpc/gnu7/openmpi3/netcdf/4.7.1/include
-L/usr/lib/hpc/gnu7/openmpi3/netcdf/4.7.1/lib64 -lnetcdf -L/usr/lib/hpc/gnu7/openmpi3/hdf5/1.10.5/lib64 -lhdf5

对于MPI也是如此:

代码语言:javascript
复制
> pkg-config --cflags ompi-f90
-pthread -I/usr/lib/hpc/gnu7/mpi/openmpi/3.0.0/include -I/usr/lib/hpc/gnu7/mpi/openmpi/3.0.0/lib64

> pkg-config --libs ompi-f90
-L/usr/lib/hpc/gnu7/mpi/openmpi/3.0.0/lib64 -lmpi_usempif08 -lmpi_usempi_ignore_tkr -lmpi_mpifh -lmpi

请注意,包含目录和库目录是特定于我的系统的,在您的示例中应该有所不同,但命令nf-fortran-config --cflagspkg-config将为您的系统提供正确的目录。

一旦你获得了这些信息,你就需要利用它们来编译你的代码,在你的例子中应该是这样的:

代码语言:javascript
复制
> mpif90  -o executablename mycode.f90 -I/usr/lib/hpc/gnu7/openmpi3/netcdf-fortran/4.5.2/include -I /usr/lib/hpc/gnu7/openmpi3/netcdf/4.7.1/include
-L/usr/lib/hpc/gnu7/openmpi3/netcdf/4.7.1/lib64 -lnetcdf -L/usr/lib/hpc/gnu7/openmpi3/hdf5/1.10.5/lib64 -lhdf5 -pthread -I/usr/lib/hpc/gnu7/mpi/openmpi/3.0.0/include -I/usr/lib/hpc/gnu7/mpi/openmpi/3.0.0/lib64 L/usr/lib/hpc/gnu7/mpi/openmpi/3.0.0/lib64 -lmpi_usempif08 -lmpi_usempi_ignore_tkr -lmpi_mpifh -lmpi

当然,您可以使用Makefile文件来简化上面的示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59506059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档