在此代码:外部函数使用的设备内存变量如何?
#include <iostream>
void intfun(int * variable, int value){
#pragma acc parallel present(variable[:1]) num_gangs(1) num_workers(1)
{
*variable = value;
}
}
int main(){
int var, value = 29;
#pragma acc enter data create(var) copyin(value)
intfun(&var,value);
#pragma acc exit data copyout(var) delete(value)
std::cout << var << std::endl;
}
如何int value
认为是在设备内存在intfun
?如果我在intfun
编译取代present(variable[:1])
通过present(variable[:1],value)
,我得到以下运行时错误:
FATAL ERROR: data in PRESENT clause was not found on device 1: name=_43144_33_value
file:/opt/pgi/linux86-64/14.9/include/CC/iostream intfun__FPii line:5
Present table dump for device[1]: NVIDIA Tesla GPU 1, compute capability 3.5
host:0x7fffc11faa28 device:0x2303f20200 size:4 presentcount:1 line:14 name:_43152_14_value
host:0x7fffc11faa34 device:0x2303f20000 size:4 presentcount:2 line:14 name:_43152_9_var
我不明白为什么指定value
是present
导致上述故障。我使用NVVP进行了检查,value
仅在enter data
指令中被复制一次,即它不会在intfun
的parallel
指令中再次被复制。 OpenACC如何发挥其魔力?
然后我不明白为什么在我的起源例子中,如果我省略'main'中编译指令中的'copyin(value)'和'delete(value)','value'不会复制到设备上, 。设备从哪里检索29的值?这存储在主机内存中,因此必须在某个点上将其复制到设备内存中? – lodhb 2014-09-24 19:07:36
我已经在我的回答中说过,如果你省略了任何提及'value'的东西,编译器会自动识别内核需要'value',它会自动为它生成所需的副本。只有当你指定'present'时才会覆盖这个行为,那么事情就会破裂。如果您有一个新问题,即您不明白的其他问题,它基于与问题中显示的代码不同的代码,那么您可能会提出一个新问题。 'main'中的'copyin(value)'与你的原始代码无关,你的原始代码在没有它的情况下工作得很好。 – 2014-09-24 19:20:59
我已经用NVVP验证过,在'main'中省略''copyin''的值'导致没有主机到设备的数据传输。因此,我对设备从哪里获得“价值”的价值感到困惑。 – lodhb 2014-09-24 19:26:44