3

そのため、特定のMPI実装でのパフォーマンステストにNASベンチマークを使用しようとしています。それで、私はFortranコードをコンパイルするために行きました、そして私は障壁にぶつかっています。このコマンドを入力してコンパイルするときはいつでも:

gfortran -O0 -Wall -I/home/stephen/trunk/include -I.  -c ./TestData/common/timers.f

これらのコンパイラエラーが発生します:

Warning: mpif.h:2: Illegal pdreprocessor directive
Warning: mpif.h:3: Illegal preprocessor directive
Warning: mpif.h:4: Illegal preprocessor directive
Warning: mpif.h:5: Illegal preprocessor directive
Warning: mpif.h:6: Illegal preprocessor directive
Warning: mpif.h:7: Illegal preprocessor directive
Warning: mpif.h:8: Illegal preprocessor directive
Warning: mpif.h:9: Illegal preprocessor directive
Warning: mpif.h:12: Illegal preprocessor directive
Warning: mpif.h:13: Illegal preprocessor directive
Warning: mpif.h:14: Illegal preprocessor directive
Warning: mpif.h:2: Illegal preprocessor directive
Warning: mpif.h:3: Illegal preprocessor directive
Warning: mpif.h:4: Illegal preprocessor directive
Warning: mpif.h:5: Illegal preprocessor directive
Warning: mpif.h:6: Illegal preprocessor directive
Warning: mpif.h:7: Illegal preprocessor directive
Warning: mpif.h:8: Illegal preprocessor directive
Warning: mpif.h:9: Illegal preprocessor directive
Warning: mpif.h:12: Illegal preprocessor directive
Warning: mpif.h:13: Illegal preprocessor directive
Warning: mpif.h:14: Illegal preprocessor directive
mpif.h:1.1:
    Included at ./TestData/common/timers.f:30:

/*
 1
Error: Non-numeric character in statement label at (1)
mpif.h:1.2:
    Included at ./TestData/common/timers.f:30:

/*
  1
Error: Invalid character in name at (1)
mpif.h:1.1:
    Included at ./TestData/common/timers.f:50:

/*
 1
Error: Non-numeric character in statement label at (1)
mpif.h:1.2:
    Included at ./TestData/common/timers.f:50:

/*
  1
Error: Invalid character in name at (1)
make: *** [cg] Error 1

エラーのあるtimers.fコードは次のとおりです(30行目と50行目はインクルード行です)。

c---------------------------------------------------------------------                                                                                                                                         
c---------------------------------------------------------------------                                                                                                                                         
      subroutine timer_start(n)
c---------------------------------------------------------------------                                                                                                                                         
c---------------------------------------------------------------------                                                                                                                                         
      implicit none
      integer n
      include 'mpif.h'
      double precision start(64), elapsed(64)
      common /tt/ start, elapsed
      start(n) = MPI_Wtime()
      return
      end
c---------------------------------------------------------------------                                                                                                                                         
c---------------------------------------------------------------------                                                                                                                                         
      subroutine timer_stop(n)
c---------------------------------------------------------------------                                                                                                                                         
c---------------------------------------------------------------------                                                                                                                                         
      implicit none
      integer n
      include 'mpif.h'
      double precision start(64), elapsed(64)
      common /tt/ start, elapsed
      double precision t, now
      now = MPI_Wtime()
      t = now - start(n)
      elapsed(n) = elapsed(n) + t
      return
      end

何か案は?私はgfortranのあらゆる種類のコマンドライン引数を試して、さまざまなタイプの前処理を実行できるようにしました(これらのほとんどは盲目的に行われたことを認めます)。私にとって奇妙なことは、コンパイラが私のコードのどこにも存在しない数字以外の文字/ *を誤っていることです。そのため、私はかなり迷っています。

ありがとう!

4

2 に答える 2

5

あなたは間違いなくこのコードを非標準的な方法でコンパイルしています。mpiを使用してf77またはf90コードをコンパイルする通常の方法は、MPIの特定のバージョンをビルドするために使用されるコンパイラーをラップアラウンドするプログラムmpif77またはmpif90を使用することです。

たとえば、私のラップトップ(gfortran / gccでコンパイルされたOpenMPIを使用)では、コマンドmpif77はおおよそ次のようになります。

gfortran -I/usr/local/include -L/usr/local/lib -lmpi_f77 -lmpi -lopen-rte -lopen-pal -lutil

(この情報は次の方法で入手しましたmpif90 -showme-そのコマンドラインオプションがMPI標準の一部であるかどうかわからないため、機能しない可能性があります)。

あなたのコードをコンパイルするために、私はこのようなことを試みます:

mpif77 -O0 -Wall -c ./TestData/common/timers.f -o timers.o

インクルードするファイルは他にないため、追加-Iのフラグを使用してコンパイラのインクルードパスを増やすことは実際には意味がありません。誤って間違ったヘッダーファイルを見つける可能性を高めるだけです;)。

おそらく、現在のディレクトリまたは/ home / stephen / trunk / includeのいずれかにファイル「mpif.h」があり、選択されるべきではないときに選択されます。(Cコメントの先頭であるためCヘッダーが表示されているように見えますが/*、acヘッダーファイルが「mpif.h」と呼ばれる理由はわかりません)。

于 2012-06-12T20:30:03.233 に答える
0

適切なライブラリにリンクするには、mpif77またはmpif90を使用する必要があることに同意します。gfortranがプリプロセッサマクロを好まない場合は、-cppコンパイラオプションを試してください。

于 2012-06-12T21:14:18.173 に答える