gpt4 book ai didi

c++ - 外部函数如何使用设备内存中的变量?

转载 作者:行者123 更新时间:2023-11-30 01:51:33 25 4
gpt4 key购买 nike

在这段代码中:

#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;
}

intfun 中,int value 是如何被识别到设备内存中的?如果我在 intfun pragma 中用 present(variable[:1],value) 替换 present(variable[:1]),我得到以下运行时错误:

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 会导致上述失败。我用 NVVP 检查了 value 只在 enter data 指令中复制了一次,即它没有在 parallel 指令中再次复制>intfun。 OpenACC 如何发挥其魔力?

最佳答案

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

intfun 中的

value 与您在 中执行 copyin(value)value 不同>主要。函数调用按值传递 value,这意味着它制作了 拷贝。因此将它添加到 present() 子句是没有意义的,因为它不存在 在设备上。编译器必须将它复制进来。(当你根本不提它时,编译器会自动识别它是需要的并为你复制它。)

设备上存在的项目是主要范围变量未使用 通过 intfun。为所有变量赋予相同的名称可能无助于您理解这一点。

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

$ 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
$

现在主作用域变量value在设备上了,编译器知道了,它会被intfun直接使用,并将它添加到 present 子句是合法且有效的。

关于c++ - 外部函数如何使用设备内存中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26003954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com