四讲消息传递编程接口MPI课件.ppt

上传人(卖家):晟晟文业 文档编号:4066872 上传时间:2022-11-08 格式:PPT 页数:40 大小:548.16KB
下载 相关 举报
四讲消息传递编程接口MPI课件.ppt_第1页
第1页 / 共40页
四讲消息传递编程接口MPI课件.ppt_第2页
第2页 / 共40页
四讲消息传递编程接口MPI课件.ppt_第3页
第3页 / 共40页
四讲消息传递编程接口MPI课件.ppt_第4页
第4页 / 共40页
四讲消息传递编程接口MPI课件.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

1、第四讲消息传递编程接口MPI主要内容主要内容u MPI 程序基本结构程序基本结构 q MPI 编程基础编程基础q MPI 安装、程序编译与运行安装、程序编译与运行 u MPI 数据类型数据类型u 消息发送和接收消息发送和接收u MPI 一些常用函数一些常用函数MPI 下载与安装下载与安装q MPICH 下载下载http:/www.mpich.org/q MPICH 的安装的安装l 参考参考 MPICH Install Guideq MPICH 的使用的使用l 参考参考 MPICH User GuideMPI 编程基本概念编程基本概念q MPI 进程进程l MPI 程序中一个独立参与通信的个体程

2、序中一个独立参与通信的个体q MPI 进程组进程组l MPI 程序中由程序中由部分部分或或全部全部进程构成的进程构成的有序集合有序集合l 每个进程都被赋予一个每个进程都被赋予一个所在进程组所在进程组中中唯一唯一的的序号序号(rank),用于在该组中标识该进程,称为用于在该组中标识该进程,称为进程号进程号,取值从,取值从 0 开始开始MPI 进程与通信器进程与通信器q MPI 通信器通信器/通信子(通信子(Communicator)l MPI 程序中进程间的通信程序中进程间的通信必须必须通过通信器进行通过通信器进行l 通信器分为通信器分为域内通信器域内通信器(同一进程组内的通信)和(同一进程组内

3、的通信)和域间域间通信器通信器(不同进程组的进程间的通信)(不同进程组的进程间的通信)u MPI 程序中,一个程序中,一个 MPI 进程进程 由一个进程组和在该组中的进程号唯一确定;或由一个进程组和在该组中的进程号唯一确定;或 由一个通信器和在该通信器中的进程号唯一确定由一个通信器和在该通信器中的进程号唯一确定u 进程号是相对进程组或通信器而言的,同一进程在不进程号是相对进程组或通信器而言的,同一进程在不 同的进程组或通信器中可以有不同的进程号同的进程组或通信器中可以有不同的进程号l MPI 程序启动时自动建立两个通信器:程序启动时自动建立两个通信器:MPI_COMM_WORLD :包含程序中

4、所有:包含程序中所有 MPI 进程进程 MPI_COMM_SELF:有单个进程独自构成,仅包含自己:有单个进程独自构成,仅包含自己MPI 消息消息u 进程号是在进程组或通信器被创建时赋予的进程号是在进程组或通信器被创建时赋予的u 空进程:空进程:MPI_PROC_NULLu 与空进程通信时不做任何操作与空进程通信时不做任何操作q 消息(消息(message)l 一个消息指一个消息指进程间进行的一次数据交换进程间进行的一次数据交换l 一个消息由一个消息由通信器、源地址、目的地址、消息标签、通信器、源地址、目的地址、消息标签、和和数据数据构成构成第一个第一个 MPI Fortran 程序程序 pr

5、ogram main include mpif.h character*(MPI_MAX_PROCESSOR_NAME)proc_name integer myid,numprocs,namelen,rc,ierr call MPI_INIT(ierr)call MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)call MPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)call MPI_GET_PROCESSOR_NAME(proc_name,namelen,ierr)write(*,10)myid,numprocs,proc_

