高性能计算应用优化之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

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份