未生成OpenACC并行内核

时间:2016-01-27 10:58:30

标签: c++ gpu openacc pgi

我正在开发一个关于PGC ++的代码,用于以图形方式加速代码。

  • 我正在使用具有Eigen依赖性的OpenBabel。
  • 我尝试过使用#pragma acc kernel
  • 我尝试过使用#pragma acc例程
  • 我的编译命令是:“pgc ++ -acc -ta = tesla -Minfo = all -I / home / pranav / new_installed / include / openbabel-2.0 / -I / home / pranav / new_installed / include / eigen3 / -L / home / pranav / new_installed / lib / openbabel / main.cpp /home/pranav/new_installed/lib/libopenbabel.so“

我收到以下错误

PGCC-S-0155-Procedures called in a compute region must have acc routine information: OpenBabel::OBMol::SetTorsion(OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, double) (main.cpp: 66)
PGCC-S-0155-Accelerator region ignored; see -Minfo messages  (main.cpp)
bondRot::two(std::vector>, OpenBabel::OBMol, int, OpenBabel::OBMol):
     11, include "bondRot.h"
           0, Accelerator region ignored
          66, Accelerator restriction: call to 'OpenBabel::OBMol::SetTorsion(OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, double)' with no acc routine information
PGCC/x86 Linux 15.10-0: compilation completed with severe errors

注:第66行是“mol.SetTorsion(a [0],a [1],a [2],a [3],i *(3.14159265358979323846 / 180));”在下面的粘贴中。

显示此错误的代码如下:

#pragma acc routine
public:bool two(vector<OBAtom *> a)
{
std::ostringstream bestanglei,bestanglej;
for(unsigned int i=0;i<=360;i=i+res)
{
    for(unsigned int j=0;j<=360;j=j+res)
    {
        mol.SetTorsion(a[0],a[1],a[2],a[3],i*(3.14159265358979323846/180));

        //cout<<i<<"\n";
    }
}
return true;
}

从google上的主要搜索,我知道这是由于mol(OBMol对象)的“后向依赖”而发生的错误。如果有人知道解决方案,请帮助我。

1 个答案:

答案 0 :(得分:0)

为了从设备代码中调用例程,它们必须是例程的可用设备版本。在这种情况下,编译器找不到“OpenBabel :: OBMol :: SetTorsion”例程。您需要在此库例程的原型和定义中添加“#pragma acc routine”指令,然后使用PGI和“-acc”编译库。 SetTorsion可能调用的任何例程也需要设备版本。

或者,您可以尝试内联这些例程。

请注意,尝试从设备代码写入I / O流和文件时会遇到问题。对无格式stdout的有限支持是可用的,其中所有线程的输出被缓冲,传输回主机,然后由OS打印。

使用STL :: Vector也会遇到问题。除了不是线程安全之外,OpenACC还不支持具有动态数据成员的聚合数据类型。如果您愿意管理结构本身中的数据,或者使用CUDA Unified Memory(-ta = tesla:managed),则有办法处理这些结构。如果您有兴趣,我在GTC2015上就此主题发表了演讲,您可以在以下网址查看:https://www.youtube.com/watch?v=rWLmZt_u5u4

希望这有帮助, 垫