mpi4py 中 I/O 相关的 hints

上一篇中我们介绍了 mpi4py 中的共享文件指针 I/O 操作,下面我们将介绍 mpi4py 中 I/O 相关的 hints。

MPI 允许用户为 MPI 实现传递一些 hints。对 I/O 操作,这是通过一些 I/O 操作方法的 info 参数来进行传递的,这些方法包括 MPI.File.Open,MPI.File.Set_view,MPI.File.Set_info,MPI.File.Delete 等。默认情况下,这些方法的 info 参数都为 MPI.INFO_NULL,表示用户不传递任何 hints 给 MPI 实现。当需要传递一些 hints 时,可通过 MPI.Info 对象为文件指定一些如文件访问模式、文件系统相关的附加信息(即与 I/O 相关的 hints),并利用这些信息优化 I/O 访问性能,减少系统资源占用等。MPI 实现可以选择忽略某些或所有用户传递的 hints 而不会影响程序的正确性。需要注意的是,通过 MPI.Info 对象设置的 hints 的键和值都是字符串。

I/O 相关 hints 方法

MPI.File.Set_info(self, Info info)

通过 MPI.Info 对象向 MPI 实现传递 I/O 相关的 hints。

MPI.File.Get_info(self)

获取当前文件正在使用的 hints,返回值是一个 MPI.Info 对象。

MPI 预留的 I/O 相关 hints

下表列出了 MPI 预留的 I/O 相关的 hints,这些 hints 主要影响并行文件的访问模式,指导文件在 I/O 设备上的布局。

名称 类型 一致性 说明
access_style 逗号分隔的字符串 指出文件访问方式,可能的取值有:read_once,write-once,read_mostly,write_mostly,sequential,reverse_sequential,random
collective_buffering 逻辑(true/false) 指示应用程序是否可以使用集合缓冲机制,集合缓冲机制是由集合访问操作提供的优化措施。此机制下,可指定进程组内某个子集的进程独立访问文件。这些进程可利用缓冲区机制把小的磁盘访问组合起来,形成大的访问动作。集合缓冲访问机制还需其他 hints 配合,分别是:cb_block_size,cb_buffer_size,cb_nodes 等
cb_block_size 整数 指定集合缓冲机制使用的块大小,所有参与集合缓冲机制访问的目标节点(target nodes)都要以该值指定的块大小访问磁盘
cb_buffer_size 整数 用于集合缓冲机制的总缓冲区大小,通常为 cb_block_size 的整数倍
cb_nodes 整数 指定参与集合缓冲机制访问的目标节点数
chunked 逗号分隔的整数 指定访问包含多维数组文件的访问模式,通常为仅访问其中一个子数组。逗号隔开的列表给出数组维数,对 C 语言或 Fortran 语言,列表中的维数次序相反。C 语言中高维在前,低维在后;Fortran 中高维在后,低维在前
chunked_item 逗号分隔的整数 以字节为单位指定数组各维维数。指定子数组维数,高维在前,低维在后
filename 字符串 为打开文件指定名称。MPI.File.Open,MPI.File.Set_view,MPI.File.Set_info,MPI.File.Delete 等忽略此关键字
file_perm 字符串 创建文件时指定许可权限。仅当用于 MPI.File.Open 且其打开模式 amode 包含 MPI.MODE_CREATE 模式时,该关键字才起作用。具体合法值取决于 MPI 版本的定义
io_node_list 逗号分隔的字符串 指定用于存储文件的 I/O 设备列表。通常在创建文件时使用
nb_proc 整数 指定可访问文件的并行进程个数。主要用于创建文件时
num_io_nodes 整数 指定系统中 I/O 设备个数。主要用于创建文件时
striping_factor 整数 指定文件条块化时一个文件跨设备存储的 I/O 设备个数。仅在创建文件时使用
striping_unit 整数 文件条块化分割的单位,即在把文件从一个 I/O 设备切换到下一个 I/O 设备时的最大数据块容量。仅在创建文件时使用

不同的 MPI 实现可能还有额外的 hints,用户应该查阅其相关文档以了解其可用的 hints 及这些 hints 的作用。

例程

下面给出使用例程。

# io_hints.py

"""
Demonstrates how to pass I/O related hints to the implementation.

Run this with 4 processes like:
$ mpiexec -n 4 python io_hints.py
"""

import numpy as np
from mpi4py import MPI


comm = MPI.COMM_WORLD
rank = comm.Get_rank()

buf = np.full((5,), rank, dtype='i')

filename = 'temp.txt'

# create a MPI.Info object
info = MPI.Info.Create()
# set some MPI predefined hints
# number of I/O devices across which the file should be striped
info['striping_factor'] = '16'
# the striping unit in bytes
info['striping_unit'] = '1048576'
# buffer size for collective I/O
info['cb_buffer_size'] = '8388608'
# number of processes that should perform disk accesses during collective I/O
info['cb_nodes'] = '%d' % comm.size
# set some additional hints supported by ROMIO
# buffer size for data sieving in independent reads
info['ind_rd_buffer_size'] = '2097152'
# buffer size for data sieving in independent writes
info['ind_wr_buffer_size'] = '1048576'

# open the file for read and write, create it if it does not exist,
# and delete it on close, with the info object defined above
fh = MPI.File.Open(comm, filename, amode= MPI.MODE_CREATE | MPI.MODE_RDWR | MPI.MODE_DELETE_ON_CLOSE, info=info)

# free the info object
info.Free()

# get the currently used hints
info_used = fh.Get_info()
if rank == 0:
    for k in info_used:
        print '%s: %s' % (k, info_used[k])

# close the file
fh.Close()

运行结果如下:

$ mpiexec -n 4 python io_hints.py
cb_buffer_size: 8388608
romio_cb_read: automatic
romio_cb_write: automatic
cb_nodes: 1
romio_no_indep_rw: false
romio_cb_pfr: disable
romio_cb_fr_types: aar
romio_cb_fr_alignment: 1
romio_cb_ds_threshold: 0
romio_cb_alltoall: automatic
ind_rd_buffer_size: 2097152
ind_wr_buffer_size: 1048576
romio_ds_read: automatic
romio_ds_write: automatic
striping_unit: 1048576
cb_config_list: *:1

以上介绍了 mpi4py 中 I/O 相关的 hints,在下一篇中我们将介绍 mpi4py 中 I/O 操作的一致性语义。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容