6、name10 FORMAT(Hello,I am Proc.,I2,of,I1,on,20A)call MPI_FINALIZE(ierr)endmpif.h 是是MPI相对于相对于FORTRAN的头文件的头文件MPI 程序分析程序分析 所有包含所有包含 MPI 调用的程序调用的程序必须包含必须包含 MPI 头文件头文件 MPI_MAX_PROCESSOR_NAME 是是 MPI 预定义的宏,预定义的宏,即即 MPI 所允许的机器名字的最大长度所允许的机器名字的最大长度 MPI 程序的开始和结束必须是程序的开始和结束必须是 MPI_INIT 和和 MPI_FINALIZE,分别完成,分别完成

7、MPI 的初始化和结束工作的初始化和结束工作 MPI_COMM_RANK 得到本进程的进程号得到本进程的进程号 MPI_COMM_SIZE 得到所有参加运算的进程的个数得到所有参加运算的进程的个数 MPI_GET_PROCESSOR_NAME 得到运行本进程所在的得到运行本进程所在的 结点的主机名结点的主机名 进程号取值范围为进程号取值范围为 0,np-1MPI 程序分析程序分析u 在单个结点在单个结点(c1)上,开上,开 4 个进程的运行结果个进程的运行结果Hello,I am Proc.1 of 4 on c1Hello,I am Proc.0 of 4 on c1Hello,I am P

8、roc.2 of 4 on c1Hello,I am Proc.3 of 4 on c1u 在四个结点上,开在四个结点上,开 4 个进程的运行结果个进程的运行结果Hello,I am Proc.1 of 4 on c1Hello,I am Proc.0 of 4 on c2Hello,I am Proc.2 of 4 on c4Hello,I am Proc.3 of 4 on c3MPI 程序执行过程程序执行过程启动编译生成的可执行文件启动编译生成的可执行文件 hello进程进程 0MPI_INITMPI_COMM_RANKmyid=0MPI_GET_PROCESSOR_NAMEproc_n

9、ame=c1namelen=2Writehello,I am proc.0 of 4 on c1MPI_FINALIZE进程进程 3MPI_INITMPI_COMM_RANKmyid=4MPI_GET_PROCESSOR_NAMEproc_name=c1namelen=2Writehello,I am proc.3 of 4 on c1MPI_FINALIZE 程序运行结束程序运行结束 进程进程 1进程进程 2第一个第一个 MPI C 程序程序#include mpi.h#include#include int main(argc,argv)int argc;char*argv;int myi

10、d,np;int namelen;char proc_nameMPI_MAX_PROCESSOR_NAME;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Get_processor_name(proc_name,&namelen);fprintf(stderr,Hello,I am proc.%d of%d on%sn,myid,np,proc_name);MPI_Finalize();mpi.h 是是 MPI 相对于相对于C语言的头文件

11、语言的头文件MPI 编程的一些惯例编程的一些惯例l MPI 的所有常量、变量与函数的所有常量、变量与函数/过程均以过程均以 MPI_ 开头开头l MPI 的的 C 语言接口为函数,语言接口为函数,FORTRAN 接口为接口为 SUBROUTINE,且对应接口的名称相同,且对应接口的名称相同l 在在 C 程序中,所有常数的定义除下划线外一律由大写字母程序中,所有常数的定义除下划线外一律由大写字母 组成,在函数和数据类型定义中组成,在函数和数据类型定义中,接接 MPI_ 之后的第一个字之后的第一个字 母大写,其余全部为小写字母,即母大写,其余全部为小写字母,即 MPI_Xxxx_xxx 形式形式l

12、 对于对于 FORTRAN 程序,程序,MPI 函数全部以过程方式调用,函数全部以过程方式调用,一般全用大写字母表示,即一般全用大写字母表示,即 MPI_XXXX_XXX 形式形式 (FORTRAN 不区分大小写)不区分大小写)l 除除 MPI_WTIME 和和 MPI_WTICK 外,所有外,所有 C 函数调用之后函数调用之后 都将返回一个错误信息码,而都将返回一个错误信息码,而 MPI 的所有的所有 FORTRAN 子子 程序中都有一个哑元参数(程序中都有一个哑元参数(IERR)代表错误码)代表错误码MPI 编程的一些惯例编程的一些惯例l 由于由于 C 语言的函数调用机制是值传递,所以语言

