【发布时间】:2014-11-18 04:22:53
【问题描述】:
在这段代码中:
#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 如何发挥它的魔力?
【问题讨论】:
标签: c++ cuda gpgpu openacc pgi