为什么MPI_REDUCE在编译时返回语法错误?

胡安·希门尼斯

自70年代末上大学以来,我就没有使用Fortran进行编码(那是用打孔卡!),但是现在我正在尝试学习如何将MPI与该语言结合使用。我在调用MPI_REDUCE时遇到语法错误,但我不知道为什么。我只知道我缺少一些简单的东西。

C Test program

      program pi_reduce
      include 'mpif.h'

      double precision PI25DT
      parameter (PI25DT = 3.141592535897932384662643d0)
      double precision mypi, pi, h, sum, x, f, a
      integer n, myid, numprocs, i, ierr
      f(a) = 4.d0/(1.d0 + a*a)

      call MPI_INIT(ierr)
      call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr)
      call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)
      do
        if (myid .eq. 0) then
          print *, 'Enter the number of intervals: (0 quits) '
          read(*,*) n
        endif
        call MPI_BCAST(n, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)
        if (n .le. 0) exit
        h = 1.0d0/n
        sum = 0.0d0
        do i = myid + 1, n, numprocs
          x = h * (dble(i) - 0.5d0)
          sum = sum + f(x)
        enddo
        mypi = h * sum
        call MPI_REDUCE(mypi, pi, 1, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_WORLD, ierr)
        if (myid .eq. 0) then
          print *, 'pi is ', pi, ' Error is', abs(pi-PI25DT)
        endif
      enddo
      call MPI_FINALIZE(ierr)
      end
伊恩·布什

如评论中所述,您的一行内容太长。至少如果您将警告提高到最大(使用开发代码时就应该如此),则使用gfortran可以获得更多信息

ian@eris:~/work/stack$ mpif90 --version
GNU Fortran (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ian@eris:~/work/stack$ mpif90 -O -fcheck=all -std=f2008 -Wall -Wextra long.f 
long.f:8:72:

       f(a) = 4.d0/(1.d0 + a*a)
                                                                        1
Warning: Obsolescent feature: Statement function at (1)
long.f:27:72:

         call MPI_REDUCE(mypi, pi, 1, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_WORLD, ierr)
                                                                        1
Warning: Line truncated at (1) [-Wline-truncation]
long.f:27:72:

         call MPI_REDUCE(mypi, pi, 1, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_WORLD, ierr)
                                                                        1
Error: Syntax error in argument list at (1)

我建议您移动“新”(即30年可用)的免费格式,该格式比基于传统打孔卡的格式更灵活。实际上,总的来说,这将是学习现代安全实践的绝好机会,这比您几年前使用的方法要多(我从您的口中猜出我们是一个非常相似的年份)。这是您代码的某种现代化版本

ian@eris:~/work/stack$ cat long.f90
program pi_reduce

  Use, Intrinsic :: iso_fortran_env, Only :  wp => real64
  ! Even better Use mpi_f08
  Use            :: mpi, Only : mpi_init, mpi_comm_rank, mpi_comm_size, mpi_reduce, &
       MPI_INTEGER, MPI_DOUBLE_PRECISION, MPI_COMM_WORLD, MPI_SUM

  Implicit None
  
  Real( wp ), Parameter :: PI25DT = 3.141592535897932384662643_wp

  Real( wp ) :: mypi, pi, h, sum, x
  integer    :: n, myid, numprocs, i, ierr

  call MPI_INIT(ierr)
  call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr)
  call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)
  do
     if (myid == 0) then
        print *, 'Enter the number of intervals: (0 quits) '
        read(*,*) n
     endif
     call MPI_BCAST(n, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)
     if (n .le. 0) exit
     h = 1.0_wp/n
     sum = 0.0_wp
     do i = myid + 1, n, numprocs
        x = h * ( Real( i , wp ) - 0.5_wp)
        sum = sum + f(x)
     enddo
     mypi = h * sum
     call MPI_REDUCE(mypi, pi, 1, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_WORLD, ierr)
     if (myid .eq. 0) then
        print *, 'pi is ', pi, ' Error is', abs(pi-PI25DT)
     endif
  enddo
  call MPI_FINALIZE(ierr)

Contains

  Pure Function f( a ) 

    Use, Intrinsic :: iso_fortran_env, Only :  wp => real64

    Implicit None

    Real( wp ) :: f

    Real( wp ), Intent( In ) :: a

    f = 4.0_wp / ( 1.0_wp + a * a )
    
  End Function f
  
