mpi4py 中的不连续读/写和集合 I/O 操作

上一篇中我们介绍了 mpi4py 中的简单并行 I/O 操作,下面我们将介绍 mpi4py 中的不连续读/写和集合 I/O 操作。

在前面的介绍中,我们没有设定文件视图,或者说使用了默认的文件视图。MPI 中的文件视图定义文件中对一个进程可见的部分,一个 MPI 读/写操作方法只能操作文件中其可见的部分,而会跳过其不可见的部分。当一个文件刚被打开时,默认情况下,整个文件的内容对打开该文件的进程组中的所有进程都是可见的,MPI 把这个文件当成由连续的二进制字节构成(而不是任何有类型的数据)。文件刚打开时,每个进程的独立文件指针和共享文件指针都被设置成了文件起始位置(即偏移为 0 的位置)。

采用默认文件视图,并且使用上一篇中介绍的 Read/Write 或 Read_at/Write_at 文件读/写方法,每个进程每次只能读/写文件中的一段连续数据。其实这种文件操作功能用普通的 Unix/Linux I/O 读/写函数也能实现,因此并不能体现出 MPI 并行 I/O 操作的优势。在实际的并行科学计算应用中,每个进程通常需要读/写很多处于文件中不同位置的很多小的连续数据块。当然可以使用前面介绍的读/写方法每次读/写一个这种小的数据块,但是由于 I/O 操作本身高的时延,这种操作是非常低效和费时的。MPI 提供了更高效的操作方法,允许使用一次函数调用读/写不连续的数据块。如果将这种操作方式和集合 I/O 结合起来,则能进一步提高 I/O 操作性能。因为这种组合可以给 MPI 实现提供足够的信息使其知道有哪些进程在同时读/写文件及文件中所有会被同时读/写到的数据。MPI 实现可以利用这些信息对该 I/O 操作实施一些优化,比如说将各个进程的小的数据块合并成若干大的连续数据块一次性进行操作等,以显著地提高程序的 I/O 性能。

MPI 的不连续读/写功能是使用文件视图结合相应的读/写函数实现的,下面我们首先介绍文件视图相关方法。

文件视图和不连续读/写

MPI.File.Set_view(self, Offset disp=0, Datatype etype=None, Datatype filetype=None, datarep=None, Info info=INFO_NULL)

MPI.File.Get_view(self)

上面两个方法在前面已经作过介绍,这里不再赘述。这里只强调几点:设置文件视图的操作是一个集合操作,必须打开文件的进程组中的所有进程一起参与。当使用独立文件指针或显式偏移地址方法时,每个进程可以根据需要设置一个不同的文件视图;但是当使用共享文件指针时,所有的进程必须设置一个同样的视图。在程序中文件视图可以多次重新设置。当一个文件被打开后,如果不设置其文件视图,则会使用默认的文件视图:即初始偏移 disp 为 0,etypefiletype 都为 MPI.BYTE。

下面这张图给出了文件视图的一个例子:disp 为 5 × 4 字节,etype 为 MPI.INT,filetype 为 2 个整数加 4 个整数大小的一段空隙。如果某个进程设置了以上文件视图,则该进程只能读/写到文件中如上图阴影部分的数据,其它位置的数据会被跳过。在下面的例程中,我们将展示如何设置这样的文件视图,及如果利用此文件视图结合上一篇中介绍的文件读/写方法一次性向文件写入或者从文件读取大量不连续的数据。

文件视图举例

下面是上一篇中介绍的文件读/写方法的集合操作版本。

集合操作

独立文件指针

MPI.File.Read_all(self, buf, Status status=None)

MPI.File.Read 的集合操作版本,参数也相同,不同之处在于该方法必须被打开该文件的进程组中的进程一起调用,而 MPI.File.Read 则可以被某个或某几个进程调用而无需其它进程一起参与。该方法也是使用独立文件指针的阻塞调用。

MPI.File.Write_all(self, buf, Status status=None)

MPI.File.Write 的集合操作版本,参数也相同,不同之处在于该方法必须被打开该文件的进程组中的进程一起调用,而 MPI.File.Write 则可以被某个或某几个进程调用而无需其它进程一起参与。该方法也是使用独立文件指针的阻塞调用。