13、的函数调用机制是值传递,所以 MPI 的所有的所有 C 函数中的函数中的输出参数输出参数用的都是用的都是指针指针l MPI 是按进程组是按进程组(Process Group)方式工作:方式工作:所有所有 MPI 程序在开始时均被认为是在通信器程序在开始时均被认为是在通信器 MPI_COMM_WORLD 所拥有的进程组中工作,所拥有的进程组中工作,之后用户可以根据自己的需要,建立其它的进程组之后用户可以根据自己的需要,建立其它的进程组l 所有所有 MPI 的通信一定要在的通信一定要在通信器通信器中进行中进行l FORTRAN 的数组下标缺省以的数组下标缺省以 1 开始,开始,而而 C 语言的数组

14、是以语言的数组是以 0 开始开始MPI 数据类型数据类型u MPI 除了提供除了提供 C 语言函数和语言函数和 FORTRAN子程序子程序之外,还定义了一组常量和之外,还定义了一组常量和 C 变量数据类型变量数据类型 n MPI 常量命名规则:常量命名规则:全部大写全部大写 n MPI 变量数据类型命名规则:变量数据类型命名规则:以以 MPI_ 开头,后面跟开头,后面跟 C 语言或语言或 FORTRAN 原原始数据类型名称始数据类型名称n MPI 数据类型:数据类型:原始数据类型原始数据类型 和和 自定义数据类型自定义数据类型MPI 原始数据类型原始数据类型MPI datatypeFortra

15、n datatypeMPI_INTEGERINTEGERMPI_REALREALMPI_DOUBLE_PRECISIONDOUBLE PRECISIONMPI_COMPLEXCOMPLEXMPI_DOUBLE_COMPLEXDOUBLE COMPLEXMPI_LOGICALLOGICALMPI_CHARACTERCHARACTER(1)MPI_BYTEMPI_PACKEDFORTRAN 77 数据类型数据类型MPI 原始数据类型原始数据类型C 数据类型数据类型MPI datatypeC datatypeMPI_CHARsigned charMPI_SHORTsigned short intMP

16、I_INTsigned intMPI_LONGsigned long intMPI_UNSIGNED_CHARunsigned charMPI_UNSIGNED_SHORTunsigned short intMPI_UNSIGNED_INTunsigned intMPI_UNSIGNED_LONGunsigned long intMPI_FLOATfloatMPI_DOUBLEdoubleMPI_LONG_DOUBLElong doubleMPI_BYTEMPI_PACKEDMPI 原始数据类型原始数据类型附加的附加的MPI数据类型数据类型相应的相应的C数据类型数据类型MPI_LONG_LON

17、G_INT long long int某些某些 MPI 系统还支持一些附加数据类型系统还支持一些附加数据类型附加的附加的MPI数据类型数据类型相应的相应的FORTRAN77数据类型数据类型MPI_REAL2REAL*2MPI_REAL4REAL*4MPI_REAL8REAL*8MPI_INTEGER1INTEGER*1MPI_INTEGER2INTEGER*2MPI_INTEGER4INTEGER*4MPI 最常用的六个接口最常用的六个接口u MPI_INIT u MPI_FINALIZE u MPI_COMM_RANKu MPI_COMM_SIZEu MPI_SENDu MPI_RECVMP

18、I_INITu MPI_INIT:MPI 初始化初始化参数参数无无Cint MPI_Init(int*argc,char*argv)F77MPI_INIT(IERR)INTEGER IERRl 该函数初始化该函数初始化 MPI 并行程序的执行环境,它必须在调用所并行程序的执行环境,它必须在调用所有其它有其它 MPI 函数(除函数(除 MPI_INITIALIZED)之前被调用,并)之前被调用,并且在一个且在一个 MPI 程序中,只能被调用一次程序中,只能被调用一次MPI_FINALIZEu MPI_FINALIZE:结束结束 MPI 系统系统参数参数无无Cint MPI_Finalize(vo

19、id)F77MPI_FINALIZE(IERR)INTEGER IERRl 该函数清除该函数清除 MPI 环境的所有状态。即一但它被调用,所有环境的所有状态。即一但它被调用,所有MPI 函数都不能再调用,其中包括函数都不能再调用,其中包括 MPI_INITMPI_COMM_RANKu MPI_COMM_RANK(comm,rank)参数参数IN comm通信器通信器OUT rank 本进程在通信器本进程在通信器 comm 中的进程号中的进程号Cint MPI_Comm_rank(MPI_Comm comm,int*rank)F77MPI_COMM_RANK(COMM,RANK,IERR)INT

