【发布时间】:2020-03-31 17:18:47
【问题描述】:
我目前在 openmp 循环中调用 intel mkl 时遇到性能问题。发布简化代码后,让我更详细地解释我的问题。
program Test
use omp_lib
implicit none
double complex, allocatable :: RhoM(:,:), Rho1M(:,:)
integer :: ik, il, ij, N, M, Y
M = 20
Y = 2000000
N = 500
allocate(RhoM(M,N),Rho1M(M,N))
RhoM = (1.0d0,0.0d0)
Rho1M = (0.0d0,1.0d0)
call omp_set_num_threads(4)
do il=1,Y
Rho1M = (0.0d0,1.0d0)
!$omp parallel do private(ik)
do ik=1,N
call zaxpy(M, (1.0d0,0.0d0), RhoM(:,ik:ik), 1, Rho1M(:,ik:ik), 1)
end do
!$omp end parallel do
end do
end program Test
基本上,该程序执行就地矩阵求和。但是,它没有任何意义,它只是一个简化的代码。我正在运行 Windows 10 Pro 并使用 intel fortran 编译器(版本 19.1.0.166)。我编译:ifort -o Test.exe Test.f90 /fast /O3 /Qmkl:sequential /debug:all libiomp5md.lib /Qopenmp。由于 zaxpy 使用的“向量”并没有那么大,我尝试使用 openmp 来加速程序。我使用 intel 的 vtune 工具检查了运行时间(这就是 debug all 标志的原因)。我有一个 i5 4430,意思是 4 个线程和 4 个物理内核。
使用 openmp 的时间:107 秒; 没有openmp的时间:44s
有趣的是,随着线程数量的增加,程序变慢了。 Vtune 告诉我使用了更多线程,但是计算时间增加了。这似乎非常违反直觉。
当然,我不是第一个面临这种问题的人。我将附上一些链接并讨论为什么它对我不起作用。
英特尔提供有关如何选择参数的信息 (https://software.intel.com/en-us/articles/recommended-settings-for-calling-intel-mkl-routines-from-multi-threaded-applications)。但是,我正在与顺序英特尔 mkl 链接。如果我尝试使用并行 intel mkl 的建议参数,我仍然很慢。
打开 omp_set_nested(1) (Number of threads of Intel MKL functions inside OMP parallel regions) 似乎很重要。首先,不推荐使用此参数。当我使用 omp_set_max_active_levels() 时,我看不到任何区别。
这可能是最合适的问题(Calling multithreaded MKL in from openmp parallel region)。但是,我使用顺序 intel mkl 并且不必关心 mkl 线程。
这里的这个 (OpenMP parallelize multiple sequential loops) 说我应该尝试使用日程安排。我尝试了使用不同值的块大小的动态和静态,但是它根本没有帮助,因为每个线程必须完成的工作量完全相同。
如果您知道为什么程序会因增加线程大小而变慢,那就太好了。
如果您需要任何进一步的信息,请告诉我。
【问题讨论】:
标签: multithreading openmp intel-mkl