Причина использования объявления целевой прагмы в OpenMP
Интересно, что является причиной использования declare target
директивы. Я могу просто использовать target {, data} map (to/from/tofrom ...)
для того, чтобы указать, какие переменные должны использоваться устройством. Что касается функций, является ли это обязательным для функции, вызываемой из target
регион будет объявлен в качестве цели? Предположим, у меня есть следующий код:
int data[N];
#pragma omp target
{
#pragma omp parallel for
for (int i=0; i<N; i++)
data[i] = my_function(i);
}
Обязательно ли окружать my_function()
декларация / определение с declare target
?
1 ответ
В тебе пример то data[N]
Массив будет сопоставлен с устройством в начале каждой целевой области, а не сопоставлен в конце. В программах с несколькими целевыми регионами может быть полезно отобразить data[N]
только один раз при запуске с помощью declare target
директивы.
Что касается функций, то в спецификации OpenMP 4.0 это не совсем понятно. Это говорит только:
Директива объявлять цель указывает, что переменные, функции (C, C++ и Fortran) и подпрограммы (Fortran) отображаются на устройстве.
Таким образом, он явно не запрещает вызовы нецелевых функций из целевых регионов и других целевых функций.
Но я лично считаю, что my_function
должен быть объявлен в качестве цели. Иначе, почему эта прагма (для функций) вообще была введена?