动态分配数组是否与Fortran的普通数组具有相同的读写速度



我使用fortran 90,我的程序在很大程度上依赖于访问数组的不同元素。所以我想知道动态分配数组的读写速度是否和普通数组一样。

我写了一个小的测试程序。它访问随机位置的数组,并计算这些位置的元素之和。这是针对正常和动态分配的数组执行的。两个数组都包含相同的数据,并且在相同的点进行访问。

对于gfortran和ifort,我找不到任何大小的数组有显著差异。

这是我用过的代码。您可以调整变量arr_size和num_loop,以调整用于平均时间的数组大小/运行次数。当前参数(阵列大小=1000万,10次平均运行(具有以下运行时间:

经典数组的平均运行时间:0.060910000280秒

动态分配阵列的平均运行时间:0.060630000010秒

第一次和第二次总和之差:0.00000E+00

program alloc_test
implicit none
! determines the size of the arrays.
integer, parameter :: arr_size = 1e7
! sets the number of averaging runs
integer :: num_loop = 10
integer, dimension(arr_size) :: access
! pre allocated array
real*8, dimension(arr_size) :: arr1
! dinamically allocated array.
real*8, dimension(:), allocatable :: arr2
integer :: t1, t2, clockrate, i, j
real*8 :: temp, tot_time, sum1, sum2
integer :: r_size
integer, dimension(:), allocatable :: rseed
!get random seed so the second test uses the same random numbers.
call random_seed(size = r_size)
allocate(rseed(r_size))
call random_seed(get = rseed)
call system_clock(count_rate = clockrate)
tot_time = 0
temp = 0
do j = 1, num_loop, 1
call random_number(arr1)
access = floor(arr1 *arr_size) + 1
call system_clock(t1)
do i = 1, arr_size, 1
temp = temp + arr1(access(i))
end do
call system_clock(t2)
tot_time = tot_time + (t2-t1) /(1.0 * clockrate)
end do
sum1 = temp
write(*,"(a,x,f15.12,x,a)") "Average elapsed time classical array:", tot_time/num_loop, "seconds"
! reset random seed:
call random_seed(put = rseed)
allocate(arr2(arr_size))
tot_time = 0
temp = 0
do j = 1, num_loop, 1
call random_number(arr2)
access = floor(arr2 *arr_size) + 1
call system_clock(t1)
do i = 1, arr_size, 1
temp = temp + arr2(access(i))
end do
call system_clock(t2)
tot_time = tot_time + (t2-t1) /(1.0 * clockrate)
end do
write(*,"(a,x,f15.12,x,a)") "Average elapsed time dynamically allocated array:", tot_time/num_loop, "seconds"
sum2 = temp
write(*, "(a, e12.5)") "Difference in the sum between first and second sum: ", sum1 - sum2
end program alloc_test

最新更新