ошибка в программе на фортране - PullRequest
0 голосов
/ 29 февраля 2012

Это моя простая программа на фортране

program accel
    implicit none
    integer, dimension(5000) ::a,b,c
    integer i
    real t1,t2
    do i=1,5000
    a(i)=i+1
    b(i)=i+2
    end do

     call cpu_time(t1)
    do i=1,5000
    c(i)=a(i)*b(i)
    end do
     call cpu_time(t2)

    write (*,*)'Elapsed CPU time = ',t2-t1,'seconds'

end program accel

, но время процессора показывает 0,0000 сек.Зачем?

Ответы [ 3 ]

1 голос
/ 29 февраля 2012

Оптимизатор видел, что c никогда не читается, поэтому вычисление c можно пропустить.Если вы напечатаете значение c, цикл не будет оптимизирован.

1 голос
/ 01 марта 2012

Короткий ответ

Используйте это для отображения вашего ответа:

write(*,'(A,F12.10,A)')'Elapsed CPU time = ',t2-t1,' seconds.'

Более длинный ответ

Может быть по крайней мере две причины, по которым вы получаете ноль, как предлагается вответы @Ernest Friedman-Hill и @Klas Lindbäck:

  1. Вычисление занимает менее 0,00005 секунд
  2. Компилятор оптимизирует весь цикл

В первом случае у вас есть несколько вариантов:

  1. Вы можете отобразить больше цифр t2-t1, используя формат, как я дал вам выше, или вы можете распечатать результат вмиллисекунды: 1000*(t2-t1)

  2. Добавьте больше итераций: если вы делаете 50000 итераций вместо 5000, это должно занять в десять раз больше времени.

  3. Makeкаждая итерация дольше: вы можете заменить умножение на последовательность сложных операций, возможно, используя математические функции

Во втором случае вы можете:

  1. Отключить оптимизацию, передав соответствующий флагк вашему компилятору (-O0 для gfortran)

  2. Используйте c где-нибудь в вашей программе после цикла

Я скомпилировал вашу программу с помощьюGfortran 4.2.1 на OS X Lion, и он работал "из коробки" (отображение времени в экспоненциальной записи), и форматирование (короткий ответ) тоже работало нормально.Я попытался включить и отключить оптимизацию, и она тоже работала нормально.

Точность cpu_time, вероятно, зависит от платформы, поэтому может также объяснять различное поведение на разных машинах, но со всем этим вы сможете решить свою проблему.проблема.

1 голос
/ 29 февраля 2012

Выполнение 5000 умножений занимает не очень много времени - просто может потребоваться менее одной единицы разрешения cpu_time().Поверните эти 5000 до 100000 или около того, и тогда вы, вероятно, что-то увидите.

...