gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:45:49 27 4
gpt4 key购买 nike

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

或者替换为我添加的 header 中 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。您可能混合使用固定格式和自由格式,前者需要 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 指令仅在注释位于开头时才起作用。

关于parallel-processing - 未使用所需数量的处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19806817/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com