Um problema de sincronização fortran que não consigo entender
Escrevi (para minha aula de Métodos Numéricos para Física Teórica) um programa muito simples para uma Caminhada Aleatória na dimensão 2. Aqui está:
program random_walk
implicit none
integer, parameter :: Nwalker = 1000000
integer, parameter :: Nstep = 100
integer, parameter :: Nmeas = 10
integer :: posx, posy, move
integer :: is, im, iw
real :: start_time, stop_time
double precision, dimension(Nmeas) :: dist, r2
real :: rnd
do im = 1, Nmeas
dist(im) = im*Nstep
r2(im) = 0.0
end do
call cpu_time(start_time)
do iw = 1, Nwalker
posx = 0
posy = 0
do im = 1, Nmeas
do is = 1, Nstep
call random_number(rnd)
move = 4*rnd
if (move == 0) posx = posx + 1
if (move == 1) posy = posy + 1
if (move == 2) posx = posx - 1
if (move == 3) posy = posy - 1
end do
r2(im) = r2(im) + posx**2 + posy**2
end do
end do
r2 = r2 / Nwalker
call cpu_time(stop_time)
do im = 1, Nmeas
print '(f8.6, " ", f8.6)', log(dist(im)), log(r2(im))
end do
print '("Time = ", f6.3, " seconds")', stop_time - start_time
end program
No final, ele deve imprimir 10 linhas e 2 colunas: a primeira coluna é o logaritmo de "tempo" (número de etapas), a segunda coluna é o logaritmo da distância quadrática média da origem. A segunda coluna "em média" deve ser igual à primeira. Até agora tudo bem, o programa está funcionando bem, os resultados são muito razoáveis. Mas aqui está o problema; no meu macbookpro (Intel Core i7 a 2,7 GHz, compilador gfortran 7.1.0, otimização -O2), leva em média mais de 20 segundos para ser executado. Mas se eu comentar essas linhas:
! do im = 1, Nmeas
! print '(f8.6, " ", f8.6)', log(dist(im)), log(r2(im))
! end do
que estão além da computação "stop_time", o resultado é que o tempo de execução é ... inferior a 6 segundos !?
Como isso é possível?