1

グローバル変数宣言用に定義されたモジュール 'gvars' があります。integer :: nthreads, max_threads, tid, omp_get_max_threads, omp_get_num_threads, omp_get_thread_numgvars モジュール内で定義する とmaxthreads = omp_get_max_threads()、メイン ルーチンの呼び出しでコンパイル時に次のエラーが発生します。

maxthreads = omp_get_max_threads()
1
Error: Unclassifiable statement at (1)

integer ::しかし、メインルーチン内に上記の定義を含めると、問題なくコンパイルされ、目的の結果が得られます。nthreads = -1gvarsモジュール内で定義するところまで行っても、メインルーチンで正しい値を出力できるので、それが含まれて正しく定義されていることがわかります。何らかの理由でそれをopenmp 関数からの戻り値。

これはなぜでしょう?

これらの値をグローバル変数として保持し、モジュールではなくメインルーチンで定義する他の方法はありますか?

問題があれば、gfortran を使用してコンパイルしています

4

2 に答える 2

1

問題は の宣言ではなくmaxthreads、同じ行の の宣言にありomp_get_max_threadsます。haraldkl が示したようuse omp_libに、代わりに、これらの関数の宣言に自動的にアクセスする必要があります。

(何らかの理由でそのようにしたくない場合は、ステートメントexternal :: omp_get_max_threads, ...をモジュールに追加することもできます。)

于 2012-02-19T21:57:30.233 に答える
0

本当の答えではありませんが、ここにコードを入れる方法が他にわかりません。ごめん...

 module gvars
   integer :: maxthreads
 end module gvars

 program test
  use gvars
  use omp_lib

  implicit none

  maxthreads = omp_get_max_threads()
 end program test

コンパイル: gfortran -fopenmp test.f90

gfotran -v が与える場所: gcc バージョン 4.4.5 (GCC)

于 2012-02-18T23:06:48.220 に答える