1

在这段代码中:

#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?如果我在编译指示中替换present(variable[:1])为,我会收到以下运行时错误:present(variable[:1],value)intfun

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

我不明白为什么指定它valuepresent导致上述失败。我检查了value仅在指令中复制一次的NVVP enter data,即它不会parallelintfun. OpenACC 如何发挥它的魔力?

4

1 回答 1

4

您再次对自己的语法以及已经向您指出的内容感到困惑。

valueinintfunvalue您在 中所做copyin(value)的不同main。函数调用按值传递value,这意味着它会复制它。因此将其添加到present()子句中没有意义,因为它不存在于设备上。编译器必须把它复制进去。(当你根本不提它时,编译器会自动识别出它是需要的,并为你复制它。)

设备上存在的项目是main-scope 变量value,它intfun. 为所有变量赋予相同的名称可能无法帮助您理解这一点。

为了证明这一点,让我们value 通过引用而不是按值传递:

$ cat main8.cpp
#include <iostream>

void intfun(int * variable, int &value){
    #pragma acc parallel present(variable[:1],value) 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;
}
[user2@dc12 misc]$ pgcpp -acc -Minfo main8.cpp
intfun(int *, int &):
      5, Generating present(variable[:1])
         Generating present(value[:])
         Accelerator kernel generated
         Generating Tesla code
main:
     14, Generating enter data copyin(value)
         Generating enter data create(var)
     17, Generating exit data delete(value)
         Generating exit data copyout(var)
$ ./a.out
29
$

现在 main-scope 变量value在设备上,编译器知道它,它将被intfun直接使用,并且将其添加到present子句中是合法且功能性的。

于 2014-09-23T20:35:07.557 回答