3

私は並列プログラミングが初めてで、単純な並列 Fortran プログラムで OpenMP で複数のスレッドを使用するのに苦労しています。次のプログラム:

   Program Hello
   Use omp_lib
   Implicit None

   INTEGER        nthreads
   nthreads = 4

   CALL OMP_SET_NUM_THREADS(nthreads)

   write(*,*) omp_get_num_procs()
   write(*,*) omp_get_max_threads()
   write(*,*) omp_get_num_threads()

   !$OMP PARALLEL
     Write(*,*) 'Hello'
     Write(*,*) omp_get_num_threads()
   !%OMP END PARALLEL

   End Program Hello

結果を生成します。

      32
       4
       1
   Hello
       1

並列領域内のスレッドの数が、上で設定した nthreads と同じではない理由は何ですか? cygwin を実行している Windows マシンで gfortran -f openmp Hello.f を使用してプログラムをコンパイルしています。

4

3 に答える 3

1

Linux で gfortran を使ってコンパイルしてみます。そして、OMP ディレクティブのためにエラーが発生します。私はそれを次のように変更しました:

!$OMP PARALLEL
Write(*,*) 'Hello'
Write(*,*) omp_get_num_threads()
!$OMP END PARALLEL

(注意!$OMP)。そして今、それは機能します。出力:

$ ./a.out 
      16
       4
       1
Hello
       4
Hello
       4
Hello
       4
Hello
       4
于 2013-04-30T20:11:56.797 に答える
0

それが問題なのかどうかはわかりませんが、OP のコードの最後のディレクティブには $ ではなく % があります。単なるタイプミスかもしれませんが、最近、そのようなばかげたタイプミスが問題を引き起こしたコードを投稿しました。

于 2015-12-11T13:42:56.857 に答える
0

センチネル、つまり!$ompor*$ompまたはは、行の先頭に単独で表示するc$omp 必要があります。それ以外の場合は、単一のスレッドを起動するだけで、文句はありません。

!$OMP PARALLEL
      Write(*,*) 'Hello'
      Write(*,*) omp_get_num_threads()
!$OMP END PARALLEL
于 2015-04-15T22:42:26.363 に答える