在上一篇中我們介紹了 mpi4py 中的共享文件指針 I/O 操作肴沫,下面我們將介紹 mpi4py 中 I/O 相關(guān)的 hints附较。
MPI 允許用戶為 MPI 實(shí)現(xiàn)傳遞一些 hints。對(duì) I/O 操作沪哺,這是通過(guò)一些 I/O 操作方法的 info
參數(shù)來(lái)進(jìn)行傳遞的牙瓢,這些方法包括 MPI.File.Open,MPI.File.Set_view阅羹,MPI.File.Set_info勺疼,MPI.File.Delete 等。默認(rèn)情況下捏鱼,這些方法的 info
參數(shù)都為 MPI.INFO_NULL执庐,表示用戶不傳遞任何 hints 給 MPI 實(shí)現(xiàn)。當(dāng)需要傳遞一些 hints 時(shí)穷躁,可通過(guò) MPI.Info 對(duì)象為文件指定一些如文件訪問(wèn)模式耕肩、文件系統(tǒng)相關(guān)的附加信息(即與 I/O 相關(guān)的 hints),并利用這些信息優(yōu)化 I/O 訪問(wèn)性能问潭,減少系統(tǒng)資源占用等猿诸。MPI 實(shí)現(xiàn)可以選擇忽略某些或所有用戶傳遞的 hints 而不會(huì)影響程序的正確性。需要注意的是狡忙,通過(guò) MPI.Info 對(duì)象設(shè)置的 hints 的鍵和值都是字符串梳虽。
I/O 相關(guān) hints 方法
MPI.File.Set_info(self, Info info)
通過(guò) MPI.Info 對(duì)象向 MPI 實(shí)現(xiàn)傳遞 I/O 相關(guān)的 hints。
MPI.File.Get_info(self)
獲取當(dāng)前文件正在使用的 hints灾茁,返回值是一個(gè) MPI.Info 對(duì)象窜觉。
MPI 預(yù)留的 I/O 相關(guān) hints
下表列出了 MPI 預(yù)留的 I/O 相關(guān)的 hints,這些 hints 主要影響并行文件的訪問(wèn)模式北专,指導(dǎo)文件在 I/O 設(shè)備上的布局禀挫。
名稱 | 類(lèi)型 | 一致性 | 說(shuō)明 |
---|---|---|---|
access_style | 逗號(hào)分隔的字符串 | 否 | 指出文件訪問(wèn)方式,可能的取值有:read_once拓颓,write-once语婴,read_mostly,write_mostly驶睦,sequential砰左,reverse_sequential,random |
collective_buffering | 邏輯(true/false) | 是 | 指示應(yīng)用程序是否可以使用集合緩沖機(jī)制场航,集合緩沖機(jī)制是由集合訪問(wèn)操作提供的優(yōu)化措施缠导。此機(jī)制下,可指定進(jìn)程組內(nèi)某個(gè)子集的進(jìn)程獨(dú)立訪問(wèn)文件溉痢。這些進(jìn)程可利用緩沖區(qū)機(jī)制把小的磁盤(pán)訪問(wèn)組合起來(lái)僻造,形成大的訪問(wèn)動(dòng)作憋他。集合緩沖訪問(wèn)機(jī)制還需其他 hints 配合,分別是:cb_block_size嫡意,cb_buffer_size举瑰,cb_nodes 等 |
cb_block_size | 整數(shù) | 是 | 指定集合緩沖機(jī)制使用的塊大小,所有參與集合緩沖機(jī)制訪問(wèn)的目標(biāo)節(jié)點(diǎn)(target nodes)都要以該值指定的塊大小訪問(wèn)磁盤(pán) |
cb_buffer_size | 整數(shù) | 是 | 用于集合緩沖機(jī)制的總緩沖區(qū)大小蔬螟,通常為 cb_block_size 的整數(shù)倍 |
cb_nodes | 整數(shù) | 是 | 指定參與集合緩沖機(jī)制訪問(wèn)的目標(biāo)節(jié)點(diǎn)數(shù) |
chunked | 逗號(hào)分隔的整數(shù) | 是 | 指定訪問(wèn)包含多維數(shù)組文件的訪問(wèn)模式,通常為僅訪問(wèn)其中一個(gè)子數(shù)組汽畴。逗號(hào)隔開(kāi)的列表給出數(shù)組維數(shù)旧巾,對(duì) C 語(yǔ)言或 Fortran 語(yǔ)言,列表中的維數(shù)次序相反忍些。C 語(yǔ)言中高維在前鲁猩,低維在后;Fortran 中高維在后罢坝,低維在前 |
chunked_item | 逗號(hào)分隔的整數(shù) | 是 | 以字節(jié)為單位指定數(shù)組各維維數(shù)廓握。指定子數(shù)組維數(shù),高維在前嘁酿,低維在后 |
filename | 字符串 | 否 | 為打開(kāi)文件指定名稱隙券。MPI.File.Open,MPI.File.Set_view闹司,MPI.File.Set_info娱仔,MPI.File.Delete 等忽略此關(guān)鍵字 |
file_perm | 字符串 | 是 | 創(chuàng)建文件時(shí)指定許可權(quán)限。僅當(dāng)用于 MPI.File.Open 且其打開(kāi)模式 amode 包含 MPI.MODE_CREATE 模式時(shí)游桩,該關(guān)鍵字才起作用牲迫。具體合法值取決于 MPI 版本的定義 |
io_node_list | 逗號(hào)分隔的字符串 | 是 | 指定用于存儲(chǔ)文件的 I/O 設(shè)備列表。通常在創(chuàng)建文件時(shí)使用 |
nb_proc | 整數(shù) | 是 | 指定可訪問(wèn)文件的并行進(jìn)程個(gè)數(shù)借卧。主要用于創(chuàng)建文件時(shí) |
num_io_nodes | 整數(shù) | 是 | 指定系統(tǒng)中 I/O 設(shè)備個(gè)數(shù)盹憎。主要用于創(chuàng)建文件時(shí) |
striping_factor | 整數(shù) | 是 | 指定文件條塊化時(shí)一個(gè)文件跨設(shè)備存儲(chǔ)的 I/O 設(shè)備個(gè)數(shù)。僅在創(chuàng)建文件時(shí)使用 |
striping_unit | 整數(shù) | 是 | 文件條塊化分割的單位铐刘,即在把文件從一個(gè) I/O 設(shè)備切換到下一個(gè) I/O 設(shè)備時(shí)的最大數(shù)據(jù)塊容量陪每。僅在創(chuàng)建文件時(shí)使用 |
不同的 MPI 實(shí)現(xiàn)可能還有額外的 hints,用戶應(yīng)該查閱其相關(guān)文檔以了解其可用的 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()
運(yùn)行結(jié)果如下:
$ 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 相關(guān)的 hints,在下一篇中我們將介紹 mpi4py 中 I/O 操作的一致性語(yǔ)義捡遍。