Реализация get_walltime в Фортране - PullRequest
0 голосов
/ 29 декабря 2018

Я пишу программу на Фортране, основанную на первом упражнении в этой книге (стр. 34).Книга разработана как введение в высокопроизводительные вычисления.Первое упражнение просит пользователя написать код для оценки числа пи.Следуя указаниям авторов, я сделал это успешно.

program compute_pi
   double precision :: x, delta_x, sum
   !double precision :: S,E,MFLOPS
    integer, parameter :: SLICES=10000000
    sum = 0.d0 ; delta_x = 1.d0/SLICES
    !call get_walltime(S)
    do i=0,SLICES-1
        x = (i+0.5)*delta_x
        sum = sum + 4.d0 / (1.d0 + x*x)
    enddo
    pi = sum*delta_x 
    print *, pi
    !call get_walltime(E)
    !MFLOPS = R*N*2.d0/((E-S)*1.d6)
end program compute_pi

Далее я пытаюсь вычислить производительность в МФлопс / сек.Чтобы сделать это, я последовал примеру автора на странице 5 и написал

program compute_pi
   double precision :: x, delta_x, sum
   double precision :: S,E,MFLOPS
    integer, parameter :: SLICES=10000000
    sum = 0.d0 ; delta_x = 1.d0/SLICES
    call get_walltime(S)
    do i=0,SLICES-1
        x = (i+0.5)*delta_x
        sum = sum + 4.d0 / (1.d0 + x*x)
    enddo
    pi = sum*delta_x 
    print *, pi
    call get_walltime(E)
    MFLOPS = R*N*2.d0/((E-S)*1.d6)
end program compute_pi

Когда я запускаю приведенный выше код в Netbeans (IDE, которую я использую для Fortran), он возвращает

undefined reference to `get_walltime_'

Я не уверен, почему ссылка не определена.

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

get_wallclock() в этом упражнении - это вызов C-кода, который вычисляет время на настенных часах, используя gettimeofday() из <sys/time.h>.Перейдите на страницу 6 этой же книги, чтобы узнать, как реализовать эту функцию.Затем скомпилируйте ваш C-код с флагом -c, чтобы получить объектный файл, например, get_wallclock.o.Затем свяжите вашу основную программу на Фортране с объектным файлом.Таким образом, компоновщик может разрешить get_walltime().

0 голосов
/ 30 декабря 2018

Вот чистая реализация get_walltime на Фортране (только для тестирования на компиляцию):

subroutine get_walltime(wctime)
  use iso_fortran_env, only: int64
  implicit none
  integer, parameter :: dp = kind(1.0d0)
  real(dp) :: wctime
  integer(int64) :: r, c
  call system_clock(c, r)
  wctime = real(c, dp) / r
end subroutine get_walltime

Еще лучше, поместите его в модуль, чтобы бесплатно получить проверку интерфейса.Или даже лучше, просто позвоните system_clock напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...