20、EGER COMM,RANK,IERRl 该函数返回本进程在指定通信器中的进程号该函数返回本进程在指定通信器中的进程号MPI_COMM_SIZEu MPI_COMM_SIZE(comm,size)参数参数IN comm通信器通信器OUT size 该通信器该通信器 comm 中的进程数中的进程数Cint MPI_Comm_size(MPI_Comm comm,int*size)F77MPI_COMM_SIZE(COMM,SIZE,IERR)INTEGER COMM,SIZE,IERRl 该函数返回指定通信器所包含的进程数该函数返回指定通信器所包含的进程数MPI_SEND 点对点通信点对点通信u

21、 MPI_SEND(buf,count,datatype,dest,tag,comm)参数参数IN buf 所发送消息的所发送消息的首地址首地址IN count 将发送的数据的个数将发送的数据的个数IN datatype 发送数据的数据类型发送数据的数据类型IN dest 接收消息的进程的标识号接收消息的进程的标识号IN tag 消息标签消息标签IN comm 通信通信器器Cint MPI_Send(void*buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm)F77MPI_SEND(BUF,COUNT,DATA

22、TYPE,DEST,TAG,COMM,IERR)BUF(*)INTEGER COUNT,DATATYPE,DEST,TAG,COMM,IERRMPI_SEND 点对点通信点对点通信MPI_SEND(buf,count,datatype,dest,tag,comm)l 阻塞型消息阻塞型消息发送发送接口接口l MPI_SEND 将缓冲区中将缓冲区中 count 个个 datatype 类型的数据发类型的数据发给进程号为给进程号为 dest 的目的进程。这里的目的进程。这里 count 是元素个数,即是元素个数,即指定数据类型的个数,不是字节数,数据的起始地址为指定数据类型的个数,不是字节数,数据的

23、起始地址为 buf。本次发送的消息标签是本次发送的消息标签是 tag,使用标签的目的是把本次发送,使用标签的目的是把本次发送的消息和本进程向同一目的进程发送的其它消息区别开来。的消息和本进程向同一目的进程发送的其它消息区别开来。其中其中 dest 的取值范围为的取值范围为0np-1(np 表示通信器表示通信器 comm 中的中的进程数进程数)或或 MPI_PROC_NULL,tag 的取值为的取值为 0 MPI_TAG_UBl 该函数可以发送各种类型的数据,如整型、实型、字符等该函数可以发送各种类型的数据,如整型、实型、字符等l 点对点通信是点对点通信是 MPI 通信机制的基础通信机制的基础M

24、PI_RECV 点对点通信点对点通信u MPI_RECV(buf,count,datatype,source,tag,comm,status)参数参数OUT buf 接收接收消息消息数据的首地址数据的首地址IN count 接收接收数据的数据的最大最大个数个数IN datatype 接收接收数据的数据类型数据的数据类型IN source 发送发送消息的进程的标识号消息的进程的标识号IN tag 消息标签消息标签IN comm 通信通信器器OUT status 返回状态返回状态Cint MPI_Recv(void*buf,int count,MPI_Datatype datatype,int s

25、ource,int tag,MPI_Comm comm,MPI_Status*status)F77MPI_RECV(BUF,COUNT,DATATYPE,SOURCE,TAG,COMM,STATUS,IERR)BUF(*)INTEGER COUNT,DATATYPE,SOURCE,TAG,COMM,IERR,STATUS(MPI_STATUS_SIZE)MPI_RECV 点对点通信点对点通信 MPI_RECV(buf,count,datatype,source,tag,comm,status)l 阻塞型消息阻塞型消息接收接收接口接口l 从指定的进程从指定的进程 source 接收不超过接收不超

