mpi4py 中的數(shù)據(jù)類型解析

上一篇中我們介紹了 mpi4py 中的通用化請求,下面我們將介紹 mpi4py 中的數(shù)據(jù)類型解析。

通過自定義數(shù)據(jù)類型,應(yīng)用程序可任意指定數(shù)據(jù)在內(nèi)存中的布局。在 MPI-1 中,一旦確定了數(shù)據(jù)類型定義,則定義的具體細節(jié)將無從獲取。某些情況下,在數(shù)據(jù)類型定義完之后,仍有必要訪問其定義流程、數(shù)據(jù)布局等信息,為此 MPI-2 提供了一些函數(shù)來解析定義數(shù)據(jù)類型過程的信息,如數(shù)據(jù)類型圖,數(shù)據(jù)類型描述等。

方法接口

MPI.Datatype.Get_envelope(self)

獲取創(chuàng)建數(shù)據(jù)類型的參數(shù)數(shù)量信息,返回值為一個 (num_integers, num_addresses, num_datatypes, combiner) 的四元 tuple,其中 num_integers 是數(shù)據(jù)類型創(chuàng)建函數(shù)使用整型參數(shù)的個數(shù),num_addresses 是數(shù)據(jù)類型創(chuàng)建函數(shù)使用地址型參數(shù)的個數(shù),num_datatypes 是數(shù)據(jù)類型創(chuàng)建函數(shù)使用原始數(shù)據(jù)類型的個數(shù),combiner 是數(shù)據(jù)創(chuàng)建函數(shù)的類型,下表是常用的 combiner 取值和數(shù)據(jù)類型創(chuàng)建函數(shù)的對應(yīng)關(guān)系:

combiner 取值 對應(yīng)的數(shù)據(jù)類型創(chuàng)建函數(shù)
MPI.COMBINER_NAMED MPI 預(yù)定義數(shù)據(jù)類型,已命名
MPI.COMBINER_DUP MPI.Datatype.Dup
MPI.COMBINER_CONTIGUOUS MPI.Datatype.Create_contiguous
MPI.COMBINER_VECTOR MPI.Datatype.Create_vector
MPI.COMBINER_HVECTOR MPI.Datatype.Create_hvector
MPI.COMBINER_INDEXED MPI.Datatype.Create_indexed
MPI.COMBINER_INDEXED_BLOCK MPI.Datatype.Create_indexed_block
MPI.COMBINER_HINDEXED MPI.Datatype.Create_hindexed
MPI.COMBINER_HINDEXED_BLOCK MPI.Datatype.Create_hindexed_block
MPI.COMBINER_STRUCT MPI.Datatype.Create_struct
MPI.COMBINER_SUBARRAY MPI.Datatype.Create_subarray
MPI.COMBINER_DARRAY MPI.Datatype.Create_darray
MPI.COMBINER_F90_REAL MPI.Datatype.Create_f90_real
MPI.COMBINER_F90_COMPLEX MPI.Datatype.Create_f90_complex
MPI.COMBINER_F90_INTEGER MPI.Datatype.Create_f90_integer
MPI.COMBINER_RESIZED MPI.Datatype.Create_resized
MPI.Datatype.Get_contents(self)

獲取創(chuàng)建數(shù)據(jù)類型的實際參數(shù)信息,返回值是一個 (array_of_integers, array_of_addresses, array_of_datatypes) 的三元 tuple,其中 array_of_integers 是一個整數(shù)列表,包含創(chuàng)建數(shù)據(jù)類型所使用的所有整型參數(shù),array_of_addresses 是一個整數(shù)列表,包含創(chuàng)建數(shù)據(jù)類型所使用的所有地址型參數(shù),array_of_datatypes 是一個數(shù)據(jù)類型列表,包含創(chuàng)建數(shù)據(jù)類型所使用的所有原始數(shù)據(jù)類型參數(shù)。

注意:該方法只能在未命名的自定義數(shù)據(jù)類型上調(diào)用,否則會拋出 MPI.Exception。

MPI.Datatype.decode(self)

更方便的數(shù)據(jù)類型解析方法,會根據(jù)不同的數(shù)據(jù)類型返回不同的方便解讀的信息。

屬性

envelope

結(jié)果同 MPI.Datatype.Get_envelope 的返回值。

contents

結(jié)果同 MPI.Datatype.Get_contents 的返回值。

combiner

結(jié)果同 MPI.Datatype.Get_envelope 的返回值的最后一個元素。

is_named

是否是 MPI 預(yù)定義的已命名數(shù)據(jù)類型。

is_predefined

