【发布时间】:2012-07-24 14:21:55
【问题描述】:
我有一个使用 Fortran 95 和 gfortran 编译器的代码。我也在使用 OpenMP,我必须处理非常大的数组。在我的代码中,我还必须使用 OpenBLAS 的求解器 DGTSV 求解线性方程组。我想并行化这个求解器以及使用应该能够做到的openblas。但我在语法上有问题。使用附加的伪代码,所有 4 个 CPU 几乎 100% 使用,但我不确定每个内核是否单独求解线性方程,或者它们是否将其拆分为多个部分并并行计算。
整个东西都是使用gfortran -fopenmp -lblas a.f95 -o a.out编译的
所以我的伪代码看起来像
program a
implicit none
integer, parameter :: N = 200
real*8, dimension(numx) :: D = 0.0
real*8, dimension(numx-1):: DL = 0.0
real*8, dimension(numx-1):: DU = 0.0
real*8, dimension(numx) :: b = 0.0
integer :: info = 0
integer :: numthread=4
...
!$OMP PARALLEL NUM_THREADS(numthread)
...
!$OMP DO
...
!$OMP END DO
CALL DGTSV(N,1,DL,D,DU,b,N,info)
!$OMP DO
...
!$OMP END DO
...
!$OMP END PARALLEL
end program a
我必须做些什么才能使求解器并行化,以便每个内核计算求解器的各个部分?
【问题讨论】:
-
每个线程都会求解整个线性方程组,重复所有其他线程的工作,即使 OpenBLAS 是在 OpenMP 支持下编译的。您需要在并行区域外调用
DGTSV,它将在子程序实现内部创建自己的并行区域。 -
酷,感谢您的快速回复。我会这样尝试。
-
您还可以将对
DGTSV的调用放入 OpenMPSINGLE构造中并启用嵌套并行。这将为您节省一小部分时间。 -
好的,谢谢!我知道这个选项。我会知道节省了多少时间。
标签: multithreading fortran openmp lapack openblas