Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > [Tools] Использование OpenMP в Fortran


Автор: OlikFleur 25.1.2011, 19:28
Здравствуйте!

Пытаюсь подключить заголовочный файл для распараллеливания вычислений по потокам. Пыталась подключать omp_lib.f. Вот код, с помощью которого я подключаю заголовочный файл:

Код

#ifdef _OPENMP 
   include 'omp_lib.f'  !needed for OMP_GET_NUM_THREADS()
#endif


В ответ компилятор выдает ошибки:

Код

1>D:\Console3\Console3\Source1.F90(3): warning #5117: Bad # preprocessor line
1>C:\Program Files\Intel\Compiler\11.0\074\fortran\include\omp_lib.f(35): error #6218: This statement is positioned incorrectly and/or has syntax errors.
1>C:\Program Files\Intel\Compiler\11.0\074\fortran\include\omp_lib.f(62): error #6790: This is an invalid statement; an END [PROGRAM]  statement is required.
1>C:\Program Files\Intel\Compiler\11.0\074\fortran\include\omp_lib.f(62): error #6785: This name does not match the unit name.   [OMP_LIB_KINDS]
1>D:\Console3\Console3\Source1.F90(5): warning #5117: Bad # preprocessor line


Пишу на Fortran под Visual Studio 2005 с использованием компилятора Intel Visual Fortran Compiler 11.0.074.


Подскажите, пожалуйста, почему компилятор ругается на стандартную библиотеку и как с этим справиться?

Заранее спасибо!

Автор: FCM 25.1.2011, 21:52
По умолчанию в Фортране "Сишные" препроцессорные #-директивы могут не обрабатываться.
(Для этого в Intel надо использовать fpp-препроцессор)

Можно попробовать так

!DEC$ IF DEFINED ( _OPENMP )
   INCLUDE 'omp_lib.h'
!DEC$ ENDIF

Еще можно попробовать вместо INCLUDE ...  
USE OMP_LIB

( возможно для OPENMP необходима опция компилятора - что-нибудь типа  /Qopenmp)


Автор: OlikFleur 26.1.2011, 19:12
Спасибо, FCM!

Сделала так:

Код

!DEC$ IF DEFINED ( _OPENMP )
   include 'omp_lib.f'  !needed for OMP_GET_NUM_THREADS()
!DEC$ endif


Теперь  omp_lib вроде бы подключается, но все равно не воспринимает функции этой библиотеки:

Код

1>Source1.obj : error LNK2019: unresolved external symbol _OMP_GET_THREAD_NUM referenced in function _MAIN__
1>Source1.obj : error LNK2019: unresolved external symbol _OMP_GET_NUM_THREADS referenced in function _MAIN__

Автор: FCM 27.1.2011, 08:32
1) Должно быть omp_lib.h, а не omp_lib.f.
(а лучше просто USE OMP_LIB)

2) Нужно зайти в свойства проекта и во вкладке Fortran/Language 
и в пункте Process OpenMP Directives выставить Generate Parallel Code
(что соответствует ранее упомянутой опции компиялтора /Qopenmp )

Автор: OlikFleur 27.1.2011, 11:37
FCM, спасибо, теперь все работает!

Автор: FCM 22.2.2011, 10:39
PS
При использовании OpenMP в Фортране два символа !$ заменяют условную (т.е. при условии определенности макроса _OPENMP) компиляцию . Например,
Код

...
!$  USE OMP_LIB
...
!$  WRITE(*,*)  OMP_GET_NUM_PROCS()
... 


Автор: OlikFleur 28.2.2011, 23:51
Большое спасибо! Очень полезное замечание!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)