1

我正在 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 必须具有 acc 例程信息:OpenBabel::OBMol::SetTorsion(OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *,双)(main.cpp:66)
PGCC-S-0155-加速器区域被忽略;请参阅 -Minfo 消息 (main.cpp)
bondRot::two(std::vector>, OpenBabel::OBMol, int, OpenBabel::OBMol):
     11、包含“bondRot.h”
           0,加速器区域被忽略
          66、加速器限制:调用 'OpenBabel::OBMol::SetTorsion(OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, double)' 没有 acc 例程信息
PGCC/x86 Linux 15.10-0:编译完成但出现严重错误

注意:第 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;
}

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

4

1 回答 1

0

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

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

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

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

希望这会有所帮助,垫

于 2016-01-27T20:53:12.647 回答