并行IO
原理
并行IO可以使多个进程同时进行IO操作,在HPC应用中有大量的IO操作,并行IO能够提高程序运行速度。并行IO有三种模式:
- 只有一个进程读写
一个进程(P0)将文件中的所有数据读入自己的缓冲区(buffer),然后用MPI发送接收函数将大部分数据传递给其他进程。计算结束后,其他进程将计算结果传给进程P0,P0负责将所有数据结果写到文件。这个模式下负责读写文件的进程是性能瓶颈,读写带宽受限于P0所在计算服务器的网络带宽、存储系统的单进程性能上限。
- 多个进程分别读写
每个进程只操作自己的文件 ,彼此间不协调,相互独立。这种模式既能同时使用计算服务器的多个网络通道,又能发挥并行存储系统的多客户端接入能力。缺点是供读取的源数据文件可能没有进程数量多,造成负载不均,输出的文件数据太多,后续处理困难。
- 多个进程读写同一个文件
多个进程相互配合,避免无用操作。该模式下需要每个进程计算文件偏移指针,避免数据冲突。这种模式下并行IO性能可能达到最好。
修改方式
并行IO有四种接口:POSIX I/O,MPI I/O,HDF5 I/O,NetCDF-4 I/O(parallel-netcdf),需要根据HPC应用支持的并行IO进行对应修改。这里以parallel-netcdf为例,parallel-netcdf是一个使用MPI-IO和一个定制版本的NETCDF API来实现高性能I/O的库,可以通过启用parallel-netcdf库来提升IO性能,常应用于气象、海洋、环境等领域。
修改步骤如下:
- 下载安装parallel-netcdf,方法参考链接:https://github.com/Parallel-NetCDF/PnetCDF。
- 执行以下命令设置PNETCDF环境变量。
1 2
export PATH=/path/to/PNETCDF/bin:$PATH export LD_LIBRARY_PATH=/path/to/PNETCDF/lib:$LD_LIBRARY_PATH
- 编译应用软件时通过设置CPPFLAGS和LDFLAGS将PNETCDF链接到应用软件。
1 2 3
export PNETCDF=/path/to/PNETCDF export CPPFLAGS="-I$PNETCDF/include" export LDFLAGS="-L$PNETCDF/lib -lpnetcdf"
父主题: 优化方法