Поэтому я пытаюсь использовать тесты NAS для тестирования производительности в конкретной реализации MPI. Итак, я пошел компилировать код на Фортране и наткнулся на барьер. Всякий раз, когда я ввожу эту команду для компиляции:
gfortran -O0 -Wall -I/home/stephen/trunk/include -I. -c ./TestData/common/timers.f
Я получаю эти ошибки компилятора:
Warning: mpif.h:2: Illegal pdreprocessor directive
Warning: mpif.h:3: Illegal preprocessor directive
Warning: mpif.h:4: Illegal preprocessor directive
Warning: mpif.h:5: Illegal preprocessor directive
Warning: mpif.h:6: Illegal preprocessor directive
Warning: mpif.h:7: Illegal preprocessor directive
Warning: mpif.h:8: Illegal preprocessor directive
Warning: mpif.h:9: Illegal preprocessor directive
Warning: mpif.h:12: Illegal preprocessor directive
Warning: mpif.h:13: Illegal preprocessor directive
Warning: mpif.h:14: Illegal preprocessor directive
Warning: mpif.h:2: Illegal preprocessor directive
Warning: mpif.h:3: Illegal preprocessor directive
Warning: mpif.h:4: Illegal preprocessor directive
Warning: mpif.h:5: Illegal preprocessor directive
Warning: mpif.h:6: Illegal preprocessor directive
Warning: mpif.h:7: Illegal preprocessor directive
Warning: mpif.h:8: Illegal preprocessor directive
Warning: mpif.h:9: Illegal preprocessor directive
Warning: mpif.h:12: Illegal preprocessor directive
Warning: mpif.h:13: Illegal preprocessor directive
Warning: mpif.h:14: Illegal preprocessor directive
mpif.h:1.1:
Included at ./TestData/common/timers.f:30:
/*
1
Error: Non-numeric character in statement label at (1)
mpif.h:1.2:
Included at ./TestData/common/timers.f:30:
/*
1
Error: Invalid character in name at (1)
mpif.h:1.1:
Included at ./TestData/common/timers.f:50:
/*
1
Error: Non-numeric character in statement label at (1)
mpif.h:1.2:
Included at ./TestData/common/timers.f:50:
/*
1
Error: Invalid character in name at (1)
make: *** [cg] Error 1
Вот ошибочный код timers.f (строки 30 и 50 являются строками включения):
c---------------------------------------------------------------------
c---------------------------------------------------------------------
subroutine timer_start(n)
c---------------------------------------------------------------------
c---------------------------------------------------------------------
implicit none
integer n
include 'mpif.h'
double precision start(64), elapsed(64)
common /tt/ start, elapsed
start(n) = MPI_Wtime()
return
end
c---------------------------------------------------------------------
c---------------------------------------------------------------------
subroutine timer_stop(n)
c---------------------------------------------------------------------
c---------------------------------------------------------------------
implicit none
integer n
include 'mpif.h'
double precision start(64), elapsed(64)
common /tt/ start, elapsed
double precision t, now
now = MPI_Wtime()
t = now - start(n)
elapsed(n) = elapsed(n) + t
return
end
Любые идеи? Я перепробовал всевозможные аргументы командной строки для gfortran, чтобы попытаться заставить его выполнять различные типы предварительной обработки (большинство из них были сделаны вслепую, я признаю). Странно для меня то, что компилятор ошибается с нечисловыми символами /*, которых нет нигде в моем коде, так что я совсем запутался.
Спасибо!
mpif.h
? - person Hristo Iliev   schedule 13.06.2012include mpif.h
, а неuse mpi
. mpi-f-for-fortran. - person High Performance Mark   schedule 13.06.2012include 'mpif.h'
вместоuse mpi
- person mgilson   schedule 13.06.2012include 'mpif.h'
, компилятор не будет жаловаться, и программа, скорее всего, загадочным образом выйдет из строя во время выполнения. Если используетсяuse mpi
, произойдет ошибка компиляции. Причина, по которой этот конкретный код используетinclude
, заключается в том, что он совместим с F77. - person Hristo Iliev   schedule 13.06.2012configure
не указано иное). Я согласен, что проверка аргументов огромна. У меня было несколько программ, которые не зависали таинственным образом во время выполнения (просто давали неправильные результаты) из-за ошибок, подобных той, которую вы описали выше. К счастью, компиляторы все лучше диагностируют и такого рода ошибки. Также обратите внимание, чтоinclude
также не является стандартным F77 — он не был добавлен до F90. - person mgilson   schedule 13.06.2012implicit none
также не является стандартным F77 и строчными буквами. Но многие компиляторы F77 реализовали почти стандартные расширения, которые позже нашли свое применение в стандарте F90. Я хотел сказать, что этот код предназначен для компиляции даже с более старыми компиляторами до F90. И, кстати, опусканиеierr
вmpi_init
приводит к ошибкам Open MPI 1.6 как сgfortran 4.7
, так и сifort 12.1
— довольно свежими компиляторами. Извините за не по теме. - person Hristo Iliev   schedule 13.06.2012