Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 未使用所需数量的处理器_Parallel Processing_Fortran_Openmp - Fatal编程技术网

Parallel processing 未使用所需数量的处理器

Parallel processing 未使用所需数量的处理器,parallel-processing,fortran,openmp,Parallel Processing,Fortran,Openmp,我正在使用openmp并行运行以下fortran代码,但只有一个处理器在工作。我在代码中添加了一些执行例程,如OMP\u SET\u NUM\u THREADS和OMP\u GET\u NUM\u THREADS,以遵循并行处理。以下是守则的相关部分: integer a,b,omp_get_num_procs,omp_get_max_threads, & omp_get_num_threads open( unit=10 , file='threads' , status='new'

我正在使用openmp并行运行以下fortran代码,但只有一个处理器在工作。我在代码中添加了一些执行例程,如OMP\u SET\u NUM\u THREADSOMP\u GET\u NUM\u 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

就这样继续下去。它正在运行,但只使用一个处理器。有人能帮我吗?

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

integer omp_get_num_threads
或者,最好在开头添加
implicit none
,以停用隐式键入,然后包括头文件:

implicit none
include 'omp_lib.h'
编辑:

并行区域外的线程数为1是很好的,但是,在并行区域中,它实际上应该为4。您可能混合了固定格式和自由格式,前者要求在行首(第1列)使用omp指令(例如,
C$omp
),如下所示:

      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指令仅在注释位于开头时才起作用。

缺少注释的旁边

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是威胁数字。如果您的处理器有多个内核,并且您已经完全安装了编译器,那么这应该可以工作。

谢谢。最初的问题已经通过相关变量类型声明解决了,但是现在操作线程的数量是1,没有并行处理正在进行!如果OpenMP实现支持,我建议
在include上使用omp_lib
。如果您仍然有问题,可以相应地更新您的问题吗?我使用的是固定格式(使用gfortran 4.6.2编译),但它也不接受行中任何位置的C$omp$第7列之前的OMP。(我的意思是编译器在这些行上返回错误)
C$OMP
中的
C
必须位于第一列,不能位于其他任何位置。我在编译行中使用-fopenmp。使用use omp_lib会导致编译错误。我还尝试通过提示行中的export命令使用环境变量OMP_NUM_THREADS来确定处理器的数量,但结果是只使用一个处理器。如果它仍然没有运行,请查看我改进的答案。它确实有效!首先,我把它放在prog.f代码中,它返回0作为线程编号,但把它放在prog.f90中,它返回了正确的编号。我最后的程序都是f77(.f),现在我将全部改为f90。谢谢。