显式偏移地址

MPI.File.Read_at_all(self, Offset offset, buf, Status status=None)

MPI.File.Read_at 的集合操作版本,参数也相同,不同之处在于该方法必须被打开该文件的进程组中的进程一起调用,而 MPI.File.Read_at 则可以被某个或某几个进程调用而无需其它进程一起参与。该方法也是使用显式偏移地址的阻塞调用。

MPI.File.Write_at_all(self, Offset offset, buf, Status status=None)

MPI.File.Write_at 的集合操作版本,参数也相同,不同之处在于该方法必须被打开该文件的进程组中的进程一起调用,而 MPI.File.Write_at 则可以被某个或某几个进程调用而无需其它进程一起参与。该方法也是使用显式偏移地址的阻塞调用。

例程

下面给出使用例程。

# noncontig_io.py

"""
Demonstrates the usage of noncontiguous accesses and collective I/O.

Run this with 3 processes like:
$ mpiexec -n 3 python noncontig_io.py
"""

import numpy as np
from mpi4py import MPI


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

buf1 = np.arange(10, dtype='i')
buf2 = np.zeros(10, dtype='i') # initialize to all zeros

filename = 'temp.txt'

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

# displacement in bytes of each process
disp = (5 + rank * 2) * MPI.INT.Get_size()
# the etype
etype = MPI.INT

# construct filetype, which consists of 2 ints and a gap of 4 ints
INT2 = MPI.INT.Create_contiguous(2)
filetype = INT2.Create_resized(0, 6*MPI.INT.Get_size())
filetype.Commit()

# set the file view, which is a collective operation
fh.Set_view(disp, etype, filetype)

if rank == 0:
    # rank 0 writes buf1 to the file
    # the 10 interges will be writen into noncontiguous positions
    # in the file with a single write call
    fh.Write(buf1)
    # rank 0 reads data from file to buf2
    # 10 interges in noncontiguous positions of the file will be read
    # with a single read call
    fh.Read_at(0, buf2)
    print 'buf2:', buf2

# use collective I/O method
# first reset the individual file pointer to the beginning of the file
fh.Seek(0, whence=MPI.SEEK_SET)

# collectively write the data to file
fh.Write_all(buf1)

# reset the file view for read, which is a collective operation
fh.Set_view(disp, etype, etype)

# check what's in the file
if rank == 0:
    buf3 = np.zeros(30, dtype='i') # initialize to all zeros
    fh.Seek(0, whence=MPI.SEEK_SET)
    fh.Read(buf3)
    print 'buf3:', buf3
    # buf3: [0 1 0 1 0 1 2 3 2 3 2 3 4 5 4 5 4 5 6 7 6 7 6 7 8 9 8 9 8 9]
    # rank 0 ---         ---         ---         ---         ---
    # rank 1     ---         ---         ---         ---         ---
    # rank 2         ---         ---         ---         ---         ---

# close the file
fh.Close()

运行结果如下:

$ mpiexec -n 3 python noncontig_io.py
buf2: [0 1 2 3 4 5 6 7 8 9]
buf3: [0 1 0 1 0 1 2 3 2 3 2 3 4 5 4 5 4 5 6 7 6 7 6 7 8 9 8 9 8 9]

以上介绍了 mpi4py 中的不连续读/写和集合 I/O 操作,在下一篇中我们将介绍 mpi4py 中读/写文件中数组的方法。

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

推荐阅读更多精彩内容

  • 在上一篇中我们介绍了 mpi4py 中的 memory 对象及内存操作,下面我们将介绍 mpi4py 中的简单并行...
    自可乐阅读 1,739评论 0 2
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,455评论 25 707
  • 窗前独怅,苦酒独醉灌。 不觉傍晚至,雨淅沥。 夜凉,添几许,惆怅。 夜深人静独月下,闻雨声,忽惊醒。 细闻小雨淅沥...
    红尘z阅读 188评论 10 5
  • 从前有一种叫做寒号鸟的珍稀动物,在夏天全身披着美丽的羽毛,唱着歌,冬天到了,就会说“哆哆哆,寒风冻死我,明天就筑窝...
    洞庭府君阅读 235评论 0 2