Intel VML与传统方法(Fortran)的性能比较

Intel VML与传统方法(Fortran)的性能比较,fortran,performance-testing,intel-mkl,Fortran,Performance Testing,Intel Mkl,由于我想在一个包含200多个子例程的现有软件中实现“英特尔MKL库”中的“英特尔VML”函数,所以我执行了一个定时比较测试。 子程序用Fortran90编写,通常使用大小为10^6的数组进行操作。 我已经使用do循环和VML函数vsmul实现了一个乘法测试代码。我还测量了do循环和VML功能的计时。 结果是VML函数比do循环慢。我不确定我的方法是否正确 所以我想对它发表一些评论。我读了其他成员的帖子,但是没有足够的信息。所以我在这里再次询问。 我已经读到英特尔MKL库更快,但在我的例子中,在改

由于我想在一个包含200多个子例程的现有软件中实现“英特尔MKL库”中的“英特尔VML”函数,所以我执行了一个定时比较测试。 子程序用Fortran90编写,通常使用大小为10^6的数组进行操作。 我已经使用do循环和VML函数vsmul实现了一个乘法测试代码。我还测量了do循环和VML功能的计时。 结果是VML函数比do循环慢。我不确定我的方法是否正确

所以我想对它发表一些评论。我读了其他成员的帖子,但是没有足够的信息。所以我在这里再次询问。 我已经读到英特尔MKL库更快,但在我的例子中,在改变200个子例程的方法之前,我需要非常确定

我的代码如下:

  PROGRAM TIME 
  IMPLICIT NONE
  INCLUDE 'mkl.fi'

  INTEGER                      :: i = 1000000, L
  REAL, DIMENSION (1000000)    :: z, y, O, a
  INTEGER                      :: t1, t2, t3, t4

  call system_clock(t1)

  call rand_ms(z,i)
  call rand_ms(y,i)

  call system_clock(t2)

  DO L=1,i
     a(L)=z(L)*y(L)
  ENDDO
!!在这里,我使用do循环来计算 ! 2个数组的乘法

  call system_clock(t3)

  call vsmul(i,z,y,O)

  call system_clock(t4)

  PRINT *, t2-t1, t3-t2, t4-t3
  END PROGRAM TIME
!!以下子程序用于生成随机数 ! 这些随机数将存储在一个数组中

subroutine rand_ms(vec,vecsiz)

  INTEGER                  :: L, vecsiz
  REAL, DIMENSION (vecsiz) :: z, vec
  INTEGER, DIMENSION (2)   :: seed = (/1,2/), k=1
  REAL                     :: num

 CALL RANDOM_SEED (PUT=seed)
  DO L = 1, vecsiz
    CALL RANDOM_NUMBER(num)
vec(L)=num  
 END DO
 end subroutine
结果如下:

t3-t2 Do环路=8秒
t4-t3 VML Function=49秒

您的问题是什么?请更仔细地阅读有关随机数的文档,并找出为什么调用random_numbervec可能比循环遍历数组元素更好。然后了解为什么不需要将数组的大小传递给子例程,数组“知道”自己的大小,如果确实需要知道,可以通过执行sizevex获得。但是在这种情况下,您的整个子例程可以替换为callrandom_seed put=[1,2];打随机电话。正如他们所说,请阅读Fortran手册。在我之前对vex Read vec和curse SO的评论中,auto-mis-correct.VML允许调整模式,无论精度高低。除此之外,可能是数组太小,但我不知道VML函数的开销。你可以试着增加它们的大小,看看会发生什么。可能存在缓存效果,请尝试在程序开始时运行vsmul,然后在稍后计时。一般来说,我建议如果您想对代码进行任何更改,您只需对性能关键的部分进行更改,并且可能会放置一个包装例程,这样您就可以轻松地在实现之间切换。您可能还对a=z*y计时感兴趣,并让编译器负责生成循环。它可能比我上一次用英特尔编译器测量时的循环版本慢了一点,但随着编译器的“升级”,这些情况会发生变化。我还尝试使用Fortran 90接口来vsmul ie use mkl_vml(如果这是模块名的话),以防编译器获得的额外信息允许它生成更快的代码。这可能不会有什么区别,但你最好检查一下。