Причина использования объявления целевой прагмы в 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 должен быть объявлен в качестве цели. Иначе, почему эта прагма (для функций) вообще была введена?

Другие вопросы по тегам