是否是 MPI 預(yù)定義數(shù)據(jù)類型。對 MPI 預(yù)定義的已命名數(shù)據(jù)類型,以及 MPI_DATATYPE_NULL,MPI_COMBINER_F90_INTEGER,MPI_COMBINER_F90_REAL,MPI_COMBINER_F90_COMPLEX 都返回 True。

name

數(shù)據(jù)類型的名稱。

例程

下面給出使用例程。

# decoding.py

"""
Demonstrates the usage of datatype decoding.

Run this with 1 processes like:
$ mpiexec -n 1 python decoding.py
or
$ python decoding.py
"""

from mpi4py import MPI


comm = MPI.COMM_WORLD

Int = MPI.INT
Ihvec = MPI.INT.Create_hvector(2, 3, 4*4)
Ihvec4 = Ihvec.Create_contiguous(4)

for dtyp, typ_name in [ (Int, 'MPI.INT'), (Ihvec, 'Ihvec'), (Ihvec4, 'Ihvec4') ]:
    print '%s.Get_envelope: %s' % (typ_name, dtyp.Get_envelope())
    print '%s.envelope: %s' % (typ_name, dtyp.envelope)
    print '%s.combiner: %s' % (typ_name, dtyp.combiner)
    try:
        print '%s.Get_contents: %s' % (typ_name, dtyp.Get_contents())
        print '%s.contents: %s' % (typ_name, dtyp.contents)
    except MPI.Exception as e:
        print e.error_string
    print '%s.decode: %s' % (typ_name, dtyp.decode())
    print '%s.is_named: %s' % (typ_name, dtyp.is_named)
    print '%s.is_predefined: %s' % (typ_name, dtyp.is_predefined)
    print '%s.name: %s' % (typ_name, dtyp.name)
    print

運行結(jié)果如下:

$ python decoding.py
MPI.INT.Get_envelope: (0, 0, 0, 0)
MPI.INT.envelope: (0, 0, 0, 0)
MPI.INT.combiner: 0
MPI_ERR_INTERN: internal error
MPI.INT.decode: <mpi4py.MPI.Datatype object at 0x7f6d3fd5b2f0>
MPI.INT.is_named: True
MPI.INT.is_predefined: True
MPI.INT.name: MPI_INT

Ihvec.Get_envelope: (2, 1, 1, 5)
Ihvec.envelope: (2, 1, 1, 5)
Ihvec.combiner: 5
Ihvec.Get_contents: ([2, 3], [16], [<mpi4py.MPI.Datatype object at 0x7f6d3fd5bb90>])
Ihvec.contents: ([2, 3], [16], [<mpi4py.MPI.Datatype object at 0x7f6d3fd5bb90>])
Ihvec.decode: (<mpi4py.MPI.Datatype object at 0x7f6d3fd5bb90>, 'HVECTOR', {'count': 2, 'blocklength': 3, 'stride': 16})
Ihvec.is_named: False
Ihvec.is_predefined: False
Ihvec.name:

Ihvec4.Get_envelope: (1, 0, 1, 2)
Ihvec4.envelope: (1, 0, 1, 2)
Ihvec4.combiner: 2
Ihvec4.Get_contents: ([4], [], [<mpi4py.MPI.Datatype object at 0x7f6d3fd5bb90>])
Ihvec4.contents: ([4], [], [<mpi4py.MPI.Datatype object at 0x7f6d3fd5bb90>])
Ihvec4.decode: (<mpi4py.MPI.Datatype object at 0x7f6d3fd5bb90>, 'CONTIGUOUS', {'count': 4})
Ihvec4.is_named: False
Ihvec4.is_predefined: False
Ihvec4.name:

以上介紹了 mpi4py 中的數(shù)據(jù)類型解析,在下一篇中我們將介紹 mpi4py 中的 Op 對象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,291評論 25 708
  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,223評論 3 119
  • 將手中的筆作為槳 在時間的河上劃過 坐在孤獨的小舟上 看悲傷如平靜般 是燈火里默不作聲的凄涼 在黑夜的一片燈海 等...
    黑犬喜喜哥欠閱讀 503評論 0 7
  • 【點石成金】20170628 學(xué)習力6 Day44 今天買的磁力片到了。寶寶從外面回來就看到了,吃飯前玩了...
    葉子ya豆子閱讀 175評論 0 0
  • 人除了按男女性別分類外,還有很多種分類方式,如,按年齡段分老年人、中年人、青年人、兒童、幼兒;按國籍分中國人、美...
    nicesifang閱讀 407評論 0 1

友情鏈接更多精彩內(nèi)容