我正在开发一个关于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对象)的“后向依赖”而发生的错误。如果有人知道解决方案,请帮助我。
答案 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
希望这有帮助, 垫