end program pi_reduce
ian@eris:~/work/stack$ mpif90 --version
GNU Fortran (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ian@eris:~/work/stack$ mpif90 -O -fcheck=all -std=f2008 -Wall -Wextra long.f90
ian@eris:~/work/stack$ mpirun -np 8 ./a.out
 Enter the number of intervals: (0 quits) 
345435
 pi is    3.1415926535904788       Error is   1.1769254637528093E-007
 Enter the number of intervals: (0 quits) 
0
ian@eris:~/work/stack$ 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在编译时抑制语法错误

来自分类Dev

为什么我的工厂模式在编译时返回错误?

来自分类Dev

为什么在编译过程中会收到语法错误?

来自分类Dev

.SQLiteException:在“,”附近:语法错误(代码1):,在编译时:

来自分类Dev

Android SQLiteException:靠近“,”:语法错误:,在编译INSERT时

来自分类Dev

语法错误(代码1):,而在编译时:

来自分类Dev

为什么 Xcode 8.3.2 在编辑时不显示即时语法错误

来自分类Dev

为什么Android Studio允许我编译语法错误

来自分类Dev

Android-SQLite-语法错误(代码1):,而在编译时:CREATE TABLE

来自分类Dev

在“ null”附近:语法错误(代码1):,在编译时:INSERT INTO

来自分类Dev

在“ NOT”附近:语法错误:,在编译时:如果不存在,则创建虚拟表

来自分类Dev

SQLiteException:在“;”附近 语法错误(代码1):,在编译时:INSERT INTO SubjectsDB('softskill','no');

来自分类Dev

Android-SQLite-语法错误(代码1):,而在编译时:CREATE TABLE

来自分类Dev

在“ null”附近:语法错误(代码1):,在编译时:INSERT INTO

来自分类Dev

CREATE:语法错误:,而在编译时:如果存在则删除表

来自分类Dev

(在“ null”附近:语法错误(代码1):,而在编译时:INSERT INTO null

来自分类Dev

为什么我在编译时收到以下错误:

来自分类Dev

为什么我的计数返回语法错误?

来自分类Dev

为什么在返回行上出现语法错误?

来自分类Dev

为什么<!-返回未定义而不是语法错误?

来自分类Dev

为什么我的计数返回语法错误?

来自分类Dev

为什么在使用串联时出现语法错误?

来自分类Dev

为什么在group by时出现语法错误?

来自分类Dev

编译sqlite时出现语法错误

来自分类Dev

MPI_REDUCE 为 1000x1000x6 REAL 数组返回错误答案

来自分类Dev

为什么<!-不引发语法错误?

来自分类Dev

为什么“ keys ::”不是语法错误?

来自分类Dev

语法错误(-201)为什么?

来自分类Dev

为什么这是SQL语法错误?

Related 相关文章

  1. 1

    在编译时抑制语法错误

  2. 2

    为什么我的工厂模式在编译时返回错误?

  3. 3

    为什么在编译过程中会收到语法错误?

  4. 4

    .SQLiteException:在“,”附近:语法错误(代码1):,在编译时:

  5. 5

    Android SQLiteException:靠近“,”:语法错误:,在编译INSERT时

  6. 6

    语法错误(代码1):,而在编译时:

  7. 7

    为什么 Xcode 8.3.2 在编辑时不显示即时语法错误

  8. 8

    为什么Android Studio允许我编译语法错误

  9. 9

    Android-SQLite-语法错误(代码1):,而在编译时:CREATE TABLE

  10. 10

    在“ null”附近:语法错误(代码1):,在编译时:INSERT INTO

  11. 11

    在“ NOT”附近:语法错误:,在编译时:如果不存在,则创建虚拟表

  12. 12

    SQLiteException:在“;”附近 语法错误(代码1):,在编译时:INSERT INTO SubjectsDB('softskill','no');

  13. 13

    Android-SQLite-语法错误(代码1):,而在编译时:CREATE TABLE

  14. 14

    在“ null”附近:语法错误(代码1):,在编译时:INSERT INTO

  15. 15

    CREATE:语法错误:,而在编译时:如果存在则删除表

  16. 16

    (在“ null”附近:语法错误(代码1):,而在编译时:INSERT INTO null

  17. 17

    为什么我在编译时收到以下错误:

  18. 18

    为什么我的计数返回语法错误?

  19. 19

    为什么在返回行上出现语法错误?

  20. 20

    为什么<!-返回未定义而不是语法错误?

  21. 21

    为什么我的计数返回语法错误?

  22. 22

    为什么在使用串联时出现语法错误?

  23. 23

    为什么在group by时出现语法错误?

  24. 24

    编译sqlite时出现语法错误

  25. 25

    MPI_REDUCE 为 1000x1000x6 REAL 数组返回错误答案

  26. 26

    为什么<!-不引发语法错误?

  27. 27

    为什么“ keys ::”不是语法错误?

  28. 28

    语法错误(-201)为什么?

  29. 29

    为什么这是SQL语法错误?

热门标签

归档