我使用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
它继续这样。它正在运行,但只使用一个处理器。任何人都可以帮助我吗?
答案 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是威胁号码。如果您的处理器有多个内核并且您已完全安装了编译器,那么这应该可行。