高性能计算应用优化之IO调优

2024-09-03 10:52

本文主要是介绍高性能计算应用优化之IO调优,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

IO调优

IO是应用程序进行结果输出的主要方式,也是程序运行开销最大的部分。大规模并行程序通常需要多个处理器同时执行任务,处理大量的数据,处理器的速度日新月异,而IO操作的速度并没有同步提升,导致IO成为了程序运行的瓶颈。尤其在分布式环境中,IO操作更加复杂和耗时,对程序性能造成了严重影响。

因此,大规模并行程序中的IO操作已经成为了运行的最大瓶颈,需要采取相应的优化措施来减少IO操作对程序性能的影响。例如,采用异步IO、缓存、数据压缩等技术来提高IO操作的效率。

程序编写中IO的基本原则

在文件打开和关闭期间,需要遵循如下原则。首先,以正确的模式打开文件。如果文件仅用于读取,则必须以只读模式打开,因为选择正确的模式可以使系统应用优化并仅分配必要的资源。其次,不要过于频繁地打开和关闭文件,因为这涉及到许多系统调用操作。最好的方法是在第一次需要时打开文件,只有在足够长的时间内不需要使用时才关闭文件。最后,限制同时打开的文件的数量,因为对于每个打开的文件,系统必须分配和管理一些资源。

在文件读写期间,需要遵循如下原则。首先,在一个读写调用中写入/读取全部数组/数据结构,而不是每个元素进行一次读写操作。否则将会产生大量系统调用,对I/O性能产生负面影响。其次,避免多个进程打开同一个文件用于写入,在并行程序中,更常见的方法是依据MPI进程号为每个进程建立一个文件,每个进程分别读写其对应的文件。因为文件元数据的操作可能需要串行化的锁机制。最后,在MPI程序中可以使用非阻塞MPI I/O调用,或使用基于MPI-I/O的高级库(HDF5、ADIOS、SIONlib、PNetCDF等)。最后,充分借助缓冲区所带来的性能增益。当FORT_BUFFERED设置为1(TRUE)时,该变量指定缓冲I/O应在运行时用于所有Fortran I/O单元的输入和输出。在使用ifort编译时使用“-assume buffered_io”同样能达到该效果。此外还可以调整I/O环境变量“FORT_BLOCKSIZE”,将其调整为所用文件系统的块大小。

export FORT_BUFFERED=1

并行IO的使用

在一般的并行IO中,应用程序会使用多个进程分别读写,各个进程同时将自身数据写出到一个文件,参与的进程数增多会导致数据更加碎片化,进而导致锁竞争增加和锁管理开销增大。

并行IO软件库ROMIO提出了集合I/O的方式,它增加了一步全局通信,比如在写出数据的时候,先将各进程不连续的数据按照文件中的位置排列成有序的,再分别写出,进一步地,ROMIO中提供了每个客户端节点中选择一个或几个进程负责I/O的局地聚合方式,将全局通信变成了局地通信,减少了通信的开销。

ROMIO被集成在了基于POSIX I/O接口开发的并行IO库——MPI-IO上,使得MPI-IO做到平台独立和接口易用,用程序可以通过MPI-IO及基于MPI-IO的pHDF5、pNetCDF等库实现并行IO。

为了支持更多类型的数据文件格式和I/O操作,研究人员开发了ADIOS这种基于多种底层库、能够提供统一接口的高级并行I/O库,而且能通过XML配置文件让用户灵活选择文件格式和IO方法,用户可以根据自身需要选择多种不同的并行IO库以加速IO。PIO是用于结构化网格应用程序的高级并行I/O C和Fortran库,它提供了一个类似NetCDF的API,并允许用户指定一些处理器子集来执行IO。计算代码调用类似NetCDF的函数来读取和写入数据,使用IO处理器来执行所有必要的IO。

MPI-IO是MPI-2标准的IO接口。ROMIO被集成在了基于POSIX I/O接口开发的并行IO库—MPI-IO上,使得MPI-IO做到平台独立和接口易用。

ROMIO实现了两个重要的优化,对来自一个进程的不连续请求进行Data Sieving;对来自多个进程的不连续请求进行Collective I/O。

MPI提供了MPI_Info接口,供用户为MPI库提供自定义参数key-value键值对。

ROMIO的hint允许通过提供诸如文件访问模式和文件系统细节之类的信息来指导优化。

MPI_File fh;MPI_Info info;MPI_Info_create(&info);MPI_Info_set(info, "romio_cb_write", "enable");MPI_File_open(MPI_COMM_WORLD, "hello", MPI_MODE_WRONLY | MPI_MODE_CREATE, info, &fh);

异步IO

为了更明显地缩短整体的运行时间,某些应用使用了异步的方式,使用独立于计算进程的I/O进程输出,使得计算和IO过程可以同时进行。某些并行I/O库(XIOS等)已经可以提供这种异步I/O功能,通过I/O转发技术,将I/O请求和数据发送到I/O进程。

更进一步地,可以将IO进程分配到不同的计算节点上,以降低CPU和带宽竞争。

引用:http://cucis.ece.northwestern.edu/publications/pdf/LiLia03A.pdf

这篇关于高性能计算应用优化之IO调优的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132767

相关文章

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链