ifort -ipo标志奇怪的行为

时间:2014-04-25 03:27:12

标签: performance compiler-construction fortran flags

我有以下代码用于测试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无论使用daxpya + 3*b)都是9.3毫秒。我的猜测是循环中的天真求和允许编译器进一步优化,但-ipo标志会扰乱这种优化。 注意:我知道-ipo在这种情况下是无用的,因为它只是一个文件。

0 个答案:

没有答案