Fortran Coder

查看: 5129|回复: 0
打印 上一主题 下一主题

[并行] mpi并行存储单个文件的共享文件指针法?

[复制链接]

32

帖子

9

主题

0

精华

专家

F 币
391 元
贡献
212 点
跳转到指定楼层
楼主
发表于 2020-3-27 22:01:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初步学些fortran mpi 并行编程,采用的工具为vs2010+ivf2011 已经构造好mpi环境,并且已经测试通过了 hello world
今天学习并行存储单个文件
思路:
            将两个测试变量
             It=271      
             RR=2.5811919e+3
            按照进程数目依次存入输入单个文件,
            一个进程  结果应为 271 0.25811919E+04
           两个进程  结果应为 271 0.25811919E+04
                                         271 0.25811919E+04
          一次类推 到n个进程的情形
初步尝试采用独立文件指针方式来完成算法设计
  代码如下
[Fortran] 纯文本查看 复制代码
  ! example of parallel  MPI write into a single file ,in fortran 独立文件指针
        PROGRAM main
        include 'mpif.h'
        integer ierr, i, BUFSIZE, thefile,intsize,realsize
        integer(kind=MPI_OFFSET_KIND) disp
        character * (MPI_MAX_PROCESSOR_NAME) processor_name
        integer myrank, numprocs, namelen, rc
        call MPI_INIT(ierr)!mpi初始化
        call MPI_COMM_RANK(MPI_COMM_WORLD, myrank, ierr) 
        call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )    
        call MPI_GET_PROCESSOR_NAME(processor_name, namelen, ierr)
        write(*,10) myrank,numprocs,processor_name 
10    FORMAT('Hello World! Process ',I2,' of ',I1,' on ', 20A)

            !两个测试变量
             It=271       
             RR=2.5811919e+3

              if(myrank==0)then
               Write( * , 150 ) It,RR
  150        FORMAT('input int number =',I,' input real number=',e15.8)
             end if

        !打开一个二进制文件
        call MPI_FILE_OPEN(MPI_COMM_WORLD, 'testfile', 
     & MPI_MODE_WRONLY+MPI_MODE_CREATE, MPI_INFO_NULL, thefile, ierr)
        call MPI_TYPE_SIZE(MPI_INTEGER, intsize, ierr) !整型变量
        call MPI_TYPE_SIZE(MPI_real, realsize, ierr)          !浮点数变量
         if (myrank==0) then
          write(*,100) intsize,realsize
100   FORMAT('Bytes of MPI_INTEGER=',I2,' Bytes of MPI_real= 'I2)
        end if
       ! 计算各个进程之间的绝对偏移量
        disp = myrank*(intsize+realsize)
        !设置绝对偏移量
        call MPI_FILE_SET_VIEW(thefile, disp, MPI_INTEGER, MPI_INTEGER,
     & 'native', MPI_INFO_NULL, ierr) 
          !写入第一个数据  
           call MPI_FILE_WRITE(thefile, It, 1,MPI_INTEGER,
     &   MPI_STATUS_IGNORE, ierr)
            !写入第二个数据
             call MPI_FILE_WRITE(thefile, RR, 1,MPI_real,
     &   MPI_STATUS_IGNORE, ierr)
           !  关闭文件
           call MPI_FILE_CLOSE(thefile, ierr)

       !   ****读二进制文件testfile并存为testfile.txt---------------------------------------------------------------------------
       if (myrank==0) then
           !打开二进制文件
           Open( 12 , File = 'testfile' , Access = 'Direct' , 
     &   Form = 'Unformatted' , RecL = 2 )!recl=2表示单次可以读或写4*2个字节长度的容量
            !打开文本文件testfile.txt
           Open( 13 , File = 'testfile.txt',form='formatted')

      !    将第i模块rec=i(单个模块的长度recl=2为8个字节),对应的数据一个整型变量和一个浮点型变量
      !    读入并存储到变量IIT和RRT中
       do i = 1, numprocs
        Read( 12 , Rec = i ) IIT,RRT
        Write( * , 110 ) IIT,RRT
110  FORMAT('test  int number  = ',I,' test  real  number  = ',e15.8)
           !  将读取的文件输入到txt文件
           Write(13 , 180 ) IIT,RRT
180     FORMAT(I,e15.8)
       enddo
       close(12)
       close(13)
       end if

        call MPI_FINALIZE(ierr)

        END PROGRAM main

代码测试成功了,testfile.txt可以显示想要的结果,目前的想法是如何采用共享文件指针法完成同样的任务?,我试了好几次都没有成功  ,请高手指教,先谢谢了

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-23 12:00

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表