从openmp循环调用顺序intel mkl

问题描述 投票:0回答:1

我在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的时间:44秒

有趣的是,随着线程数量的增加,程序变慢。 Vtune告诉我使用了更多线程,但是,计算时间增加了。这似乎非常违反直觉。

当然,我不是第一个面临此类问题的人。我将附加一些链接并讨论为什么它对我不起作用。

Intel提供了有关如何选择参数(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
1个回答
0
投票

似乎是openmp破坏并创建2000000次线程分裂的情况。这导致了额外的计算时间。请参阅安德鲁(https://software.intel.com/en-us/forums/intel-fortran-compiler/topic/733673)和吉姆·登普西(Jim Dempsey)的帖子。

© www.soinside.com 2019 - 2024. All rights reserved.