我正在使用 intel fortran 编译器和 intel mkl 进行性能检查。我将一些数组部分传递给 Fortran 77 接口,调用如下
call dgemm( transa,transb,sz_s,P,P,&
a, Ts_tilde,&
sz_s,R_alpha,P,b,tr(:sz_s,:),sz_s)
显然,tr(:sz_s,:) 在内存中不是连续的,Fortran 77 接口期望一个连续的块并为此创建一个临时块。
我想知道的是,如果我在 tr 的代码中显式创建临时数组并在操作之前和之后从该临时数组中来回复制信息,是否会有所不同,或者与编译器本身创建临时数组相同从性能的角度来看?我想编译器总是会更有效率。
当然,欢迎提出更多消除这些临时文件的建议。
还有一点,如果我显然使用该库的 Fortran 95 接口,并对更简单的测试问题进行类似的调用,则不会针对创建临时对象发出警告。然后我在 mkl 手册中读到 Fortran 95 接口使用假定的形状数组,这解释了为什么不创建临时数组。
然而,在这一点上,我似乎无法使用一些支持功能,例如计时例程。
也就是说,intel mkl 有一些计时支持函数,但如果我将它们与下面的 mkl_service 例程一起使用,那么我会收到 dsecnd 的“此名称没有类型,并且必须具有显式类型”错误。也欢迎对此问题的任何想法。一个简单的例子如下
program dgemm95_test
! some modules for Fortran 95 interface
use mkl_service
use mkl95_precision
use mkl95_blas
!
implicit none
!
double precision, dimension(4,3) :: a
double precision, dimension(6,4) :: b
double precision, dimension(5,5) :: r ! result array
double precision, dimension(3,2) :: dummy_b
!
character(len=1) :: transa
character(len=1) :: transb
!
double precision :: alpha, beta, t1, t2, t
integer :: sz1, sz2
! initialize some variables
alpha = 1.0
beta = 0.0
a = 2.3
b = 4.5
r = 0.0
transa = 'n'
transb = 'n'
dummy_b = 0.0
! Fortran 95 interface
t1 = dsecnd()
call gemm( a, b(4:6,1:3:2), r(2:5,3:4),&
transa, transb, alpha, beta )
t2 = dsecnd()
!
write(*,*) r
dummy_b = r(2:4,4:5)
!
end program dgemm95_test