我有以下代码用于测试intel mkl DAXPY例程。
program test
implicit none
integer, parameter :: n = 50000000
integer, parameter :: nloop = 100
real(8), dimension(:), allocatable :: a, b
integer start_t, end_t, rate, i
allocate(a(n))
allocate(b(n))
a = 1.0d0
b = 2.0d0
call system_clock(start_t, rate)
do i = 1, nloop
call sumArray(a, b, a, 3.0d0, n)
end do
call system_clock(end_t)
print *, sum(a)
print *, "sumArray time: ", real(end_t-start_t)/real(rate)
a = 1.0d0
b = 2.0d0
call system_clock(start_t, rate)
do i = 1, nloop
call daxpy(n, 3.0d0, b, 1, a, 1)
end do
call system_clock(end_t)
print *, sum(a)
print *, "daxpy time: ", real(end_t-start_t)/real(rate)
a = 1.0d0
b = 2.0d0
call system_clock(start_t, rate)
do i = 1, nloop
a = a + 3.0d0*b
end do
call system_clock(end_t)
print *, sum(a)
print *, "a + 3*b time: ", real(end_t-start_t)/real(rate)
end program test
subroutine sumArray(x, y, z, alfa, n)
implicit none
integer n, i
real(8) x(n), y(n), z(n), alfa
!$OMP PARALLEL DO
do i = 1, n
z(i) = x(i) + alfa*y(i)
end do
!$OMP END PARALLEL DO
end subroutine sumArray
这里,sumArray是一个手写的子程序,使用openmp执行与DAXPY类似的操作。
当我使用ifort test.f90 -o test -O3 -openmp -mkl
编译代码时,结果是(大约):
sumArray time: 5.7 sec
daxpy time: 5.7 sec
a + 3*b time: 1.9 sec
但是,当我使用ifort test.f90 -o test -O3 -openmp -mkl -ipo
进行编译时,a + 3*b
的结果会发生显着变化:
sumArray time: 5.7 sec
daxpy time: 5.7 sec
a + 3*b time: 9.3 sec
首先,为什么天真数组总和优于mkl? -ipo
与天真数组和的减速有什么关系?另外,困扰我的是当我消除循环时,也就是说,当我只对每次操作进行一次时,时间就像第一种情况除以1000(sumArray
和{{1}约5.7 ms无论使用daxpy
,a + 3*b
)都是9.3毫秒。我的猜测是循环中的天真求和允许编译器进一步优化,但-ipo
标志会扰乱这种优化。 注意:我知道-ipo
在这种情况下是无用的,因为它只是一个文件。