在 OpenMP 中使用 declare target pragma 的原因

Reason to use declare target pragma in 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);
}

是否需要用declare target包围my_function()declaration/definition?

在您的示例中,data[N] 数组将在每个目标区域的开头映射到设备,并在结尾取消映射。在具有多个目标区域的程序中,使用 declare target 指令在启动时仅映射一次 data[N] 可能很有用。

至于功能,OpenMP 4.0 specification对此还不是很清楚。它只说:

The declare target directive specifies that variables, functions (C, C++ and Fortran), and subroutines (Fortran) are mapped to a device.

因此,并没有明确禁止从目标区域和其他目标函数调用非目标函数。

但我个人认为my_function必须声明为target。否则为什么要引入这个 pragma(用于函数)?