《并行计算的编程模型》一1.8 并行I/O

简介: 本节书摘来华章计算机《并行计算的编程模型》一书中的第1章 ,第1.8节, [(美)帕万·巴拉吉(Pavan Balaji)编著;张云泉等译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.8 并行I/O

许多并行科学应用需要从文件中读写大量数据,例如读取输入网格、程序暂停保存数据/重启暂停程序、数据分析和虚拟化。如果文件I/O效率不高,将成为程序性能的瓶颈。MPI为程序应用开发者提供简明的并行I/O函数接口,能够显著地提高文件I/O访问性能。
MPI提供的I/O接口保留在POSIX文件中常用的I/O操作,例如打开、关闭、查找、读取和写入操作。同时,MPI提供许多高级的特性,例如不连续访问内存和文件中数据、聚合I/O和传递有关性能的提示给MPI实现。
图1-10是每个进程从一个共享文件的不同位置并行读取数据的简单程序示例。MPI提供多种读取数据的实现方式。图1-11是一种最简单的使用独立文件I/O和文件指针读取数据的程序示例。每个进程通过MPI_File_open函数打开文件,其中,该函数的第一个参数MPI_COMM_WORLD代表通信域,第二个参数代表需要打开的文件路径和文件名,第三个参数代表文件打开方式,第四个参数通过在MPI_Info对象中附加一对键值向I/O实现中传递信息,第五个参数是I/O操作返回的句柄,可用于后续I/O操作。在第四个参数MPI_Info中,可传递文件分片和内部缓冲区大小等信息,用于优化MPI I/O操作。

图1-10 每个进程从一个共享文件中读取一块数据

screenshot

每个进程通过调用MPI_File_seek函数,根据读取位移量,将文件指针移动到相应的位置。在该程序示例中,每个进程的文件指针是相互独立的。MPI也提供共享文件指针的I/O操作,即多个进程共享一个文件指针。通过MPI_File_read函数,将mgsieze个整数类型数据从文件中读取到内存缓冲区中。最后,通过调用MPI_File_close函数,实现关闭文件和结束I/O操作。图1-11的所示的MPI I/O读取数据的方式与POSIX I/O方式类似。
MPI提供的第二种读取文件内容的方式是避免使用文件指针,直接根据偏移量读取数据。通过调用MPI_File_read_at函数实现显示偏移并行文件读取功能,只需在该函数参数中指定偏移量即可,不再需要调用MPI_File_seek函数。由于MPI_File_read_at函数不需要文件指针,因此该函数实现的I/O操作是线程安全的。
MPI_File_read和MPI_File_read_at是独立调用的I/O函数,而非聚合调用函数。每个进程均可独立调用这两个函数,无需所有进程都必须调用同样的函数。因此,MPI实现无法得知多少进程会调用这两个函数,也无法对这两个函数实现的I/O操作进行性能优化。
MPI也提供聚合I/O读写方式,并在聚合I/O读写方式的名字中添加“_all”关键字,例如MPI_File_read_all和MPI_File_read_at_all函数。聚合I/O读写方式的函数参数与相应的独立I/O读写方式类似,区别在于聚合I/O读写方式需要所有进程调用I/O读写函数。因此,在聚合I/O读写方式中,MPI可对性能进行优化,如文献[268,269]所示的优化方式。通常,建议程序开发者尽量采用聚合I/O读写方式,而非独立I/O读写方式。
图1-12程序示例是采用第三种方式实现图1-10中所示的文件数据读取,即“文件视口”方式。MPI_File_set_view函数用于指定文件I/O访问视口,即指定文件需要读写或者跳过访问的数据。文件视口通过“偏移、基本类型和文件类型”三元参数表达:偏移指定视口在文件中的起始位置,例如相对文件头的偏移位置;基本类型描述文件I/O访问的基本数据类型;文件类型由基本类型构成。文件视口通过每个进程上定义的三元参数组成。

screenshot

在图1-12中,每个进程上指定的偏移量为rank×msgsize,基本类型为MPI_INT,文件类型也为MPI_INT。文件类型之后的参数用于指定数据表示方式,“native”表示文件数据存储方式与内存一致。MPI_File_set_view函数中最后一个参数用于传递运行时的信息。在文件读取时,可以采用独立或者聚合两种方式,图1-12中采用聚合读取文件数据方式。每个进程从文件视口中读取msgsize个整数到内存缓冲区中。因为文件视口中偏移量不同,所以每个进程从文件中不同位置读取文件数据。
MPI提供高效的I/O访问方式,尤其适合每个进程访问文件中不同位置的数据,例如访问子数组或者分布式数组中的数据。在非连续I/O访问方式中,MPI-I/O访问方式性能优越于POSIX I/O访问方式,在一些程序中,MPI-I/O访问性能是POSIX I/O的1000倍。关于MPI I/O的详细介绍可参考文献[127]。

相关文章
|
机器学习/深度学习 人工智能 自然语言处理
ChatGPT的应用与发展趋势:解析人工智能的新风口
ChatGPT的应用与发展趋势:解析人工智能的新风口
657 0
|
12月前
|
运维 数据挖掘 索引
服务器数据恢复—Lustre分布式文件系统服务器数据恢复案例
5台节点服务器,每台节点服务器上有一组RAID5阵列。每组RAID5阵列上有6块硬盘(其中1块硬盘设置为热备盘,其他5块硬盘为数据盘)。上层系统环境为Lustre分布式文件系统。 机房天花板漏水导致这5台节点服务器进水,每台服务器都有至少2块硬盘出现故障。每台服务器中的RAID5阵列短时间内同时掉线2块或以上数量的硬盘,导致RAID崩溃,服务器中数据无法正常读取。
|
Kubernetes Cloud Native 前端开发
Kubernetes入门指南:从基础到实践
Kubernetes入门指南:从基础到实践
341 0
|
虚拟化 数据中心 Docker
深入探讨Docker Machine
【8月更文挑战第25天】
203 0
|
存储 SQL 关系型数据库
binlog、redolog和undolog三者有何区别?
MySQL中的binlog、redo log和undo log是日志文件,各有特定作用。binlog用于数据备份、恢复和复制,适用于所有存储引擎。redo log记录事务修改,用于崩溃恢复和数据持久性,仅InnoDB存储引擎支持。undo log保存事务修改前的状态,用于事务回滚和MVCC,也仅InnoDB支持。它们在功能和记录内容上有明显区别,有助于事务管理和数据库一致性。
972 0
|
算法 JavaScript 前端开发
JavaScript学习 -- RSA算法应用实例及公钥私钥的生成方法
JavaScript学习 -- RSA算法应用实例及公钥私钥的生成方法
616 0
|
存储 算法 测试技术
配电网可靠性评估(4)—(顶刊复现)基于优化模型的配电网可靠性评估
顶刊论文《Reliability Assessment for Distribution OptimizationModels: A Non-Simulation-Based Linear Programming Approach》,介绍了一种基于线性规划方法的配电网可靠性评估模型,首次将数学优化方法应用到配电网可靠性评估当中。这篇博客就是对该文献的详细解读及完整代码复现。
|
Linux vr&ar Windows
实战篇|浅析MPS对PCIe系统稳定性的影响
MPS影响系统性能,还有一个更加重要的事情,MPS对PCIe系统稳定性也起着决定性的作用。
|
算法 C语言 C++
非线性优化--NLopt算法使用及C++实例
非线性优化--NLopt算法使用及C++实例
非线性优化--NLopt算法使用及C++实例
|
Java API C语言
Lua脚本是干什么的?底层原理是什么?
Lua脚本是干什么的?底层原理是什么?
1602 0