---
title: 并行I/O
description: "并行I/O可以使多个进程同时进行I/O操作，在HPC应用中有大量的I/O操作，并行I/O能够提高程序运行速度。并行I/O有三种模式："
url: https://www.hikunpeng.com/document/detail/zh/perftuning/tuningtip/kunpengtuning_12_0092.html
sourcePath: /source/zh/perftuning/tuningtip/kunpengtuning_12_0092.html
indexId: e9146a37b1350f5dcd256ea0fdb9aad8a95b11b2be94fa54acc0c1da5568784858
---
# 并行I/O

#### 原理

并行I/O可以使多个进程同时进行I/O操作，在HPC应用中有大量的I/O操作，并行I/O能够提高程序运行速度。并行I/O有三种模式：

- 只有一个进程读写
  一个进程（P0）将文件中的所有数据读入自己的缓冲区（buffer），然后用MPI发送和接收函数将大部分数据传递给其他进程。计算结束后，其他进程将计算结果传给进程P0，P0负责将所有数据结果写到文件。这个模式下负责读写文件的进程是性能瓶颈，读写带宽受限于P0所在计算服务器的网络带宽、存储系统的单进程性能上限。

- 多个进程分别读写
  每个进程只操作自己的文件，各进程之间不协调，相互独立。这种模式既能同时使用计算服务器的多个网络通道，又能发挥并行存储系统的多客户端接入能力。缺点是供读取的源数据文件可能没有进程数量多，造成负载不均，输出的文件数据太多，后续处理困难。

- 多个进程读写同一个文件
  多个进程相互配合，避免无用操作。该模式下需要每个进程计算文件偏移量，避免数据冲突。这种模式下并行I/O性能可能达到最好。


#### 修改方式

并行I/O有四种接口：POSIX I/O，MPI I/O，HDF5 I/O，NetCDF-4 I/O（Parallel-NetCDF），需要根据HPC应用支持的并行I/O进行对应修改。这里以Parallel-NetCDF为例，Parallel-NetCDF是一个使用MPI-I/O和一个定制版本的NetCDF API来实现高性能I/O的库，可以通过启用Parallel-NetCDF库来提升I/O性能，常应用于气象、海洋、环境等领域。

修改步骤如下：

1. 下载安装Parallel-NetCDF，方法参考链接：https://github.com/Parallel-NetCDF/PnetCDF(https://github.com/Parallel-NetCDF/PnetCDF)。
2. 执行以下命令设置PNETCDF环境变量。
  1 2 export PATH=/path/to/PNETCDF/bin:$PATH export LD_LIBRARY_PATH=/path/to/PNETCDF/lib:$LD_LIBRARY_PATH

3. 编译应用软件时通过设置CPPFLAGS和LDFLAGS将PNETCDF链接到应用软件。
  1 2 3 export PNETCDF=/path/to/PNETCDF export CPPFLAGS="-I$PNETCDF/include" export LDFLAGS="-L$PNETCDF/lib -lpnetcdf"
