未生成 OpenACC 并行内核
OpenACC parallel kernels not getting generated
我正在 PGC++ 上开发代码以图形方式加速代码。
- 我正在使用具有 Eigen 依赖性的 OpenBabel。
- 我试过使用#pragma acc kernel
- 我试过使用#pragma acc routine
- 我的编译命令是:"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 对象)的 "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
希望这对您有所帮助,
垫子
我正在 PGC++ 上开发代码以图形方式加速代码。
- 我正在使用具有 Eigen 依赖性的 OpenBabel。
- 我试过使用#pragma acc kernel
- 我试过使用#pragma acc routine
- 我的编译命令是:"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 对象)的 "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
希望这对您有所帮助, 垫子