不使用所需数量的处理器

时间:2013-11-06 08:03:01

标签: parallel-processing fortran openmp

我使用openmp并行运行以下fortran代码,但只有一个处理器正在运行。我在代码中添加了一些执行例程,如 OMP_SET_NUM_THREADS OMP_GET_NUM_THREADS ,以跟进并行处理。以下是代码的相关部分:

integer a,b,omp_get_num_procs,omp_get_max_threads,
& omp_get_num_threads
open( unit=10 , file='threads' , status='new' )
a=4
call omp_set_num_threads(a)
write(10,*) 'num_proc=',omp_get_num_procs()
write(10,*) 'max_threads=',omp_get_max_threads()
write(10,*) 'num_threads=',omp_get_num_threads()

open( unit=7 , file='result' , status='new' )
!$OMP PARALLEL NUM_THREADS(4)
!$OMP DO DEFAULT(PRIVATE) Shared(rho1,rho2,Vnuc)
 do i = 1 , nx
    do j = 1 , ny
      do k = 1 , nz
         b = omp_get_num_threads()
         write(*,*) 'Hello'
         Write(10,*) 'Hello'
         Write(10,*) b
         write(10,100) omp_in_parallel()
100   format(l2)
...
    enddo
  enddo
enddo
!$OMP END DO
!$OMP END PARALLEL

或者在我添加的标题中逐个定义omp参数

include 'omp_lib.h'

以下是结果:

 num_proc=           8
 max_threads=           4
 num_threads=           1
 Hello
       1
 T
 Hello
       1
 F
 Hello
       1
 F
 Hello
       1
 F
 Hello
       1
 F

它继续这样。它正在运行,但只使用一个处理器。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

Fortran默认使用隐式类型,这意味着以(a-h,o-z)开头的未声明的变量/函数是真实的。您的解决方案是添加正确类型的运行时例程,例如:

integer omp_get_num_threads

或者更好的是,在开头添加implicit none以停用隐式类型,然后包含头文件:

implicit none
include 'omp_lib.h'

编辑:

平行区域外的线程数是1是好的,但是,在并行区域中它应该确实是4.你可能混合固定格式和自由格式,前者需要omp指令(例如C$OMP)在一行的开头(在第1列),如下:

      program test
      include 'omp_lib.h'
      write(*,*) 'num_proc =    ',omp_get_num_procs()
      write(*,*) 'max_threads = ',omp_get_max_threads()
      write(*,*) 'num_threads = ',omp_get_num_threads()
C$OMP PARALLEL DO
      do i=1,4
        write(*,*) 'num_threads = ',omp_get_num_threads()
      end do
      end

如果您使用的是自由格式,则可以在一行的任何位置使用!$OMP。棘手的是,即使在固定格式的源代码中,大多数编译器也允许!注释语句,但是当注释位于开头时,openmp指令才有效。

答案 1 :(得分:2)

缺少

旁边
use omp_lib

您是否使用OpenMP标志编译程序?如果不是,那就是gfortran,例如。

-fopenmp

编辑:这是测试问题最简单的程序:

program prog
  use omp_lib
  implicit none

  integer :: i, tnr

  call omp_set_num_threads( 4 ) !number of threats used in the parallel environment

  !$omp parallel private( i )
    !$omp do
      do i = 1, 20
        tnr = omp_get_thread_num()  ! get threat number
        write( *, * ) 'Thread', tnr, ':',  i
      end do
    !$omp end do
  !$omp end parallel
end program prog

请用例如gfortran喜欢:

gfortran -fopenmp prog.f90 -o prog

它应该打印出如下行:

 Thread           3 :          11

这里,3是威胁号码。如果您的处理器有多个内核并且您已完全安装了编译器,那么这应该可行。