我想知道使用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
包围在一起?
答案 0 :(得分:1)
在您的示例中,data[N]
数组将在每个目标区域的开头映射到设备,并在结尾处取消映射。在具有多个目标区域的程序中,使用data[N]
指令在启动时仅映射declare target
一次可能很有用。
至于功能,OpenMP 4.0 specification对此非常不清楚。它只说:
declare target指令指定将变量,函数(C,C ++和Fortran)和子例程(Fortran)映射到设备。
因此,它并没有明确禁止从目标区域和其他目标函数调用非目标函数。
但我个人认为必须将my_function
声明为目标。否则为什么要引入这个pragma(用于函数)?