Parallel processing 未使用所需数量的处理器
我正在使用openmp并行运行以下fortran代码,但只有一个处理器在工作。我在代码中添加了一些执行例程,如OMP\u SET\u NUM\u THREADS和OMP\u GET\u NUM\u THREADS,以遵循并行处理。以下是守则的相关部分: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'
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。谢谢。