在 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(用于函数)?
我想知道使用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(用于函数)?