26、过 count 个个 datatype 类类型的数据,并把它放到缓冲区中,起始位置为型的数据,并把它放到缓冲区中,起始位置为 buf,本次消,本次消息的标识为息的标识为 tag。这里。这里 source 的取值范围为的取值范围为 0 np-1,或,或MPI_ANY_SOURCE,或,或 MPI_PROC_NULL,tag 的取值为的取值为 0MPI_TAG_UB 或或 MPI_ANY_TAGl 接收消息时返回的状态接收消息时返回的状态 STATUS,在,在 C 语言中是用结构定语言中是用结构定义的,在义的,在 FORTRAN 中是用数组定义的,其中包括中是用数组定义的,其中包括 MPI_SOU

27、RCE,MPI_TAG 和和 MPI_ERROR。此外。此外 STATUS 还还包含接收消息元素的个数,但它不是显式给出的,需要用到包含接收消息元素的个数,但它不是显式给出的,需要用到后面给出的函数后面给出的函数 MPI_GET_COUNTMPI 程序示例程序示例例:例:将每个进程中某个数据发送给下一个进程,并从前一个将每个进程中某个数据发送给下一个进程,并从前一个进程接收一个数据,即进程接收一个数据,即 0 号进程给号进程给 1 号进程发送一个数据,号进程发送一个数据,并从并从 np-1 号进程接收一个数据,号进程接收一个数据,1 号进程从号进程从 0 号进程接收号进程接收一个数据,并向一个

28、数据,并向 2 号进程发送一个数据,以此类推。号进程发送一个数据,以此类推。l 实现方式一:实现方式一:0 号进程先发送后接收,其它进程先接收后发送号进程先发送后接收,其它进程先接收后发送l 实现方式二:实现方式二:奇数奇数号进程先发送后接收,号进程先发送后接收,偶数偶数号进程先接收后发送号进程先接收后发送例:例:ex4sendrecv01.f,ex4sendrecv02.f上机作业上机作业在使用阻塞型函数传递消息时要避免死锁!在使用阻塞型函数传递消息时要避免死锁!MPI 发送接收发送接收MPI_SEND(buf,count,datatype,dest,tag,comm)MPI_RECV(bu

29、f,count,datatype,source,tag,comm,status)消息数据消息数据消息数据消息数据消息信封消息信封消息信封消息信封发送数据类型、通信函发送数据类型、通信函数中的数据类型、接收数中的数据类型、接收的数据类型要一致!的数据类型要一致!C:结构:结构status.MPI_SOURCEstatus.MPI_TAGstatus.MPI_ERRORFORTRAN:数组:数组status(MPI_SOURCE)status(MPI_TAG)status(MPI_ERROR)发送与接收组合进行发送与接收组合进行u MPI_SENDRECV(sendbuf,sendcount,se

30、ndtype,dest,sendtag,recvbuf,recvcount,recvtype,source,recvtag,comm,status)参数参数略略Cint MPI_Sendrecv(void*sendbuf,int sendcount,MPI_Datatype sendtype,int dest,int sendtag,void*recvbuf,int recvcount,MPI_Datatype recvtype,int source,int recvtag,MPI_Comm comm,MPI_Status*status)F77MPI_SENDRECV(SENDBUF,SEND

31、COUNT,SENDTYPE,DEST,SENDTAG,RECVBUF,RECVCOUNT,RECVTYPE,SOURCE,RECVTAG,COMM,STATUS,IERR)SENDBUF(*),RECVBUF(*)INTEGER SENDCOUNT,SENDTYPE,DEST,SENDTAG,RECVCOUNT,RECVTYPE,SOURCE,RECVTAG,COMM,IERR,STATUS(MPI_STATUS_SIZE)MPI_SENDRECVu MPI_SENDRECV(sendbuf,sendcount,sendtype,dest,sendtag,recvbuf,recvcount,

32、recvtype,source,recvtag,comm,status)l 这是发送消息和接收消息组合在一起的一个函数,好处是这是发送消息和接收消息组合在一起的一个函数,好处是不用考虑先发送还是先接收消息,从而可以避免消息传递过不用考虑先发送还是先接收消息,从而可以避免消息传递过程中的死锁程中的死锁l sendbuf 和和 recvbuf 必须指向不同的缓冲区必须指向不同的缓冲区例:例:ex4sendrecv03.fMPI_SENDRECV_REPLACEu MPI_SENDRECV_REPLACE(buf,datatype,dest,sendtag,source,recvtag,comm,s

33、tatus)l 功能与功能与 MPI_SENDRECV 类似,但收发消息使用的是同一类似,但收发消息使用的是同一个缓冲区个缓冲区例:例:ex4sendrecv04.fMPI 程序示例程序示例例:例:计算计算 的值。的值。采用等步长中矩形公式,其中采用等步长中矩形公式,其中 n 为积分区间数,为积分区间数,h=1/n 为步长,为步长,xi=(i+0.5)h 为积分区间的中点为积分区间的中点 假设采用假设采用 p 的进程同时计算,各自计算其中的一部分,然的进程同时计算,各自计算其中的一部分,然后再将结果加起来。后再将结果加起来。例:例:ex4pi.f12014 d()1niixhf xx mpif

