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

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 每个进程从一个共享文件中读取一块数据

每个进程通过调用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访问的基本数据类型;文件类型由基本类型构成。文件视口通过每个进程上定义的三元参数组成。

在图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]。

时间: 2024-09-20 14:45:40

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

《并行计算的编程模型》一导读

前 言 对于正在编程的程序员,编程模型可被看作一台虚拟机,并可通过编程语言和函数库实现.如果某个编程模型成为计算机科学研究中的热点,需要具有以下特性:高效性(易于描述各种抽象算法).移植性(兼容各种硬件计算平台).高性能(高效均衡地利用硬件平台的计算能力).通用性(广泛地描述各种算法).针对特定的编程模型,同时具有上述四种特性中的一种或两种相对容易,但同时具备这四种特性几乎是不可能的.特定的编程模型无法同时具备四种特性的主要原因在于编程模型的多样性,因此需要根据具体的科学应用,选择不同的编程模型

浅析云计算分布式并行计算:编程模型

MapReduce 是由Google公司开发的一个针对大规模群组中的海量数据处理的分布式编程模型.它实现了两个功能:Map把一个函数应用于集合中的所有成员,然后返回一个基于这个处理的结果集.而Reduce是把从两个或更多个Map中,通过多个线程,进程或者独立系统并行执行处理的结果集进行分类和归纳.Map() 和 Reduce() 两个函数可能会并行运行,即使不是在同一的系统的同一时刻. 微软于2010年12月21日发布了分布式并行计算基础平台--Dryad测试版,成为谷歌MapReduce分布式

《并行计算的编程模型》一1.7 单边通信

1.7 单边通信 在点对点通信和聚合通信方式中,发送进程和接收进程共同参与通信过程.MPI提供另外一种通信方式,即单边通信方式.在单边通信方式中,单个进程便可指定发送和接收的数据.单边通信主要用于ARMCI/GA(见第5章).UPC(见第4章)和OpenSHMEM(见第3章)等函数库中,单边通信也可称之为远程内存访问(RMA). 单边通信模型主要分为三部分.第一部分是创建MPI_Win窗口对象,用于可被其他进程访问的内存区域.第二部分是进程间数据移动方式,包含从远程进程上读.写.更新等数据移动方

《并行计算的编程模型》一1.1 引言

第1章 Programming Models for Parallel Computing 消息传递接口 William D. Gropp,伊利诺伊大学厄巴纳–香槟分校 Rajeev Thakur,阿贡国家实验室 1.1 引言 在使用分布式内存编程模型的并行程序中,MPI是一个标准和可移植的通信接口.MPI既为并行通信提供丰富的函数接口,也为并行文件I/O访问等提供函数接口.同时,MPI也支持多程序多数据(MPMD)编程模型.MPI是一种基于库的系统,而非编译器或者编程语言.MPI库函数通过C和

《并行计算的编程模型》一3.3 OpenSHMEM存储模型

3.3 OpenSHMEM存储模型 OpenSHMEM是单程序.多数据(single program multiple data,SPMD)编程模型,特点是强调单边通信以及数据移动与同步解藕,是提供高性能.高可扩展性通信和同步程序的库.OpenSHMEM程序由松散同步的进程组成,这些进程也叫作处理单元(Processing Element,PE).所有PE同时开始并执行相同的程序,通常在各自集合问题的子域上执行操作,并周期性地与其他PE通信. OpenSHMEM内存模型是PGAS,类似于其他PG

《并行计算的编程模型》一3.6.1 全局同步屏障

3.6.1 全局同步屏障 全局同步屏障是大部分并行编程模型都有的同步机制,概念很清晰推理也简单,虽然对可扩展性的影响还有待改进.当所有PE调用屏障函数时,它能确保直到所有参与的PE都到达时函数调用才能返回.因此,当可能出现竞争时,经常添加屏障以协助调试.除了全局屏障shmem_barrier_all(),OpenSHMEM也提供了集合屏障shmem_barrier(),可以操作在PE的子集,这将在3.7节进行讨论,因为子集选择机制在这一节比较常见.

《并行计算的编程模型》一3.2 设计理念和根据

3.2 设计理念和根据 SHMEM和OpenSHMEM的构思和发展都假设它们和底层硬件系统体系结构有密不可分的关系.由克雷研究公司开发和出售的克雷T3D和T3E计算机系统在其网络架构中包含几个高级的硬件加速特征,是与SHMEM合作设计的,用以最大化可用的带宽及最小化系统的3D Torus网络延迟[85].克雷公司,即原来克雷研究公司的现代同名,在其最新的Gemini网络架构[86,90]中也延续了相同的设计理念.当1996年SGI收购了克雷研究公司,也同时获得了SHMEM的知识产权,SGI设计了

《并行计算的编程模型》一3.5.1 RMA函数语义

3.5.1 RMA函数语义 OpenSHMEM编程模型为提高可扩展性将数据传输和同步解藕,解藕的语义比较容易理解.调用RMA函数(put或get)的PE被称为传输的"主动端",另一个PE(很可能不知道该传输)被称为"被动端".OpenSHMEM仅有的隐式一致性确保put和get操作在主动端发生,被动端如果需要的话也可以通过给程序增加同步来执行一致性.主动端完成准则:当单个RMA调用(put或get)在主动端返回时,程序可以认为主动端的内存状态与该操作的完成一致.被动

《并行计算的编程模型》一3.9 未来方向

3.9 未来方向 在本书写作之时,从2010年开始,在对OpenSHMEM的大量需求驱动下,与OpenSHMEM相关的许多开发正在进行中.如3.2节所述,一些厂商已发布了加速硬件和固件来支持网络原语,在超大规模系统和商用系统中极大简化了OpenSHMEM的实现并提高了性能和鲁棒性.这包括对OpenSHMEM集合和原子内存操作的硬件支持.对小消息性能提高的硬件支持.以及对大规模系统互连自适应路由和阻塞管理的硬件支持.OpenSHMEM论坛和邮件列表建议采用来自Quadrics实现的扩展,包括非常有

《并行计算的编程模型》一3.1 引言

第3章 Programming Models for Parallel ComputingOpenSHMEMJeffery A. Kuehn,橡树岭国家实验室Stephen W. Poole,橡树岭国家实验室 3.1 引言 OpenSHMEM [74,138,223]是SHMEM API [88,87]的当代派生物,SHMEM API是克雷研究公司(Cray Research)于1993年为有效编程克雷T3D计算机系统而开发的[85],1996年当克雷研究公司被SGI [251]收购时被转让给了