【问题标题】:Call sequential intel mkl from openmp loop从 openmp 循环调用顺序 intel mkl
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2013-01-06
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      相关资源
      最近更新 更多