未生成 OpenACC 并行内核

OpenACC parallel kernels not getting generated

我正在 PGC++ 上开发代码以图形方式加速代码。

我收到以下错误

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 对象)的 "back dependency" 而发生的错误。如果有人知道解决方案,请帮助我。

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

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

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

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

希望这对您有所帮助, 垫子