fortran mpi如何定义mpi数据类型

fortran mpi如何定义mpi数据类型,第1张

MPI在定义数据类型时仅定义了Fortran内置的标准数据类型如integer、real、character、double precesion等,而对于Fortran90所提供的派生数据类型(即type命令定义的结构数据类型)没有提供。这种派生数据类型属于不连续数据,在此种类型中往往包含多种标准数据类型和数组。

在MPI中进行这种派生数据类型的发送和接收时通常有两种处理方式,一种就是利用MPI提供的创建派生数据类型的命令新建与Fortran90程序中已经定义好的派生数据类型一样的数据结构,然后生成一种MPI的派生类型,最后再传递这种MPI的派生数据类型;另外一种方法就是对数据进行封包发送,然后在接收端再解包。最近研究了一下前面一种方法,这里简单介绍一下使用经验。

比如在Fortran90程序中定义如下派生数据类型:

type type_global !INT(5+5),character(210),real(3),real8(2)

integer npoin,nelem,ngroup,nmat,nblks

real x,y,z

real8 x8,y8

integer icmatrix(5)

character20 outplot,type_abc

end type type_global

在这种派生数据类型中包含有四种标准数据类型,即整型(10个,包括5个标量和1个含5个元素的数组)、实型(3个)、双精度实型(3个)、字符串型(2个,每个20个字符)。为了传递这种派生类型数据,首先要把它的数据结构定义成一个MPI派生类型,要用到两个MPI命令,即MPI_TYPE_STRUCT和MPI_TYPE_COMMIT,前者用来定义派生数据结构,后者用来提交确认。MPI_TYPE_STRUCT的调用格式如下:

call MPI_TYPE_STRUCT(ndatatype,blocklens_global,offsets_global,oldtypes_global, &

type_global_MPI,ierr)

说明如下:

ndatatype为整型变量,其值为派生数据类型里所包含的标准类型个数(本例中将相同的标准类型数据进行合并),此例子中的值为4,即整型、字符串型、实型和双精度实型;

blocklens_global(0:3)为ndatatype个元素的整型数组,每个元素的值为此派生类型中相应标准数据类型的个数,若以整型、字符串型、实型、双精度实型为顺序,则此数组值为[10,2,3,2];

offsets_global(0:3)为ndatatype个元素的整型数组,每个元素的值为此派生类型中相应标准数据类型的位移偏移,这个需要有派生类型数据结构的类型表的相关知识。简单来说,就是在此派生类型中,第1种标准类型(整型)的位移偏移为0,第2种标准类型(字符串型)的位移偏移应该为前一种(第1种)标准类型的个数乘标准类型在内存中所占的字节数(4字节10个=40),第3种和第4种标准类型的位移偏移以同样的方法计算。在此例中值为[0,40,80,92],在Fortran90中默认整型点4字节,实型占4字节,双精度实型占8字节,字符串按其长度,一个字符占一个字节来计算。

oldtypes_global(0:3)为ndatatype个元素的整型数组,每个元素的值为此派生类型中相应标准数据类型的MPI类型,按上面的顺序,其值应该为[MPI_INTEGER,MPI_CHARACTER,MPI_REAL,MPI_DOUBLE_PRECESION]

blocklens_global,offsets_global,oldtypes_global这三个数组中各标准数据类型的顺序要一致,哪种在前哪种在后无所谓,但三个数据中的顺序一定要一致。

type_global_MPI为整型变量,定义完成后就成为MPI可以使用的派生数据类型名,可以像MPI_INTEGER、MPI_REAL等一样使用。

ierr是一个整型变量,都应该知道了。

最后,再用call MPI_TYPE_COMMIT(type_global_MPI,ierr)来提交确认后就可以了,后面再用MPI_SEND和MPI_RECV时就可以使用type_global_MPI作为派生数据类型来传递了。

下面给出一个完整的利用MPI进行Fortran90的派生数据类型传递的代码,主要是用MPI来传递一个派生结构数据,然后在各进程中对其中的数据进行修改,然后再打印出各进程修改后的数据看是否成功。

!==============================================================

program MPI_TypeData_SendRecv

use mpi

character(MPI_MAX_PROCESSOR_NAME) pcname,text20

integer,parameter::ndatatype=4

