3

我想知道使用该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

4

1 回答 1

1

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

至于功能,OpenMP 4.0 规范对此并不清楚。它只说:

declare target 指令指定将变量、函数(C、C++ 和 Fortran)和子例程 (Fortran) 映射到设备。

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

但我个人认为my_function必须声明为目标。否则为什么要引入这个编译指示(用于函数)?

于 2015-05-24T22:35:57.057 回答