使用原因在OpenMP中声明目标pragma

时间:2015-05-24 15:19:36

标签: openmp offloading

我想知道使用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 个答案:

答案 0 :(得分:1)

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

至于功能,OpenMP 4.0 specification对此非常不清楚。它只说:

  

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

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

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