random_number 子例程 运行 时间比较 ifort 与 gfortran
random_number subroutine run time comparison ifort vs gfortran
我写了这段代码:
program random
implicit none
integer :: i, j, limit
real(8) :: r, max_val
real(8) :: start, finish
max_val = 0.d0
limit = 10000
call CPU_TIME(start)
do i=1, limit
do j=1, limit
call random_number(r)
max_val = max(max_val, r)
end do
end do
call CPU_TIME(finish)
print *, max_val
print '("Time = ",f6.3," seconds.")',finish-start
end program random
并且我在 CentOS Linux 7 上使用 gfortran 10.1.0 和 ifort 19.1.3.304 编译它:
ifort *.f90 -O3 -no-vec -o intel.out
gfortran *.f90 -O3 -fno-tree-vectorize -o gnu.out
输出为:
gnu:
0.9999999155521957
Time = 0.928 seconds.
英特尔:
0.999999968800691 (same for every run btw)
Time = 1.989 seconds.
我运行几次的时候,每次运行的时间都差不多
为什么 gfortran 比 ifort 快,我怎样才能让 ifort 运行 和 gfortran 一样快?
不同的编译器都有自己的库,其中包含其内部函数和子例程的实现。它们的性能会有所不同,结果也可能会有所不同。 Gfortran 将 GLIBC 库用于许多通用内在函数,将 libgfortran 库用于许多 Fortran-spific 函数。英特尔编译器自带运行时库套件。
值得注意的是, 关于用于 random_number()
的伪随机生成器的质量。即使是这样,代码中的实际实现也可能始终不同,因此实际性能也可能不同。
有许多可用的外部伪随机数生成器库。有的快,有的慢。有些更健壮,有些无法通过某些随机性测试。 (有时这很重要,有时却没有)。有些在一次调用中给出更多的随机位,有些在一次调用中给出较少的随机位。如果您需要所有编译器中生成器的某些特定属性,您最好使用外部库。
我写了这段代码:
program random
implicit none
integer :: i, j, limit
real(8) :: r, max_val
real(8) :: start, finish
max_val = 0.d0
limit = 10000
call CPU_TIME(start)
do i=1, limit
do j=1, limit
call random_number(r)
max_val = max(max_val, r)
end do
end do
call CPU_TIME(finish)
print *, max_val
print '("Time = ",f6.3," seconds.")',finish-start
end program random
并且我在 CentOS Linux 7 上使用 gfortran 10.1.0 和 ifort 19.1.3.304 编译它:
ifort *.f90 -O3 -no-vec -o intel.out
gfortran *.f90 -O3 -fno-tree-vectorize -o gnu.out
输出为:
gnu:
0.9999999155521957
Time = 0.928 seconds.
英特尔:
0.999999968800691 (same for every run btw)
Time = 1.989 seconds.
我运行几次的时候,每次运行的时间都差不多
为什么 gfortran 比 ifort 快,我怎样才能让 ifort 运行 和 gfortran 一样快?
不同的编译器都有自己的库,其中包含其内部函数和子例程的实现。它们的性能会有所不同,结果也可能会有所不同。 Gfortran 将 GLIBC 库用于许多通用内在函数,将 libgfortran 库用于许多 Fortran-spific 函数。英特尔编译器自带运行时库套件。
值得注意的是,random_number()
的伪随机生成器的质量。即使是这样,代码中的实际实现也可能始终不同,因此实际性能也可能不同。
有许多可用的外部伪随机数生成器库。有的快,有的慢。有些更健壮,有些无法通过某些随机性测试。 (有时这很重要,有时却没有)。有些在一次调用中给出更多的随机位,有些在一次调用中给出较少的随机位。如果您需要所有编译器中生成器的某些特定属性,您最好使用外部库。