У меня есть код fortran90, который использует химические свойства видов (то есть молекулярный вес, вязкость и т. Д. c.) Для расчетов.
Чтобы легко менять или удалять группы химических веществ, мы храним файлы модулей которые хранят все соответствующие данные в одномерных массивах. Т.е. у нас есть 4 вида, массив вязкости - 4 элемента, по одной записи для каждого вида и т. Д.
Соответствующие подпрограммы, которым нужны эти данные, могут use
этот модуль, и химические данные доступны. при необходимости.
Мы портировали большую часть кода на разгрузку GPU с openMP 4.5 и в момент переноса по этим химическим вычислениям.
То, что я хотел бы сделать, это просто поместить весь модуль в графический процессор, чтобы любые подпрограммы, которые use
эти переменные модуля имели доступ к ним на целевом устройстве.
Мой начальный хотя было просто !$omp declare target
модуль, как мы выполняем функции или другие подпрограммы, но это, кажется, не принимается компилятором.
Действительно ли мне нужно !$omp declare target(variable_x, y,z,a,b,c......)
для всего модуля?
И если я это сделаю, то какова область действия этих переменных? Доступны ли они сейчас всем на устройстве, даже если подпрограмма не use
модуль? Или компилятор достаточно умен, чтобы держать их в рамках модуля подпрограммы, использующей их?
Наконец, есть ли что-то особенное, что нужно сделать для подпрограммы, которая use
присваивает эти модули, когда я просто создание целевых регионов в подпрограмме? Например:
subroutine test
use chem_module
implicit none
integer :: i
!$omp parallel do
do i=1,100
*do some calcs with module data
*do I need to tell the compiler about the chem_module module?
end do
!$omp end parallel do
end subroutine
Спасибо, что заглянули!