【问题标题】:Using OpenACC to set the value of a variable in device memory使用 OpenACC 设置设备内存中变量的值
【发布时间】:2014-09-23 06:17:39
【问题描述】:

为什么下面的代码不允许我通过函数intfunvar设置为10

#include <iostream>

void intfun(int * variable){
    #pragma acc parallel deviceptr(variable) num_gangs(1) num_workers(1)
    {
        *variable = 10;
    }
}

int main(){
    int var;

    #pragma acc enter data create(var)
    #pragma acc host_data use_device(var)
    {
        intfun(&var);
    }
    #pragma acc exit data copyout(var)

    std::cout << var << std::endl;
}

编译:

pgcpp -acc main.cpp

执行:

PGCC-S-0155-Compiler failed to translate accelerator region (see -Minfo messages): Unknown variable reference (main.cpp: 5)
PGCC/x86 Linux 14.9-0: compilation completed with severe errors

如何获取intfun在设备上设置参数int var的值?

【问题讨论】:

  • 去掉所有花哨的 OpenACC pragma 并问自己一个问题“intfun 如何在调用者的范围内修改 value 传递的参数”。希望你能得到它不能得到的答案。没有编译器魔法和编译指示可以改变这一点......
  • 确实,请看我编辑的帖子。

标签: c++ cuda openacc pgi


【解决方案1】:

您没有向编译器提供足够的信息来确定*variableintfun 中的使用范围。

以下似乎工作正常:

$ cat main7.cpp
#include <iostream>

void intfun(int * variable){
    #pragma acc parallel copy(variable[:1])
    {
        *variable = 10;
    }
}

int main(){
    int var;

        intfun(&var);

    std::cout << var << std::endl;
}
$ pgcpp -acc -Minfo main7.cpp
intfun(int *):
      5, Generating copy(variable[:1])
         Accelerator kernel generated
         Generating Tesla code
$ ./a.out
10
$

我有copy(variable[:1])copyout(variable[:1]) 也可以,对于这个特定的例子。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-07-17
  • 2021-01-22
  • 2012-02-03
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多