34、77-Wno-globals o ex4pi ex4pi.fMPI_GET_COUNTu MPI_GET_COUNT(status,datatype,count)参数参数IN status 接收操作的返回状态接收操作的返回状态IN datatype 接收操作使用的数据类型接收操作使用的数据类型OUT count 接收到的数据个数接收到的数据个数Cint MPI_Get_count(MPI_Status*status,MPI_Datatype datatype,int*count)F77MPI_GET_COUNT(STATUS,DATATYPE,COUNT,IERR)INTEGER DATATY

35、PE,COUNT,IERR,STATUS(MPI_STATUS_SIZE)l 查询实际接收到的数据信息查询实际接收到的数据信息MPI 异常终止异常终止u MPI_ABORT(comm,errorcode)参数参数IN comm 通信器通信器OUT errorcode 错误码错误码Cint MPI_Abort(MPI_Comm comm,int errorcode)F77MPI_ABORT(COMM,ERRORCODE,IERR)INTEGER COMM,ERRORCODE,IERRl 异常终止异常终止 MPI 程序的执行,程序的执行,MPI 系统会尽量设法终止通信系统会尽量设法终止通信器中的所

36、有进程器中的所有进程MPI 计时函数计时函数u MPI_WTIME()参数参数无无Cdouble MPI_Wtime(void)F77DOUBLE PRECISION MPI_WTIME()l 该函数返回当前的墙钟时间该函数返回当前的墙钟时间MPI 计时函数计时函数u MPI_WTICK()参数参数无无Cdouble MPI_Wtick(void)F77DOUBLE PRECISION MPI_WTICK()l 该函数返回该函数返回 MPI_WTIME 的时钟精度,单位为秒的时钟精度,单位为秒MPI_WTIME 和和 MPI_WTICK 是是 C 中仅有的两个返回双精度中仅有的两个返回双精度值

37、而非整型错误码的值而非整型错误码的 MPI 函数函数;它们也是;它们也是 FORTRAN 中仅有中仅有的两个的两个 FUNCTION 形式的接口!形式的接口!获取获取结点主机名结点主机名u MPI_GET_PROCESSOR_NAME(name,namelen)l 该函数返回进程所在结点的主机名该函数返回进程所在结点的主机名参数参数OUT name 结点主机名结点主机名OUT namelen 主机名的长度主机名的长度Cint MPI_Get_processor_name(char*name,int*namelen)F77MPI_GET_PROCESSOR_NAME(NAME,NAMELEN,IERR)CHARACTER(*)NAMEINTEGER NAMELEN,IERR获取获取 MPI 版本号版本号u MPI_MPI_GET_VERSION(version,subver)l 该函数返回该函数返回 MPI 的版本号的版本号参数参数OUT version 主版本号主版本号OUT subver 次版本号次版本号Cint MPI_Get_version(int*version,int*subver)F77MPI_GET_VERSION(VERSION,SUBVER,IERR)INTEGER VERSION,SUBVER,IERR

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(四讲消息传递编程接口MPI课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|