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

我尝试用 gfortran 在 Linux 中编译它。由于 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

哨兵,即!$omp*$ompc$omp 必须单独出现在行首。它只是启动一个线程,否则不会抱怨。

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

我不知道这是否是问题所在,但 OP 代码中的最后一个指令有一个 % 而不是 $。可能只是一个错字,但我最近发布了一个像这样愚蠢的错字给我带来麻烦的代码。

于 2015-12-11T13:42:56.857 回答