integer myid,npc,namelen,re,ierr,ver,subver,m,n,status(MPI_STATUS_SIZE),ipc

integer type_block_MPI,type_global_MPI, &

blocklens_global(0:ndatatype-1),offsets_global(0:ndatatype-1), &

oldtypes_global(0:ndatatype-1), &

blocklens_block(0:2),offsets_block(0:2),oldtypes_block(0:2)

integer(8)::extent

type type_global !INT(5+5),character(210),real(3),real8(2)

integer npoin,nelem,ngroup,nmat,nblks

real x,y,z

real8 x8,y8

integer icmatrix(5)

character20 outplot,type_abc

end type type_global

type type_block

integer,allocatable::appear_process(:,:),matno_process(:,:)

end type type_block

type(type_global) GHM_Global,GHM_Global1

type(type_block) GHM_Blocks

call MPI_INIT(ierr)

call MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)

call MPI_COMM_SIZE(MPI_COMM_WORLD,npc,ierr)

btime=MPI_WTIME()

call MPI_GET_PROCESSOR_NAME(pcname,namelen,ierr)

call MPI_GET_VERSION(ver,subver,ieer)

write(,1000)myid,npc,trim(pcname),ver,subver

if(myid==0)then !initial type array in processor 0

GHM_Global%npoin=10;GHM_Global%ngroup=5

GHM_Global%nblks=2

do ipc=1,size(GHM_Global%icmatrix)

GHM_Global%icmatrix(ipc)=ipc-1

enddo

GHM_Global%y=04;GHM_Global%y8=08

GHM_Global%outplot='GID';GHM_Global%type_ABC='VIE'

ngroup=GHM_Global%ngroup

nblks=GHM_Global%nblks

allocate(GHM_Blocks%appear_process(ngroup,nblks), &

GHM_Blocks%matno_process(ngroup,nblks))

GHM_Blocks%appear_process=0;GHM_Blocks%matno_process=0

endif

blocklens_global(0)=10 ! 10 integer

offsets_global(0) =0

oldtypes_global(0) =MPI_INTEGER

call MPI_TYPE_EXTENT(MPI_INTEGER,extent,ierr)

blocklens_global(1)=40 ! 40 character

offsets_global( >

linux mpih一般在哪?MPI(Message Passing Interface),是一种必须和其它程序语言一起使用的一个接口。mpih就是这个接口库的头文件,需要下载并安装这个第三方库,目前主要使用的就是Mpich。1首先进行解压文件openmpi-162targz。 2然后执行cd openmpi-162 3接着执行/configure,一段时间之后发现缺少g++编译器,所以执行sudo apt-get install g++ 4执行完之后再执行一次/configure就可以配置成功, 5执行sudo make all in。Linux下MPI环境的安装配置及MPI程序的编译运行,step by step。

下载MPI安装包

去这里下载一个适合的安装包。

安装包的解压

安装包所在的目录下,运行tar xzvf mpich-xxxtgz。

切换到解压出来的包目录下

cd mpich-xxx

configure配置编译环境,我这里为它选择了一个安装路径。

      这个事网上有攻略,参见:>

1、用网线将西门子S7-1200 PLC和SMART IE 触摸屏都连接到德嘉工控的多功能交换机上。

2、德嘉交换机A型设置如下。

3、对于西门子 SMART LINE 触摸屏,在 WinCC Flexible 中[连接]--〉[接口]选“以太网”、PLC

设备[地址]填入多功能交换机内置 IP 地址 [例如:192168110] ,[循环 *** 作]打对号“V”;另

外 SMART LINE 触屏(HMI)的 IP 地址也应设置在同一段内。

4、在 S7-1200 的编程软件 Portal 中,初始定义 DB 块时, 仅符号访问的选项不要打对号

“v”。

5、连接 V40 以上版本的 PLC 时,需要将博图 V13 中的设备组态--->属性--->连接机制---->

允许从远程伙伴(PLC、HMI、OPC、)使用 PUT/GET 通讯访问打上勾。如下图所示。

以上就是关于fortran mpi如何定义mpi数据类型全部的内容,包括:fortran mpi如何定义mpi数据类型、PLC课程里提到的MPI是什么意思啊、linux mpi.h一般在哪等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9726712.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存